[
  {
    "path": ".eslintrc",
    "content": "{\n  \"parser\": \"@typescript-eslint/parser\",\n  \"extends\": [\n    \"plugin:@typescript-eslint/recommended\", // Uses the recommended rules from the @typescript-eslint/eslint-plugin\n    \"prettier/@typescript-eslint\", // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier\n    \"plugin:prettier/recommended\" // Enables eslint-plugin-prettier and eslint-config-prettier. This will display prettier errors as ESLint errors. Make sure this is always the last configuration in the extends array.],\n  ],\n  \"parserOptions\": {\n    \"ecmaVersion\": 2018,\n    \"sourceType\": \"module\"\n  },\n  \"plugins\": [\"prettier\"],\n  \"env\": {\n    \"browser\": true\n  }\n}\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\nWir danken Ihnen für Ihre Hilfe.\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]\npatreon: # Replace with a single Patreon username\nopen_collective: # Replace with a single Open Collective username\nko_fi: # Replace with a single Ko-fi username\ntidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\nliberapay: # Replace with a single Liberapay username\nissuehunt: # Replace with a single IssueHunt username\notechie: # Replace with a single Otechie username\nlfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry\ncustom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']\n"
  },
  {
    "path": ".github/workflows/intro.yml",
    "content": "# Dieser Workflow führt Tests mit node aus und veröffentlicht dann ein Paket in GitHub Packages, wenn eine Version erstellt wird\n# luege https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages\n\nname: Node.js Package\n\non:\n  release:\n    types: [created]\n\njobs:\n  publish-npm:\n    needs: build\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n      - uses: actions/setup-node@v1\n        with:\n          node-version: 12\n          registry-url: https://registry.npmjs.org/\n      - run: yarn install\n      - run: yarn build\n      - run: yarn publish\n        env:\n          NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}\n\n  publish-gpr:\n    needs: build\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n      - uses: actions/setup-node@v1\n        with:\n          node-version: 12\n          registry-url: https://npm.pkg.github.com/\n      - run: yarn install\n      - run: yarn build\n      - run: yarn publish\n        env:\n          NODE_AUTH_TOKEN: ${{secrets.GH_PKG_TOKEN}}\n"
  },
  {
    "path": ".gitignore",
    "content": "node_modules/\nyarn-error.log\n"
  },
  {
    "path": ".prettier",
    "content": "{\n  \"semi\": true,\n  \"trailingComma\": \"all\",\n  \"singleQuote\": false,\n  \"printWidth\": 120,\n  \"tabWidth\": 2\n}\n"
  },
  {
    "path": "Cloud/Speech-to-text/README.md",
    "content": "# Step 1: Choose [Awesome-Swiss-German Project](https://cloud.google.com/speech-to-text)\n\n# Step 2: Enable the Speech-to-Text API\n\nYou'll be using the Speech-to-Text API in this project. Enable it by clicking Enable APIs:\nUnable to enable required APIs\n\n    speech.googleapis.com \n\nWhen you see a green checkmark next to all of the APIs listed above, click Next.\n\n # Step 3:Open Cloud Shell\n\nCloud Shell is a built-in command-line tool for the console. In this tutorial, you use Cloud Shell to deploy your app.\n\nOpen Cloud Shell by clicking\n\nActivate Cloud Shell.\n\n\n# Step 4: Create an application\n\n    To create a new Python application, run the following command:\n\n` mkdir speech-to-text-python && \\\n    touch \\\n    speech-to-text-python/app.py\n\n`\nTo set the speech-to-text-python directory as your Cloud Shell workspace and open the Cloud Shell Editor, run the following command:\ncd speech-to-text-python\ncloudshell open-workspace .\n\nTo set your project ID in the Cloud Shell terminal, run the following command:\n\n    export PROJECT_ID=<PROJECT-ID>\n\nTo learn how to authenticate requests to this API, click Next.\n\n# Step 5 :\n\nSet up authentication\n\nTo call the Speech-to-Text API, your application needs to authenticate its identity to the Speech-to-Text service and obtain authorization to perform tasks.\n\n    Create a service account to authenticate your API requests:\n\ngcloud iam service-accounts create \\\n    speech-to-text-quickstart \\\n    --project <PROJECT-ID>\n\nGrant your service account the Speech-to-Text API User role:\ngcloud projects \\\n    add-iam-policy-binding \\\n    <PROJECT-ID> --member \\\n    serviceAccount:speech-to-text-quickstart@<PROJECT-ID>.iam.gserviceaccount.com \\\n    --role roles/speech.serviceAgent\n\nCreate a service account key:\n\n    gcloud iam service-accounts keys \\\n        create speech-to-text-key.json \\\n        --iam-account \\\n        speech-to-text-quickstart@<PROJECT-ID>.iam.gserviceaccount.com\n\n    Set the key as your default credentials:\n\nexport \\\n    GOOGLE_APPLICATION_CREDENTIALS=speech-to-text-key.json\n\nTo learn how to call the Speech-to-Text API, click Next.\n      \n      Call the Speech-to-Text API\n\n    Open `app.py` in the [Cloud Shell Editor](https://cloud.google.com/shell/docs/editor-overview?hl=en-GB)\n\nin the Cloud Shell Editor by running the following command in your terminal:\n` cloudshell open app.py`\n\nInstall the Speech-to-Text client library:\n` pip3 install --upgrade \\\n    google-cloud-speech`\n\nIn `app.py`, import the Speech-to-Text client library at the beginning of the file:\nfrom google.cloud import speech\n\nCreate a Speech-to-Text API client and add a variable that points to the path of the example audio file provided:\n` # Instantiates a client\nclient = speech.SpeechClient()\n\n# The name of the audio file to transcribe\ngcs_uri = \"gs://cloud-samples-data/speech/brooklyn_bridge.raw\" `\n\nAdd the following code, which transcribes your audio file using the specified configuration, then prints the transcription:\n` def transcribe_speech():\n  audio = speech.RecognitionAudio(uri=gcs_uri)\n\n  config = speech.RecognitionConfig(\n      encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16,\n      sample_rate_hertz=16000,\n      language_code=\"en-US\",\n  )\n\n  # Detects speech in the audio file\n  response = client.recognize(config=config, audio=audio)\n\n  for result in response.results:\n    print(\"Transcript: {}\".format(result.alternatives[0].transcript)) `\n\nAt the end of your app.py file, call transcribeSpeech():\n` transcribe_speech() `\n\nFrom your terminal, run your application.\n\n `   python3 app.py `\n\nYou should now see the transcribed message in your terminal:\n\n` Transcript: Wie alt isch die ETH Zurich. `\n\nTo avoid incurring charges to your account and learn about next steps, click Next.\n      \n# Step 7:  Clean up\n\nDelete the file containing your service account key.\n` rm speech-to-text-key.json `\nIf you created a project specifically for this tutorial, you can delete it on the Google Cloud console Projects page. \n"
  },
  {
    "path": "Datensätze/Bern/Sandkeusch.py",
    "content": "Damals bin ich jede Tag ist Studio Gange,\nGfange i dem Bunker Homie immer wenn ich schriibe\nChömet die Erinnerige zrugg\nIch weiss no ganz genau die ganzi Nacht, han immer welle blibe\nAm nächsten Tag go schaffe han immer verschlafe de Chef mich am hasse mer hend emmer müesse striite\nDoch han d Lehr bestande wärs nach mim Lehrer gange wär ich scho eher gange doch ich han grisse\nTrotzdem ben ich denn weg gange\nMin Weg gange\nIm Weg gstande send alli\nDoch han sie denn weggschlage\nWie Ali, bechunnsch Herzrase vo Panik\nIf ich em Benz fahr dur de Abig\nNenn mich Xen Abi, mini Erfahrige zeigt\nDu machsch ja gern Party und du lengsch alli in scheiss\nMet dem wo t' hengsch amigs\nZu dem wirsch Schlicht Homie\nWell du Wiis ziehsch Homie\nBesch de lieblings Homie du weisch\nIch vermisse das Sandchaste-Lebe\nSorgefrei da mit de Kids vom Nachbar am Henge\nAlles schiint guet doch es cha sich schlagartig wende\nWien Schlag idie Fressi\nMit 6i echo ahfange merke\n13i ganz Tag am schwänze\nSie Herr Lehrernei es esch ned anstrengend zlerne\nDoch ich han ahfange Rappe\nD Jugend lebt nachem Yolo Motto bis sie met 18i sterbe\nHoff dass sie nur vo mim Sound abhängig werdend\nMal unabhängig werdet\nAnstatt nur unahständig umehenget\nStändig einheitlich\nIch ha das lebe so satt\nNassdoch no chli lebe be lang nonig satt\nIch muess ja fast glaube was am mäntig und ziistig bis am friitig i de ziitig so staht, drum fick uf de Staat!\n"
  },
  {
    "path": "Docs/Sound/sound.ogg",
    "content": "\n"
  },
  {
    "path": "Geschichte/EIDGENOSSENSCHAFT.md",
    "content": "Im Mittelalter schufen sich die verschiedenen Territorien, die oft auch zusammen arbeiteten, langsam, aber stetig mehr Freiraum von den imperialen Herrschern, deren Untertanen sie nominell lange waren.\n\nDie Geschichte der Schweiz wurde stark geprägt von der Reformation und den darauf folgenden Kämpfen und Kriegen zwischen Katholiken und Protestanten.\n\nGegen Ende des 18. Jahrhunderts besetzte das revolutionäre Frankreich die Schweiz und errichtete die Helvetische Republik, einen zentralistischen Staat nach französischem Vorbild. Bald brachen innere Kämpfe aus, französische Truppen kamen erneut in die Schweiz.\n\n"
  },
  {
    "path": "Geschichte/geschichte.md",
    "content": "Vorläufer der modernen Schweiz waren die seit dem Ende des 13. Jahrhunderts als lockerer Bund organisierte Alte Eidgenossenschaft, die von 1798 bis 1803 bestehende zentralistisch aufgebaute Helvetische Republik sowie die 1803 gegründete und 1815 neu organisierte «Schweizerische Eidgenossenschaft».\n"
  },
  {
    "path": "Gewaltenteilung/Gewaltenteilung_Im_Rechtsstaat.md",
    "content": "Der Staat ist in drei Bereiche aufgeteilt: Parlament, Regierung und Gericht. Für jeden\nBereich gibt es auf den Ebenen Bund, Kantone und Gemeinden voneinander getrennte\nInstitutionen (Staatsorgane). Gerichte gibt es zusätzlich auf der Ebene Bezirk.\n\n# Das Parlament (Legislative)\nGesetze erlassen (- Seite\n13), Regierung und\nVerwaltung kontrollieren\n\n# Die Regierung (Exekutive)\nGesetze ausführen, re-\ngieren, verwalten, den\nStaat in der Innen- und\nAussenpolitik vertreten\n\n# Das Gericht (Judikative, Justiz)\nUrteilen, richten, strafen, schützen\n\nDie Gewaltenteilung auf den Ebenen Bund, Kantone, Gemeinden\n\n# Der Bund\n# Die Schweiz\nBundesversammlung\nBundesrat\nNationalrat: 200 Mitglieder\n7 Mitglieder\nStänderat: 46 Mitglieder\n(Wahl durch die Vereinigte\n(Wahl durch Stimmberechtigte) Bundesversammlung)\nBundesgericht\n41 Mitglieder (Anzahl variierend)\n(Wahl durch die Vereinigte\nBundesversammlung)\n\n# Der Kanton\nDer Stand\nKantonsrat, Grosser Rat\noder Landrat\n(von den Stimmberechtigten\ndes Kantons gewählt)\nRegierungsrat oder\nStaatsrat\n(von den Stimmberechtigten\ndes Kantons gewählt)\nKantonsgericht oder\nObergericht\n(vom Kantonsrat, Grossen Rat,\nLandrat gewählt)\n\n# Die Gemeinde\\ Die Stadt\nGemeinde- oder\nGemeinderat oder\nStadtparlament\nStadtrat\n(Wahl durch Stimmberechtigte\nWahl durch Stimmberechtigte\nder Gemeinde/Stadt)\nder Gemeinde/Stadt)\nGemeinde- oder\nBürgerversammlung\n(Stimmberechtigte der Gemeinde)\nKantonsgericht oder Obergericht\n(vom Kantonsrat, Grossen Rat,\nLandrat gewählt)\n\n# Bezirk: Amtsgericht,\nBezirksgericht, Kreisgericht\n(Wahl durch Stimmberechtigte\ndes Bezirks/Kreises)\nGemeinde: Vermittler/in,\nFriedensrichter/in\n(Wahl durch Stimmberechtigte\nder Gemeinde/Stadt)\n"
  },
  {
    "path": "Install",
    "content": "conda create -n nlp_lss python=3.8\nconda activate nlp_lss\n\npip install spacy==3.2.2\npip install pandas==1.4.1\npip install tqdm==4.62.3\npip install gensim==4.1.2\npip install beautifulsoup4==4.10.0\npip install googletrans==3.0.0\npip install matplotlib==3.5.1\npip install spacytextblob\npip install lxml==4.8.0\npip install transformers[torch]\npip install unidecode==2.8\npip install seaborn==0.11.2\npip install sklearn==0.24.1\npip install wordcloud==1.8.1\npip install fightin-words==1.0.5\npip install eli5==0.11.0\npip install flair==0.7.0\npip install tensorflow==2.4.1\npip install keras==2.4.3\npip install sentencepiece==0.1.91\npip install scikit-learn-extra==0.1.0b2\npip install pyldavis==3.2.2\npip install hdbscan==0.8.27\npip install pydot\n\n# spacy\npython -m spacy download en_core_web_sm\n\n# nltk\npip install nltk\npython -c \"import nltk; nltk.download('wordnet')\"\npython -c \"import nltk; nltk.download('stopwords')\"\npython -c \"import nltk; nltk.download('vader_lexicon')\"\n\n# install jupyter notebook\nconda install -c conda-forge jupyterlab\n\n\nsudo apt install graphviz\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2022 Esther Hoeun Yu \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": "Lied/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Runtime data\npids\n*.pid\n*.seed\n*.pid.lock\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage directory used by tools like istanbul\ncoverage\n\n# nyc test coverage\n.nyc_output\n\n# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)\n.grunt\n\n# Bower dependency directory (https://bower.io/)\nbower_components\n\n# node-waf configuration\n.lock-wscript\n\n# Compiled binary addons (https://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directories\nnode_modules/\njspm_packages/\n\n# TypeScript v1 declaration files\ntypings/\n\n# Optional npm cache directory\n.npm\n\n# Optional eslint cache\n.eslintcache\n\n# Optional REPL history\n.node_repl_history\n\n# Output of 'npm pack'\n*.tgz\n\n# Yarn Integrity file\n.yarn-integrity\n\n# dotenv environment variables file\n.env\n\n# parcel-bundler cache (https://parceljs.org/)\n.cache\n\n# next.js build output\n.next\n\n# nuxt.js build output\n.nuxt\n\n# vuepress build output\n.vuepress/dist\n\n# Serverless directories\n.serverless/\n\n# FuseBox cache\n.fusebox/\n\n#DynamoDB Local files \n.dynamodb/ \n"
  },
  {
    "path": "Lied/Geburi.md",
    "content": "Happy Birthday\n\nA Happy Birthday animation design in CSS3, HTML5.\n\nURL: http://estheryu991.github.io/geburi/\n\nTechnology Used: HTML5 CSS3 jQuery  GNU/Linux Digital Ocean as VPS GIMP\n\n# Setup\n\n## If you have python installed:\n```\ncd Geburi\n```\n\n&& \n\n```\npython -m SimpleHTTPServer --port  8081\n```\n\nvisit http://localhost:8081 in your browser.\n\n## If you have nodejs installed\n```\nnpm install\n```\n&&\n\n```\nnpm run server-node\n```\nvisit http://localhost:8081 in your browser.\n"
  },
  {
    "path": "Lied/Patent Ochsner/Für immer uf di.md",
    "content": "Schweizer Lied findet [hier](https://www.youtube.com/watch?v=-U_awHiE2e0)\n\n# Lyrics:\n\n>>> \"uf mueters seel wo hüt furt isch vo dr ärde\nuf au die schöne ching, wo hüt z nacht gebore wärde\nuf au die zyt wo isch vergange, uf au die zyt wo mir no blybt\n\nuf au die grüene triebe, uf die zuckersüesse frücht i de böim\nuf au die grosse plän & uf all die grosse tröim\nuf au die wo fyre & wo singe, uf au die wo sueche\n& wo villech sogar finge\n\nes glas uf d liebi & eis uf ds voue läbe\n& eis uf au das, wo mir nid chöi häbe\nes tor geit uuf & nes angers geit zue\nblybsch i mym härz - sogar no denn - we's afat weh tue\n\nuf au die wo chöi vergässe, uf au die wo chöi vergäh\nuf au die wones grosses härz hei & wo sech das nid lö la näh \nuf ne gränzelose himu, uf nes uferloses meer\n& für immer uf di\n\nes glas uf d liebi & eis uf ds voue läbe\n& eis uf au das, wo mir nid chöi häbe\nes tor geit uuf & nes angers geit zue\nblybsch i mym härz - sogar no denn - we's afat weh tue\n\nuf mueters seel wo hüt furt isch vo dr ärde\nuf au die schöne ching, wo hüt z nacht gebore wärde\nuf au die zyt wo isch vergange, uf au die zyt wo mir no blybt\"\n\nContributor: May\n"
  },
  {
    "path": "Lied/cake.less",
    "content": "\n\n//////////////////////////////////////////// var\n\n@D:300px; // Control diameter\n\n///////////////////////////////////////////\n\n\n\n/* ============================================== POSITION\n*/\n\n.cake{\n  position:absolute;\n  display:none;\n // top:30%; \n  left:50%;\n  margin-left:-(@D/2);\n  width:@D; height:@D;\n}\n\n/* ============================================== BASE\n*/\n\n.cake:after{\n  background:rgba(255,255,255,1);\n  border-radius:@D;\n  content:\"\";\n  position:absolute;\n  bottom:0; left:0;\n  width:@D; height:@D/50;\n}\n\n.cake:before{\n  \n}\n\n/* ============================================== Candle\n*/\n\n.velas{\n  background:rgba(255,255,255,1);\n  border-radius:100%;\n  position:absolute;\n  top:50%; left:50%;\n  margin-left:-(@D/2)/20;\n  margin-top:-(@D/2)/6;\n  width:@D/20; height:@D/6;\n}\n\n.velas:after,\n.velas:before{\n  background:rgba(255,0,0,0.4);\n  content:\"\";\n  position:absolute;\n  width:100%; height:@D/45;\n}\n\n.velas:after{\n  top:25%; left:0;\n}\n\n.velas:before{\n  top:45%; left:0;\n}\n\n/* ============================================== Fire\n*/\n\n.fuego{\n  display:none;\n  border-radius:100%;\n  box-shadow:0 0 40px 10px rgba(248,233,209,0.2);\n  position:absolute;\n  top:-12px; left:50%;\n  margin-left:-(@D/2)/15;\n  //margin-top:-(@D/2)/10;\n  width:@D/15; height:@D/8;\n}\n\n.fuego:nth-child(1){\n  -webkit-animation:fuego 2s infinite;\n  -moz-animation:fuego 2s infinite;\n  -o-animation:fuego 2s infinite;\n  -ms-animation:fuego 2s infinite;\n  animation:fuego 2s infinite;\n\n}\n\n.fuego:nth-child(2){\n  -webkit-animation:fuego 1.5s infinite;\n   -moz-animation:fuego 1.5s infinite;\n    -o-animation:fuego 1.5s infinite;\n     -ms-animation:fuego 1.5s infinite;\n      animation:fuego 1.5s infinite;\n\n}\n\n.fuego:nth-child(3){\n  -webkit-animation:fuego 1s infinite;\n  -moz-animation:fuego 1s infinite;\n  -o-animation:fuego 1s infinite;\n  -ms-animation:fuego 1s infinite;\n  animation:fuego 1s infinite;\n}\n\n.fuego:nth-child(4){\n  -webkit-animation:fuego 0.5s infinite;\n  -moz-animation:fuego 0.5s infinite;\n  -o-animation:fuego 0.5s infinite;\n  -ms-animation:fuego 0.5s infinite;\n  animation:fuego 0.5s infinite;\n}\n\n.fuego:nth-child(5){\n  -webkit-animation:fuego 0.2s infinite;\n  -moz-animation:fuego 0.2s infinite;\n  -o-animation:fuego 0.2s infinite;\n  -ms-animation:fuego 0.2s infinite;\n  animation:fuego 0.2s infinite;\n}\n\n/* ============================================== Animation Fire\n*/\n\n@-webkit-keyframes fuego{\n  0%{\n    background:rgba(254,248,97,0.5);\n    -webkit-transform:translateY(0) scale(1);\n  }\n  50%{\n    background:rgba(255,50,0,0.1);\n    -webkit-transform:translateY(-(@D/5)) scale(0);\n  }\n  100%{\n    background:rgba(254,248,97,0.5);\n    -webkit-transform:translateY(0) scale(1);\n  }\n}\n@-moz-keyframes fuego{\n  0%{\n    background:rgba(254,248,97,0.5);\n    -moz-transform:translateY(0) scale(1);\n  }\n  50%{\n    background:rgba(255,50,0,0.1);\n    -moz-transform:translateY(-(@D/5)) scale(0);\n  }\n  100%{\n    background:rgba(254,248,97,0.5);\n    -moz-transform:translateY(0) scale(1);\n  }\n}\n@-o-keyframes fuego{\n  0%{\n    background:rgba(254,248,97,0.5);\n    -o-transform:translateY(0) scale(1);\n  }\n  50%{\n    background:rgba(255,50,0,0.1);\n    -o-transform:translateY(-(@D/5)) scale(0);\n  }\n  100%{\n    background:rgba(254,248,97,0.5);\n    -o-transform:translateY(0) scale(1);\n  }\n}\n@-ms-keyframes fuego{\n  0%{\n    background:rgba(254,248,97,0.5);\n    -ms-transform:translateY(0) scale(1);\n  }\n  50%{\n    background:rgba(255,50,0,0.1);\n    -ms-transform:translateY(-(@D/5)) scale(0);\n  }\n  100%{\n    background:rgba(254,248,97,0.5);\n    -ms-transform:translateY(0) scale(1);\n  }\n}\n\n@keyframes fuego{\n  0%{\n    background:rgba(254,248,97,0.5);\n    transform:translateY(0) scale(1);\n  }\n  50%{\n    background:rgba(255,50,0,0.1);\n    transform:translateY(-(@D/5)) scale(0);\n  }\n  100%{\n    background:rgba(254,248,97,0.5);\n    transform:translateY(0) scale(1);\n  }\n}\n\n/* ============================================== Frosting\n*/\n\n.cobertura{\n  background:rgba(236,231,227,1);\n  border-radius:@D/2;\n  position:absolute;\n  top:60%; left:50%;\n  margin-left:-(@D/2)/1.8;\n  margin-top:-(@D/2)/10;\n  width:@D/1.8; height:@D/8;\n  z-index:10;\n}\n\n.cobertura:after,\n.cobertura:before{\n  background:rgba(236,231,227,1);\n  border-radius:@D;\n  content:\"\";\n  position:absolute;\n  width:@D/20; height:@D/10;\n}\n\n.cobertura:after{\n  top:@D/15; right:@D/7;\n}\n\n.cobertura:before{\n  top:@D/10; right:@D/11;\n}\n\n/* ============================================== BIZCOCHO\n*/\n\n.bizcocho{\n  background:rgba(109,56,38,1);\n  position:absolute;\n  bottom:0; left:50%;\n  margin-left:-(@D/2)/2;\n  width:@D/2; height:@D/3;\n}\n\n.bizcocho:after,\n.bizcocho:before{\n  background:rgba(236,231,227,0.6);\n  content:\"\";\n  position:absolute;\n  width:100%; height:@D/20;\n}\n\n.bizcocho:after{\n  top:30%; left:0;\n}\n\n.bizcocho:before{\n  top:60%; left:0;\n}\n\n/* ============================================== TEXT\n*/\n\nh1,\np{\n  font-family: 'Lato', sans-serif;\n  font-weight: 300;\n  font-style:italic;\n  text-align:center;\n  width:100%;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n"
  },
  {
    "path": "Lied/loading.css",
    "content": "/* Absolute Center CSS Spinner */\n.loading {\n  position: fixed;\n  z-index: 99999;\n  height: 2em;\n  width: 2em;\n  overflow: show;\n  margin: auto;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n}\n\n/* Transparent Overlay */\n.loading:before {\n  content: '';\n  display: block;\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background-color: rgba(0,0,0,0.3);\n}\n\n/* :not(:required) hides these rules from IE9 and below */\n.loading:not(:required) {\n  /* hide \"loading...\" text */\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.loading:not(:required):after {\n  content: '';\n  display: block;\n  font-size: 10px;\n  width: 1em;\n  height: 1em;\n  margin-top: -0.5em;\n  -webkit-animation: spinner 1500ms infinite linear;\n  -moz-animation: spinner 1500ms infinite linear;\n  -ms-animation: spinner 1500ms infinite linear;\n  -o-animation: spinner 1500ms infinite linear;\n  animation: spinner 1500ms infinite linear;\n  border-radius: 0.5em;\n  -webkit-box-shadow: #FFF 1.5em 0 0 0, rgba(0, 0, 0, 0.75) 1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) 0 1.5em 0 0, #FFF -1.1em 1.1em 0 0, rgba(0, 0, 0, 0.5) -1.5em 0 0 0, rgba(0, 0, 0, 0.5) -1.1em -1.1em 0 0, rgba(0, 0, 0, 0.75) 0 -1.5em 0 0, rgba(0, 0, 0, 0.75) 1.1em -1.1em 0 0;\n  box-shadow: #FFF 1.5em 0 0 0, rgba(0, 0, 0, 0.75) 1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) 0 1.5em 0 0, #FFF -1.1em 1.1em 0 0, rgba(0, 0, 0, 0.5) -1.5em 0 0 0, rgba(0, 0, 0, 0.5) -1.1em -1.1em 0 0, rgba(0, 0, 0, 0.75) 0 -1.5em 0 0, rgba(0, 0, 0, 0.75) 1.1em -1.1em 0 0;\n}\n\n/* Animation */\n\n@-webkit-keyframes spinner {\n  0% {\n    -webkit-transform: rotate(0deg);\n    -moz-transform: rotate(0deg);\n    -ms-transform: rotate(0deg);\n    -o-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n    -moz-transform: rotate(360deg);\n    -ms-transform: rotate(360deg);\n    -o-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n@-moz-keyframes spinner {\n  0% {\n    -webkit-transform: rotate(0deg);\n    -moz-transform: rotate(0deg);\n    -ms-transform: rotate(0deg);\n    -o-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n    -moz-transform: rotate(360deg);\n    -ms-transform: rotate(360deg);\n    -o-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n@-o-keyframes spinner {\n  0% {\n    -webkit-transform: rotate(0deg);\n    -moz-transform: rotate(0deg);\n    -ms-transform: rotate(0deg);\n    -o-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n    -moz-transform: rotate(360deg);\n    -ms-transform: rotate(360deg);\n    -o-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n@keyframes spinner {\n  0% {\n    -webkit-transform: rotate(0deg);\n    -moz-transform: rotate(0deg);\n    -ms-transform: rotate(0deg);\n    -o-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n    -moz-transform: rotate(360deg);\n    -ms-transform: rotate(360deg);\n    -o-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n"
  },
  {
    "path": "NLP/Examples/one/assignment.md",
    "content": "Natural Language Processing \nFall 2022 \nProf. Ryan Cotterell \nAssignment 1: Backpropagation \n29/09/2022 - 16:21h \nThe first half of the assignment is a series of theoretical questions about the material. When you have answered the questions to your satisfaction, you should upload a pdf file with your solutions (preferably written in LATEX) to Moodle. The second question is a coding task that is to be solved in the released Google Colab notebook. You have to copy the notebook to your own drive in order to edit it. When submitting your solution, please execute all cells in your copied notebook, then save it and include a link to your notebook in your PDF file submission. We will run software on your submission to test for plagiarism. \nImportant: Please ensure, that all cells in the notebook are already executed and that the notebook is accessible via the shared link in Editor mode! The notebook must also be executable from top to bottom without throwing errors. \n1 Theory \nQuestion 1: Efficiently Computing the Hessian (50 pts) \nBackpropagation on a computation graph can be used to efficiently obtain the derivatives of a function with respect to the input. In this problem, we consider a differentiable map f : Rn → R. This question makes heavy use of the operator ∇ (pronounced nabla). We write ∇f(x) to denote the Jacobian of f evaluated at point x. Importantly, in the special case that the co-domain of f is simply R, we refer to the Jacobian of f as the gradient of f. When ∇f gives us a gradient, we will take it to be a column vector. Furthermore, we write ∇∇f(x) or ∇2f(x) to indicate the Hessian of f. Recall from Lecture 2 that f(x)’s Hessian is the matrix of second derivatives at point x. This notation is intuitive because the Hessian of f is simply the Jacobian of the gradient of f. You can assume that f is twice differentiable. You will now derive an algorithm to compute the Hessian ∇2f(x) using repeated calls to backpropagation. \na) (10 pts) Show that the following identity holds true: \n\n∇2f(x) = \n \n(∇(e⊤1 ∇f(x)))⊤ \n... \n(∇(e⊤n ∇f(x)))⊤ \n \n (1) \n\nwhere {e1, . . . , en} are the standard basis vectors of Rn, which are taken to be column vectors. In words, you are asked to demonstrate that (∇(e⊤i ∇f(x)))⊤ computes the ith row of the Hessian ∇2f(x). \nThen, give an expression to compute the ith column of the Hessian that is similar to one for the ith row derived above. \n1\nb) (15 pts) Suppose f can be computed in O(m) time. Use the identity in equation 1, to briefly describe an efficient algorithm, based on backpropogation, for computing ∇2f(x). Discuss the runtime of your algorithm. Explain why this constitutes a faster algorithm than the more na¨ıve way of computing the Hessian entry by entry and also give the runtime of this more na¨ıve algorithm. \nc) (15 pts) Now, briefly describe an algorithm to compute the tensor of 3rd-order deriva tives and discuss its runtime in terms of m. Then, explain how to produce the tensor of kth-order derivatives and discuss its runtime in terms of m. The answer for the kth-order derivative can be qualitative as it is tricky to come up with good notation. \nd) (10 pts) Describe an O(m) algorithm for computing the diagonal of ∇2f(x). Hint: This is a tricky problem unless you look at it the right way. The general idea is to develop an analogue of the multivariate chain rule for elements of the Hessian’s diagonal. Then, you can develop a dynamic program very similar to backpropagation itself that has the correct runtime. Recall that the multivariate chain rule says \n∂xj=X \n\n∂zk \n∂xj \nand our goal is to compute ∂2yi \n∂yi \nM \nk=1 \n∂yj ∂zk \n\nHessian. \n∂xj∂xj, another notation for the diagonal elements of the 2\n\n2 Practice \nQuestion 2: Coding Backpropagation (50 pts) \nIn this question, we ask you to code backpropagation in Python in a Google Colab notebook: \nhttps://colab.research.google.com/drive/1lSgujLn0ETFUMssy ClRAb3PlbhtUoQU?usp= sharing \nThere are a several cells, marked with “[do not change]”, that you are not allowed to modify! In other other cells, you may of course add more (class) functions. However, do not change the signatures of existing functions, such as class initializations. Also, you are not allowed to import any libraries other than the ones that are being automatically imported in the cell “Library Imports”. \nThe notebook allows you to select one of four math problems in a drop-down menu. Each math problem is represented as dict and consists of 4 key-value pairs: problem: math equation as string, in vars: dict of input variables, output: true output solution of the math problem as float and derivative: dict of the input variables’ partial derivatives. \nThe provided Parser class is converting the math problem into infix notation that we can perform subsequent operations on. In particular, it is taking a math problem as a string input (problem), as well as optional initialization values in vars of the problem’s input variables and returning a list infix. As a simplification, you can expect operations to be grouped, e.g. x + y + z will be (x + y) + z, so that the parser always returns lists (and sublists) of length 3 at most and individual operations (such as +) will expect 2 variables at most, as discussed in item (ii). See for instance: \nexp(x) - (y * 2) −→ [[’exp’, ’x’], ’-’, [’y’, ’*’, 2]] (2) There are three cells for three classes with open ToDos for you to implement: \n(i) Building: the Builder class is taking the infix notation math problem as input and instantiates the class variable self.graph with a computation graph. Class initializa tion accepts the input variables as an additional, optional argument to avoid naming conflicts with the intermediate and output variables which may be arbitrarily chosen from the set of unicode chars. You are free in choosing your own data structure for representing the computation graph. As a simplification, we do not require optimized parallelization — the order of operations should be correct and free of conflicts per taining variable-sharing. However, operations that can be executed in parallel may also be consecutively executed. \ng = Builder(infix: list, in_vars: dict) \nprint(g.graph) \n(ii) Operations: the Operator class defines functions that are used by the Executor class (item (iii)), which is defined next. You are asked to implement several child classes that all inherit from the abstract Operator class and that define the following functions: \nself.fn_map = {\"log\": Log(), \"exp\": Exp(), \"+\": Add(),\\ \n\"-\": Sub(), \"ˆ\": Pow(), \"sin\": Sin(), \"*\": Mult(), \"/\": Div()} 3\nwhere log is the natural logarithm. In particular, each class inheriting from Operator must have a function method self.f() and a first-order partial derivative method self.df(). Both take one or two variables as an input for unary or binary operations respectively. While self.f() always returns a single float, self.df() returns a single element list of floats for unary and a two-element list of floats, i.e. a Jacobian vector, for binary operations. \n(iii) Executing: the Executor class takes two dictionaries as input: the computation graph and the initialized input variables. The class should implement the functions forward and backward, which use the input variables to run a forward and backward pass on the computation graph respectively. After executing both, two class variables of the Executor class should be initialized: self.output should hold the output of the forward pass as a float value; self.derivative should hold the dictionary of first-order partial derivatives of all input variables. Given the input variables in - vars = {’x’: 2.0, ’y’: -2.0} and the computation graph b.graph as constructed in the Builder class (item (i)), the outputs should be: \ne = executing.Executor(graph: dict = b.graph, in_vars: dict = in_vars) e.forward() \ne.backward() \nprint(e.output) ## 11.39 \nprint(e.derivative) ## {'x': 7.39, 'y': -2.0} \nFor grading your submission, we will run all cells in your notebook from top to bottom. In particular, we will consider the cell “Test Function for Grading”. This loads a set of math problems and executes the full pipeline of parsing, building and executing. In particular, we compare if the Executor class variables self.derivative and self.output match the true solution. Therefore, we round all floats to two decimal places. \nNote: Please ensure that you share your copied notebook via a link in Editor mode. The notebook must be fully executable and all cells should be executed already! \n4\n"
  },
  {
    "path": "NLP/Examples/one/cl.md",
    "content": "zb. \n\n**Computerlinguistik und Sprachtechnologie**\n\nWas ist Computerlinguistik und Sprachtechnologie?\nDas Studienprogramm Computerlinguistik und Sprachtechnologie bietet Veranstaltungen an in den Bereichen Computerlinguistik, Sprachtechnologie, Phonetik und Sprachsignalverarbeitung, sowie kognitiver Linguistik. Das heisst, es werden allgemeine Kenntnisse in Linguistik und Informatik mit spezifischen Kenntnissen und Fähigkeiten in Computerlinguistik verknüpft. Die Grundlagenkurse in maschinellem Lernen und automatischer Sprachverarbeitung bauen auf dem Maturawissen des Bereichs Mathematik auf.\n\n**Wann sind Sie bei uns richtig?**\n\nVertrautheit im Umgang mit Computern, aber keine spezifischen Vorkenntnisse\nProgrammieren: Keine Vorkenntnisse erforderlich, aber Interesse! Python wird obligatorisch gelehrt, später können weitere Programmiersprachen gewählt werden\nFremdsprachen: Bereitschaft, englischsprachige Fachtexte zu lesen (Kein Lateinobligatorium)\nAusgeprägte Freude am Gebrauch und der Analyse von Sprachen\nInteresse an der automatischen Verarbeitung der menschlichen Sprache\nSpass am Basteln von sprachtechnologischen Anwendungen und Umsetzen eigener Ideen zur Sprachverarbeitung\nInteresse an Fragen der modernen Informationsgesellschaft\nMitwirken an der Flexibilisierung der Mensch-Maschine-Kommunikation\nSpass am Computer als mächtiges Modellierungsinstrument\nDas sagen unsere Studierenden\n«Computerlinguistik: Wo Sprachen geliebt, Professor:innen geduzt und Grafikkarten ins Schwitzen gebracht werden.»\n\n**«Die Computerlinguistik fasziniert mich, da sie Sprache und Technologie auf eine interessante Weise verbindet und es immer wieder neue Themenfelder zu entdecken gibt.»**\n\n«Die Computerlinguistik verbindet die beiden Bereiche, die mich schon immer interessiert haben: Sprache und Informatik, eine äusserst aktuelle Studienrichtung. Wir lernen die Sachen und Technologien kennen, die frisch auf den Markt gekommen sind. Die digitale Sprachverarbeitung wird immer allgegenwärtiger, von Alexa über DeepL bis hin zu Smart Homes. Mit dem Computerlinguistik-Studium stehen einem alle Türen offen. Ob lieber Richtung Forschung, Softwareentwicklung oder Webdesign – es ist alles dabei.»\n\n«Am CL-Studium begeistert mich, dass ich nach jeder Vorlesung mehr weiss und kann als davor. Man muss nicht einfach büffeln und auswendig lernen, sondern eignet sich Fertigkeiten an, bei denen man immer weiss, warum sie einem später etwas nützen werden. Und dass man am Puls der Zeit ist – die Forschung entwickelt sich unglaublich schnell weiter und man ist mittendrin. Man denke nur, wie Google Translate noch vor 10 Jahren übersetzte und im Gegensatz dazu, was er heute kann!»\n\n«Ich habe das CL-Studium gewählt, weil die Berufsperspektiven gut und vielfältig sind. Man wird sich immer weiterentwickeln und neuen Herausforderungen stellen können (und auch müssen).»\n"
  },
  {
    "path": "NLP/Examples/one/example.py",
    "content": "example\nn is always more than n \n\nLowerbound \nhow you define an automic automation \n\nevery node to be an dependent \n\nN and the calculation of the output \n"
  },
  {
    "path": "NLP/Examples/one/number.py",
    "content": "import sys\nimport re\nfrom pyparsing import *\nimport random\n\nROUND = 2 ## we round results to two decimal places for checking\n\nMATH_PROBLEMS = [{'problem': 'x/y', 'in_vars': {'x': 1.0, 'y': 1.0}, 'output': 1.0, 'derivative': {'x': 1.0, 'y': -1.0}},\n {'problem': 'exp(x) - (y * 2)', 'in_vars': {'x': 2.0, 'y': -2.0},'output': 11.39, 'derivative': {'x': 7.39, 'y': -2.0}},\n {'problem': '(x^2 - 1) * (y+2)', 'in_vars': {'x': 3.0, 'y': 2.0}, 'output': 32.0, 'derivative': {'x': 24.0, 'y': 8.0}},\n {'problem': 'z + sin(x^(2) + (y * exp(z)))', 'in_vars': {'x': 2.0, 'y': -1.0, 'z': 0.0}, 'output': 0.14, 'derivative': {'x': -3.96, 'y': -0.99, 'z': 1.99}}]\n\n\nclass Parser():\n\n    def __init__(self, print_res: bool = False):\n\n        self.print_res = print_res\n        self.expr = self.infix_notation_parser()\n\n    def parse(self, math_string: str, in_vars: dict = {}):\n        \"\"\"\n        math_string: str describing math equation, e.g. 'z + sin(x^(2) + y * exp(z))'\n        in_vars: optional dict of mapping between input variables and numbers\n        RETURN: list of infix parsed string, returns dict of input used_vars\n        \"\"\"\n        if self.print_res:\n            print(f\"\\nproblem: {math_string} with input {in_vars}\")\n        in_vars = self.get_input_variables(math_string, in_vars)\n        infix_list = self.expr.parseString(math_string).asList()[0]\n        return infix_list, in_vars\n\n    def infix_notation_parser(self, ):\n        \"\"\"\n        RETURN: expr py_parse object\n        \"\"\"\n\n        ppc = pyparsing_common\n\n        ParserElement.enablePackrat()\n        sys.setrecursionlimit(3000)\n\n        integer = ppc.integer\n        variable = Word(alphas, exact=1)\n        operand = integer | variable\n\n        expop = Literal(\"^\")\n        factop = Literal(\"!\")\n        ident = Word(alphas, alphanums + \"_$\")\n        signop = oneOf(\"+ -\")\n        multop = oneOf(\"* /\")\n        plusop = oneOf(\"+ -\")\n        #e = CaselessKeyword(\"E\")\n        #pi = CaselessKeyword(\"PI\")\n\n        expr = infixNotation(\n            operand,\n            [\n                (ident, 1, opAssoc.RIGHT),\n                (factop, 1, opAssoc.LEFT),\n                (expop, 2, opAssoc.RIGHT),\n                (signop, 1, opAssoc.RIGHT),\n                (multop, 2, opAssoc.LEFT),\n                (plusop, 2, opAssoc.LEFT),\n            ],\n        )\n\n        return expr\n\n\n    def get_input_variables(self, math_string: str, in_vars: dict = {}):\n        \"\"\"\n        math_string: str describing math equation, e.g. 'z + sin(x^(2) + y * exp(z))'\n        in_vars: optional dict of mapping between input variables and numbers\n        RETURN: returns dict of input used_vars\n        \"\"\"\n\n        in_var_list = list(set(re.findall(r'(?i)(?<![a-z])[a-z](?![a-z])', math_string)))\n        random_in_vars = {}\n\n        filtered_in_vars = {}\n        for in_var in in_var_list:\n            if in_var not in in_vars.keys():\n                random_in_vars[in_var] = float(random.randint(1, 3)) ## random input\n            else:\n                filtered_in_vars[in_var] = in_vars[in_var]\n\n        if self.print_res:\n            print(f\"generated random input {random_in_vars} and kept {filtered_in_vars}\")\n        return {**filtered_in_vars, **random_in_vars}\n\n\n\ndef test_backprop(Builder, Executor, math_problems = None):\n\n    if math_problems == None:\n        math_problems = MATH_PROBLEMS\n    elif isinstance(math_problems, dict):\n        math_problems = [math_problems]\n    elif isinstance(math_problems, list):\n        pass\n    else:\n        assert \"math_problems must be None, dict or list\"\n\n    ## set up parser\n    parser = Parser()\n\n    ## iterate through math problems\n    for i, math_problem in enumerate(math_problems):\n\n        ## Step 1 ________________\n        ## the math problem is parsed into infix notation\n        infix_str, in_vars = parser.parse(math_problem[\"problem\"], in_vars = math_problem[\"in_vars\"])\n\n        ## Step 2 ________________\n        ## take infix_str and in_vars and build a computation graph\n        ## it is not required that parallel executions are parallelized\n        b = Builder(infix = infix_str, in_vars = in_vars)\n\n        ## Step 3 ________________\n        ## execute the edges\n        ## your method should set float output: x and dict derivative: {'y': -1.0, 'x': 1.0}\n        e = Executor(graph = b.graph, in_vars=in_vars)\n        e.forward()\n        e.backward()\n\n        ## Step 4 ________________\n        ## we are testing our solution\n        ## output --> float comparison\n        print(f\"\\n{str(i)}: problem: {math_problem['problem']}, in_vars: {math_problem['in_vars']}\")\n        if round(e.output,2) == round(math_problem[\"output\"], ROUND):\n            print(f\"SUCCESS output: {round(e.output, ROUND)}\")\n        else:\n            print(f\"FAILURE output: {round(e.output, ROUND)} != {math_problem['output']}\")\n\n        ## first derivative --> dict comparison\n        true_deriv = {k: round(v, ROUND) for k, v in math_problem[\"derivative\"].items()}\n        e.derivative = {k: round(v,ROUND) for k,v in e.derivative.items()}\n        if e.derivative == true_deriv:\n            print(f\"SUCCESS derivative: {e.derivative}\")\n        else:\n            print(f\"FAILURE derivative: {e.derivative} != {math_problem['derivative']}\")\n\n\nif __name__ == '__main__':\n    pass\n"
  },
  {
    "path": "Notebook/Intro.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"toc\": true\n   },\n   \"source\": [\n    \"<h1>Week 01. Text Data Essentials<span class=\\\"tocSkip\\\"></span></h1>\\n\",\n    \"<div class=\\\"toc\\\"><ul class=\\\"toc-item\\\"><li><span><a href=\\\"#Week-01.-Introduction-to-Text-Data\\\" data-toc-modified-id=\\\"Week-01.-Introduction-to-Text-Data-1\\\"><span class=\\\"toc-item-num\\\">1&nbsp;&nbsp;</span>Week 01. Introduction to Text Data</a></span></li><li><span><a href=\\\"#Loading-and-Inspecting-Data-with-Pandas\\\" data-toc-modified-id=\\\"Loading-and-Inspecting-Data-with-Pandas-2\\\"><span class=\\\"toc-item-num\\\">2&nbsp;&nbsp;</span>Loading and Inspecting Data with Pandas</a></span><ul class=\\\"toc-item\\\"><li><span><a href=\\\"#Iterating-over-documents-in-a-dataframe\\\" data-toc-modified-id=\\\"Iterating-over-documents-in-a-dataframe-2.1\\\"><span class=\\\"toc-item-num\\\">2.1&nbsp;&nbsp;</span>Iterating over documents in a dataframe</a></span></li><li><span><a href=\\\"#Saving-data\\\" data-toc-modified-id=\\\"Saving-data-2.2\\\"><span class=\\\"toc-item-num\\\">2.2&nbsp;&nbsp;</span>Saving data</a></span></li></ul></li><li><span><a href=\\\"#Web-Scraping\\\" data-toc-modified-id=\\\"Web-Scraping-3\\\"><span class=\\\"toc-item-num\\\">3&nbsp;&nbsp;</span>Web Scraping</a></span><ul class=\\\"toc-item\\\"><li><span><a href=\\\"#Downloading-URL's\\\" data-toc-modified-id=\\\"Downloading-URL's-3.1\\\"><span class=\\\"toc-item-num\\\">3.1&nbsp;&nbsp;</span>Downloading URL's</a></span></li><li><span><a href=\\\"#Parsing-HTML\\\" data-toc-modified-id=\\\"Parsing-HTML-3.2\\\"><span class=\\\"toc-item-num\\\">3.2&nbsp;&nbsp;</span>Parsing HTML</a></span></li><li><span><a href=\\\"#Removing-unicode-characters\\\" data-toc-modified-id=\\\"Removing-unicode-characters-3.3\\\"><span class=\\\"toc-item-num\\\">3.3&nbsp;&nbsp;</span>Removing unicode characters</a></span></li></ul></li><li><span><a href=\\\"#Quantity-of-Text\\\" data-toc-modified-id=\\\"Quantity-of-Text-4\\\"><span class=\\\"toc-item-num\\\">4&nbsp;&nbsp;</span>Quantity of Text</a></span></li><li><span><a href=\\\"#Dictionary-/-Matching-Methods\\\" data-toc-modified-id=\\\"Dictionary-/-Matching-Methods-5\\\"><span class=\\\"toc-item-num\\\">5&nbsp;&nbsp;</span>Dictionary / Matching Methods</a></span><ul class=\\\"toc-item\\\"><li><span><a href=\\\"#Sentiment-Analysis\\\" data-toc-modified-id=\\\"Sentiment-Analysis-5.1\\\"><span class=\\\"toc-item-num\\\">5.1&nbsp;&nbsp;</span>Sentiment Analysis</a></span></li><li><span><a href=\\\"#Sentiment-Analysis-with-Huggingface\\\" data-toc-modified-id=\\\"Sentiment-Analysis-with-Huggingface-5.2\\\"><span class=\\\"toc-item-num\\\">5.2&nbsp;&nbsp;</span>Sentiment Analysis with Huggingface</a></span></li><li><span><a href=\\\"#StopWords\\\" data-toc-modified-id=\\\"StopWords-5.3\\\"><span class=\\\"toc-item-num\\\">5.3&nbsp;&nbsp;</span>StopWords</a></span></li><li><span><a href=\\\"#RegEx\\\" data-toc-modified-id=\\\"RegEx-5.4\\\"><span class=\\\"toc-item-num\\\">5.4&nbsp;&nbsp;</span>RegEx</a></span></li><li><span><a href=\\\"#WordNet\\\" data-toc-modified-id=\\\"WordNet-5.5\\\"><span class=\\\"toc-item-num\\\">5.5&nbsp;&nbsp;</span>WordNet</a></span></li></ul></li></ul></div>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Week 01. Introduction to Text Data\\n\",\n    \"\\n\",\n    \"Natural Language Processing for Law and Social Science<br>\\n\",\n    \"Elliott Ash, ETH Zurich\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:19.066847Z\",\n     \"start_time\": \"2022-03-03T18:54:18.994527Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# set random seed\\n\",\n    \"import numpy as np\\n\",\n    \"np.random.seed(4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Loading and Inspecting Data with Pandas\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:19.954764Z\",\n     \"start_time\": \"2022-03-03T18:54:19.506368Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#import warnings; warnings.simplefilter('ignore')\\n\",\n    \"# !pip install pandas\\n\",\n    \"import pandas as pd\\n\",\n    \"df = pd.read_csv('sc_cases.zip',compression='gzip')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:19.961024Z\",\n     \"start_time\": \"2022-03-03T18:54:19.955791Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<class 'pandas.core.frame.DataFrame'>\\n\",\n      \"RangeIndex: 820 entries, 0 to 819\\n\",\n      \"Data columns (total 10 columns):\\n\",\n      \" #   Column          Non-Null Count  Dtype  \\n\",\n      \"---  ------          --------------  -----  \\n\",\n      \" 0   case_name       786 non-null    object \\n\",\n      \" 1   opinion_type    820 non-null    object \\n\",\n      \" 2   date_standard   820 non-null    object \\n\",\n      \" 3   authorship      820 non-null    object \\n\",\n      \" 4   x_republican    803 non-null    float64\\n\",\n      \" 5   maj_judges      786 non-null    object \\n\",\n      \" 6   dissent_judges  786 non-null    object \\n\",\n      \" 7   topic_id        786 non-null    float64\\n\",\n      \" 8   cite_count      812 non-null    float64\\n\",\n      \" 9   opinion_text    820 non-null    object \\n\",\n      \"dtypes: float64(3), object(7)\\n\",\n      \"memory usage: 64.2+ KB\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"df.info() \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:19.970882Z\",\n     \"start_time\": \"2022-03-03T18:54:19.961700Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<div>\\n\",\n       \"<style scoped>\\n\",\n       \"    .dataframe tbody tr th:only-of-type {\\n\",\n       \"        vertical-align: middle;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe tbody tr th {\\n\",\n       \"        vertical-align: top;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe thead th {\\n\",\n       \"        text-align: right;\\n\",\n       \"    }\\n\",\n       \"</style>\\n\",\n       \"<table border=\\\"1\\\" class=\\\"dataframe\\\">\\n\",\n       \"  <thead>\\n\",\n       \"    <tr style=\\\"text-align: right;\\\">\\n\",\n       \"      <th></th>\\n\",\n       \"      <th>case_name</th>\\n\",\n       \"      <th>opinion_type</th>\\n\",\n       \"      <th>date_standard</th>\\n\",\n       \"      <th>authorship</th>\\n\",\n       \"      <th>x_republican</th>\\n\",\n       \"      <th>maj_judges</th>\\n\",\n       \"      <th>dissent_judges</th>\\n\",\n       \"      <th>topic_id</th>\\n\",\n       \"      <th>cite_count</th>\\n\",\n       \"      <th>opinion_text</th>\\n\",\n       \"    </tr>\\n\",\n       \"  </thead>\\n\",\n       \"  <tbody>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>0</th>\\n\",\n       \"      <td>ERICK CORNELL CLAY v. UNITED STATES</td>\\n\",\n       \"      <td>majority</td>\\n\",\n       \"      <td>2003-03-04</td>\\n\",\n       \"      <td>GINSBURG</td>\\n\",\n       \"      <td>0.0</td>\\n\",\n       \"      <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\\n\",\n       \"      <td>[]</td>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>2926.0</td>\\n\",\n       \"      <td>JUSTICE GINSBURG delivered the opinion of the ...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>1</th>\\n\",\n       \"      <td>HILLSIDE DAIRY INC., A&amp;A DAIRY, L&amp;S DAIRY, AND...</td>\\n\",\n       \"      <td>majority</td>\\n\",\n       \"      <td>2003-06-09</td>\\n\",\n       \"      <td>STEVENS</td>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\\n\",\n       \"      <td>['THOMAS, CLARENCE']</td>\\n\",\n       \"      <td>8.0</td>\\n\",\n       \"      <td>117.0</td>\\n\",\n       \"      <td>Justice Stevens delivered the opinion of the C...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>2</th>\\n\",\n       \"      <td>CHARLES RUSSELL RHINES v. DOUGLAS WEBER, WARDEN</td>\\n\",\n       \"      <td>majority</td>\\n\",\n       \"      <td>2005-03-30</td>\\n\",\n       \"      <td>O'CONNOR</td>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\\n\",\n       \"      <td>[]</td>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>23364.0</td>\\n\",\n       \"      <td>Justice O'Connor delivered the opinion of the ...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>3</th>\\n\",\n       \"      <td>NaN</td>\\n\",\n       \"      <td>majority</td>\\n\",\n       \"      <td>2005-04-15</td>\\n\",\n       \"      <td>KENNEDY</td>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>NaN</td>\\n\",\n       \"      <td>NaN</td>\\n\",\n       \"      <td>NaN</td>\\n\",\n       \"      <td>6.0</td>\\n\",\n       \"      <td>Justice Kennedy, Circuit Justice. \\\\n\\\\n This is...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>4</th>\\n\",\n       \"      <td>STATE OF ALASKA v. UNITED STATES OF AMERICA</td>\\n\",\n       \"      <td>majority</td>\\n\",\n       \"      <td>2005-06-06</td>\\n\",\n       \"      <td>KENNEDY</td>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\\n\",\n       \"      <td>['REHNQUIST, WILLIAM', 'SCALIA, ANTONIN', 'THO...</td>\\n\",\n       \"      <td>10.0</td>\\n\",\n       \"      <td>84.0</td>\\n\",\n       \"      <td>Justice Kennedy delivered the opinion of the C...</td>\\n\",\n       \"    </tr>\\n\",\n       \"  </tbody>\\n\",\n       \"</table>\\n\",\n       \"</div>\"\n      ],\n      \"text/plain\": [\n       \"                                           case_name opinion_type  \\\\\\n\",\n       \"0                ERICK CORNELL CLAY v. UNITED STATES     majority   \\n\",\n       \"1  HILLSIDE DAIRY INC., A&A DAIRY, L&S DAIRY, AND...     majority   \\n\",\n       \"2    CHARLES RUSSELL RHINES v. DOUGLAS WEBER, WARDEN     majority   \\n\",\n       \"3                                                NaN     majority   \\n\",\n       \"4        STATE OF ALASKA v. UNITED STATES OF AMERICA     majority   \\n\",\n       \"\\n\",\n       \"  date_standard authorship  x_republican  \\\\\\n\",\n       \"0    2003-03-04   GINSBURG           0.0   \\n\",\n       \"1    2003-06-09    STEVENS           1.0   \\n\",\n       \"2    2005-03-30   O'CONNOR           1.0   \\n\",\n       \"3    2005-04-15    KENNEDY           1.0   \\n\",\n       \"4    2005-06-06    KENNEDY           1.0   \\n\",\n       \"\\n\",\n       \"                                          maj_judges  \\\\\\n\",\n       \"0  ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...   \\n\",\n       \"1  ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...   \\n\",\n       \"2  ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...   \\n\",\n       \"3                                                NaN   \\n\",\n       \"4  ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...   \\n\",\n       \"\\n\",\n       \"                                      dissent_judges  topic_id  cite_count  \\\\\\n\",\n       \"0                                                 []       1.0      2926.0   \\n\",\n       \"1                               ['THOMAS, CLARENCE']       8.0       117.0   \\n\",\n       \"2                                                 []       1.0     23364.0   \\n\",\n       \"3                                                NaN       NaN         6.0   \\n\",\n       \"4  ['REHNQUIST, WILLIAM', 'SCALIA, ANTONIN', 'THO...      10.0        84.0   \\n\",\n       \"\\n\",\n       \"                                        opinion_text  \\n\",\n       \"0  JUSTICE GINSBURG delivered the opinion of the ...  \\n\",\n       \"1  Justice Stevens delivered the opinion of the C...  \\n\",\n       \"2  Justice O'Connor delivered the opinion of the ...  \\n\",\n       \"3  Justice Kennedy, Circuit Justice. \\\\n\\\\n This is...  \\n\",\n       \"4  Justice Kennedy delivered the opinion of the C...  \"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"df.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:19.979689Z\",\n     \"start_time\": \"2022-03-03T18:54:19.972244Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<div>\\n\",\n       \"<style scoped>\\n\",\n       \"    .dataframe tbody tr th:only-of-type {\\n\",\n       \"        vertical-align: middle;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe tbody tr th {\\n\",\n       \"        vertical-align: top;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe thead th {\\n\",\n       \"        text-align: right;\\n\",\n       \"    }\\n\",\n       \"</style>\\n\",\n       \"<table border=\\\"1\\\" class=\\\"dataframe\\\">\\n\",\n       \"  <thead>\\n\",\n       \"    <tr style=\\\"text-align: right;\\\">\\n\",\n       \"      <th></th>\\n\",\n       \"      <th>case_name</th>\\n\",\n       \"      <th>opinion_type</th>\\n\",\n       \"      <th>date_standard</th>\\n\",\n       \"      <th>authorship</th>\\n\",\n       \"      <th>x_republican</th>\\n\",\n       \"      <th>maj_judges</th>\\n\",\n       \"      <th>dissent_judges</th>\\n\",\n       \"      <th>topic_id</th>\\n\",\n       \"      <th>cite_count</th>\\n\",\n       \"      <th>opinion_text</th>\\n\",\n       \"    </tr>\\n\",\n       \"  </thead>\\n\",\n       \"  <tbody>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>0</th>\\n\",\n       \"      <td>ERICK CORNELL CLAY v. UNITED STATES</td>\\n\",\n       \"      <td>majority</td>\\n\",\n       \"      <td>2003-03-04</td>\\n\",\n       \"      <td>GINSBURG</td>\\n\",\n       \"      <td>0.0</td>\\n\",\n       \"      <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\\n\",\n       \"      <td>[]</td>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>2926.0</td>\\n\",\n       \"      <td>JUSTICE GINSBURG delivered the opinion of the ...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>1</th>\\n\",\n       \"      <td>HILLSIDE DAIRY INC., A&amp;A DAIRY, L&amp;S DAIRY, AND...</td>\\n\",\n       \"      <td>majority</td>\\n\",\n       \"      <td>2003-06-09</td>\\n\",\n       \"      <td>STEVENS</td>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\\n\",\n       \"      <td>['THOMAS, CLARENCE']</td>\\n\",\n       \"      <td>8.0</td>\\n\",\n       \"      <td>117.0</td>\\n\",\n       \"      <td>Justice Stevens delivered the opinion of the C...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>2</th>\\n\",\n       \"      <td>CHARLES RUSSELL RHINES v. DOUGLAS WEBER, WARDEN</td>\\n\",\n       \"      <td>majority</td>\\n\",\n       \"      <td>2005-03-30</td>\\n\",\n       \"      <td>O'CONNOR</td>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\\n\",\n       \"      <td>[]</td>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>23364.0</td>\\n\",\n       \"      <td>Justice O'Connor delivered the opinion of the ...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>4</th>\\n\",\n       \"      <td>STATE OF ALASKA v. UNITED STATES OF AMERICA</td>\\n\",\n       \"      <td>majority</td>\\n\",\n       \"      <td>2005-06-06</td>\\n\",\n       \"      <td>KENNEDY</td>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\\n\",\n       \"      <td>['REHNQUIST, WILLIAM', 'SCALIA, ANTONIN', 'THO...</td>\\n\",\n       \"      <td>10.0</td>\\n\",\n       \"      <td>84.0</td>\\n\",\n       \"      <td>Justice Kennedy delivered the opinion of the C...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>5</th>\\n\",\n       \"      <td>REGINALD A. WILKINSON, DIRECTOR, OHIO DEPARTME...</td>\\n\",\n       \"      <td>majority</td>\\n\",\n       \"      <td>2005-06-13</td>\\n\",\n       \"      <td>KENNEDY</td>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\\n\",\n       \"      <td>[]</td>\\n\",\n       \"      <td>4.0</td>\\n\",\n       \"      <td>4230.0</td>\\n\",\n       \"      <td>Justice Kennedy delivered the opinion of the C...</td>\\n\",\n       \"    </tr>\\n\",\n       \"  </tbody>\\n\",\n       \"</table>\\n\",\n       \"</div>\"\n      ],\n      \"text/plain\": [\n       \"                                           case_name opinion_type  \\\\\\n\",\n       \"0                ERICK CORNELL CLAY v. UNITED STATES     majority   \\n\",\n       \"1  HILLSIDE DAIRY INC., A&A DAIRY, L&S DAIRY, AND...     majority   \\n\",\n       \"2    CHARLES RUSSELL RHINES v. DOUGLAS WEBER, WARDEN     majority   \\n\",\n       \"4        STATE OF ALASKA v. UNITED STATES OF AMERICA     majority   \\n\",\n       \"5  REGINALD A. WILKINSON, DIRECTOR, OHIO DEPARTME...     majority   \\n\",\n       \"\\n\",\n       \"  date_standard authorship  x_republican  \\\\\\n\",\n       \"0    2003-03-04   GINSBURG           0.0   \\n\",\n       \"1    2003-06-09    STEVENS           1.0   \\n\",\n       \"2    2005-03-30   O'CONNOR           1.0   \\n\",\n       \"4    2005-06-06    KENNEDY           1.0   \\n\",\n       \"5    2005-06-13    KENNEDY           1.0   \\n\",\n       \"\\n\",\n       \"                                          maj_judges  \\\\\\n\",\n       \"0  ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...   \\n\",\n       \"1  ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...   \\n\",\n       \"2  ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...   \\n\",\n       \"4  ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...   \\n\",\n       \"5  ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...   \\n\",\n       \"\\n\",\n       \"                                      dissent_judges  topic_id  cite_count  \\\\\\n\",\n       \"0                                                 []       1.0      2926.0   \\n\",\n       \"1                               ['THOMAS, CLARENCE']       8.0       117.0   \\n\",\n       \"2                                                 []       1.0     23364.0   \\n\",\n       \"4  ['REHNQUIST, WILLIAM', 'SCALIA, ANTONIN', 'THO...      10.0        84.0   \\n\",\n       \"5                                                 []       4.0      4230.0   \\n\",\n       \"\\n\",\n       \"                                        opinion_text  \\n\",\n       \"0  JUSTICE GINSBURG delivered the opinion of the ...  \\n\",\n       \"1  Justice Stevens delivered the opinion of the C...  \\n\",\n       \"2  Justice O'Connor delivered the opinion of the ...  \\n\",\n       \"4  Justice Kennedy delivered the opinion of the C...  \\n\",\n       \"5  Justice Kennedy delivered the opinion of the C...  \"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# drop missing\\n\",\n    \"df = df.dropna()\\n\",\n    \"df.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:20.078271Z\",\n     \"start_time\": \"2022-03-03T18:54:20.075074Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"count        781\\n\",\n       \"unique        27\\n\",\n       \"top       SCALIA\\n\",\n       \"freq          86\\n\",\n       \"Name: authorship, dtype: object\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Number of label categories (e.g. judges)\\n\",\n    \"df['authorship'].describe()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:20.238731Z\",\n     \"start_time\": \"2022-03-03T18:54:20.227653Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"SCALIA                                           86\\n\",\n       \"GINSBURG                                         81\\n\",\n       \"THOMAS                                           79\\n\",\n       \"KENNEDY                                          79\\n\",\n       \"BREYER                                           73\\n\",\n       \"SOUTER                                           72\\n\",\n       \"STEVENS                                          72\\n\",\n       \"O'CONNOR                                         52\\n\",\n       \"REHNQUIST                                        49\\n\",\n       \"ROBERTS                                          28\\n\",\n       \"ALITO                                            23\\n\",\n       \"Breyer                                           12\\n\",\n       \"Roberts                                          10\\n\",\n       \"Alito                                             9\\n\",\n       \"Scalia                                            8\\n\",\n       \"Thomas                                            8\\n\",\n       \"Ginsburg                                          8\\n\",\n       \"Stevens                                           7\\n\",\n       \"Kennedy                                           7\\n\",\n       \"SOTOMAYOR                                         6\\n\",\n       \"Souter                                            5\\n\",\n       \"STEVENS  AND  O'CONNOR ;  REHNQUIST ;  BREYER     2\\n\",\n       \"STEVENS  (IN PART),  BREYER  (IN PART)            1\\n\",\n       \"JUSTICE  ALITO                                    1\\n\",\n       \"BREYER ;                                          1\\n\",\n       \"ROBERTS ,  SCALIA ,  THOMAS ,  ALITO              1\\n\",\n       \"Sotomayor                                         1\\n\",\n       \"Name: authorship, dtype: int64\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# tabulations of label categories \\n\",\n    \"df['authorship'].value_counts()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:20.382374Z\",\n     \"start_time\": \"2022-03-03T18:54:20.377383Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"df['authorship'] = df['authorship'].str.upper()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:20.524682Z\",\n     \"start_time\": \"2022-03-03T18:54:20.515558Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"SCALIA                                           94\\n\",\n       \"GINSBURG                                         89\\n\",\n       \"THOMAS                                           87\\n\",\n       \"KENNEDY                                          86\\n\",\n       \"BREYER                                           85\\n\",\n       \"STEVENS                                          79\\n\",\n       \"SOUTER                                           77\\n\",\n       \"O'CONNOR                                         52\\n\",\n       \"REHNQUIST                                        49\\n\",\n       \"ROBERTS                                          38\\n\",\n       \"ALITO                                            32\\n\",\n       \"SOTOMAYOR                                         7\\n\",\n       \"STEVENS  AND  O'CONNOR ;  REHNQUIST ;  BREYER     2\\n\",\n       \"STEVENS  (IN PART),  BREYER  (IN PART)            1\\n\",\n       \"JUSTICE  ALITO                                    1\\n\",\n       \"BREYER ;                                          1\\n\",\n       \"ROBERTS ,  SCALIA ,  THOMAS ,  ALITO              1\\n\",\n       \"Name: authorship, dtype: int64\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"df['authorship'].value_counts()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:20.658055Z\",\n     \"start_time\": \"2022-03-03T18:54:20.648459Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Index(['SCALIA', 'GINSBURG', 'THOMAS', 'KENNEDY', 'BREYER', 'STEVENS',\\n\",\n      \"       'SOUTER', 'O'CONNOR', 'REHNQUIST', 'ROBERTS', 'ALITO'],\\n\",\n      \"      dtype='object')\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# keep all judges through ALITO\\n\",\n    \"keep_judges = df['authorship'].value_counts().index[:11]\\n\",\n    \"print(keep_judges)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:20.811481Z\",\n     \"start_time\": \"2022-03-03T18:54:20.796104Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"SCALIA       94\\n\",\n       \"GINSBURG     89\\n\",\n       \"THOMAS       87\\n\",\n       \"KENNEDY      86\\n\",\n       \"BREYER       85\\n\",\n       \"STEVENS      79\\n\",\n       \"SOUTER       77\\n\",\n       \"O'CONNOR     52\\n\",\n       \"REHNQUIST    49\\n\",\n       \"ROBERTS      38\\n\",\n       \"ALITO        32\\n\",\n       \"Name: authorship, dtype: int64\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"df = df[df['authorship'].isin(keep_judges)]\\n\",\n    \"df['authorship'].value_counts()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:20.955563Z\",\n     \"start_time\": \"2022-03-03T18:54:20.943541Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0      2003-03-04\\n\",\n       \"1      2003-06-09\\n\",\n       \"2      2005-03-30\\n\",\n       \"4      2005-06-06\\n\",\n       \"5      2005-06-13\\n\",\n       \"          ...    \\n\",\n       \"815    2001-04-18\\n\",\n       \"816    2001-04-24\\n\",\n       \"817    2001-04-24\\n\",\n       \"818    2001-05-14\\n\",\n       \"819    2001-05-14\\n\",\n       \"Name: date_standard, Length: 768, dtype: object\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"df.date_standard\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:21.096221Z\",\n     \"start_time\": \"2022-03-03T18:54:21.080282Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0     2003-03-04\\n\",\n       \"1     2003-06-09\\n\",\n       \"2     2005-03-30\\n\",\n       \"4     2005-06-06\\n\",\n       \"5     2005-06-13\\n\",\n       \"         ...    \\n\",\n       \"815   2001-04-18\\n\",\n       \"816   2001-04-24\\n\",\n       \"817   2001-04-24\\n\",\n       \"818   2001-05-14\\n\",\n       \"819   2001-05-14\\n\",\n       \"Name: date_standard, Length: 768, dtype: datetime64[ns]\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"df['date_standard'] = pd.to_datetime(df['date_standard'])\\n\",\n    \"df['date_standard']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:21.243003Z\",\n     \"start_time\": \"2022-03-03T18:54:21.229193Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2001    77\\n\",\n       \"2000    76\\n\",\n       \"2009    74\\n\",\n       \"2002    74\\n\",\n       \"2004    73\\n\",\n       \"2003    70\\n\",\n       \"2005    70\\n\",\n       \"2007    65\\n\",\n       \"2010    64\\n\",\n       \"2006    63\\n\",\n       \"2008    62\\n\",\n       \"Name: year, dtype: int64\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"df['year'] = df['date_standard'].dt.year\\n\",\n    \"df['year'].value_counts()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:21.830847Z\",\n     \"start_time\": \"2022-03-03T18:54:21.364628Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<AxesSubplot:>\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"df['cite_count'].hist()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:21.882734Z\",\n     \"start_time\": \"2022-03-03T18:54:21.831876Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<AxesSubplot:>\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"import numpy as np\\n\",\n    \"df['log_cite_count'] = np.log(df['cite_count'])\\n\",\n    \"df['log_cite_count'].hist()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Save what we have done so far.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:23.031287Z\",\n     \"start_time\": \"2022-03-03T18:54:21.883786Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"                                             case_name opinion_type  \\\\\\n\",\n      \"0                  ERICK CORNELL CLAY v. UNITED STATES     majority   \\n\",\n      \"1    HILLSIDE DAIRY INC., A&A DAIRY, L&S DAIRY, AND...     majority   \\n\",\n      \"2      CHARLES RUSSELL RHINES v. DOUGLAS WEBER, WARDEN     majority   \\n\",\n      \"4          STATE OF ALASKA v. UNITED STATES OF AMERICA     majority   \\n\",\n      \"5    REGINALD A. WILKINSON, DIRECTOR, OHIO DEPARTME...     majority   \\n\",\n      \"..                                                 ...          ...   \\n\",\n      \"815  MICHAEL F. EASLEY, * GOVERNOR OF NORTH CAROLIN...     majority   \\n\",\n      \"816  GAIL ATWATER, et al. v. CITY OF LAGO VISTA et al.     majority   \\n\",\n      \"817  JAMES ALEXANDER, DIRECTOR, ALABAMA DEPARTMENT ...     majority   \\n\",\n      \"818  UNITED STATES v. OAKLAND CANNABIS BUYERS' COOP...     majority   \\n\",\n      \"819                     WILBERT K. ROGERS v. TENNESSEE     majority   \\n\",\n      \"\\n\",\n      \"    date_standard authorship  x_republican  \\\\\\n\",\n      \"0      2003-03-04   GINSBURG           0.0   \\n\",\n      \"1      2003-06-09    STEVENS           1.0   \\n\",\n      \"2      2005-03-30   O'CONNOR           1.0   \\n\",\n      \"4      2005-06-06    KENNEDY           1.0   \\n\",\n      \"5      2005-06-13    KENNEDY           1.0   \\n\",\n      \"..            ...        ...           ...   \\n\",\n      \"815    2001-04-18     BREYER           0.0   \\n\",\n      \"816    2001-04-24     SOUTER           1.0   \\n\",\n      \"817    2001-04-24     SCALIA           1.0   \\n\",\n      \"818    2001-05-14     THOMAS           1.0   \\n\",\n      \"819    2001-05-14   O'CONNOR           1.0   \\n\",\n      \"\\n\",\n      \"                                            maj_judges  \\\\\\n\",\n      \"0    ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...   \\n\",\n      \"1    ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...   \\n\",\n      \"2    ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...   \\n\",\n      \"4    ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...   \\n\",\n      \"5    ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...   \\n\",\n      \"..                                                 ...   \\n\",\n      \"815  ['BREYER, STEPHEN', 'GINSBURG, RUTH', \\\"O'CONNO...   \\n\",\n      \"816  ['KENNEDY, ANTHONY', 'REHNQUIST, WILLIAM', 'SC...   \\n\",\n      \"817  ['KENNEDY, ANTHONY', \\\"O'CONNOR, SANDRA\\\", 'REHN...   \\n\",\n      \"818  ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...   \\n\",\n      \"819  ['GINSBURG, RUTH', 'KENNEDY, ANTHONY', \\\"O'CONN...   \\n\",\n      \"\\n\",\n      \"                                        dissent_judges  topic_id  cite_count  \\\\\\n\",\n      \"0                                                   []       1.0      2926.0   \\n\",\n      \"1                                 ['THOMAS, CLARENCE']       8.0       117.0   \\n\",\n      \"2                                                   []       1.0     23364.0   \\n\",\n      \"4    ['REHNQUIST, WILLIAM', 'SCALIA, ANTONIN', 'THO...      10.0        84.0   \\n\",\n      \"5                                                   []       4.0      4230.0   \\n\",\n      \"..                                                 ...       ...         ...   \\n\",\n      \"815  ['KENNEDY, ANTHONY', 'REHNQUIST, WILLIAM', 'SC...       2.0      1236.0   \\n\",\n      \"816  ['BREYER, STEPHEN', 'GINSBURG, RUTH', \\\"O'CONNO...       1.0      3120.0   \\n\",\n      \"817  ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'SOUTER,...       9.0      4986.0   \\n\",\n      \"818                                                 []       1.0       736.0   \\n\",\n      \"819  ['BREYER, STEPHEN', 'SCALIA, ANTONIN', 'STEVEN...       4.0      2100.0   \\n\",\n      \"\\n\",\n      \"                                          opinion_text  year  log_cite_count  \\n\",\n      \"0    JUSTICE GINSBURG delivered the opinion of the ...  2003        7.981392  \\n\",\n      \"1    Justice Stevens delivered the opinion of the C...  2003        4.762174  \\n\",\n      \"2    Justice O'Connor delivered the opinion of the ...  2005       10.058952  \\n\",\n      \"4    Justice Kennedy delivered the opinion of the C...  2005        4.430817  \\n\",\n      \"5    Justice Kennedy delivered the opinion of the C...  2005        8.349957  \\n\",\n      \"..                                                 ...   ...             ...  \\n\",\n      \"815  JUSTICE BREYER delivered the opinion of the Co...  2001        7.119636  \\n\",\n      \"816  JUSTICE SOUTER delivered the opinion of the Co...  2001        8.045588  \\n\",\n      \"817  JUSTICE SCALIA delivered the opinion of the Co...  2001        8.514389  \\n\",\n      \"818  JUSTICE THOMAS delivered the opinion of the Co...  2001        6.601230  \\n\",\n      \"819  JUSTICE O'CONNOR delivered the opinion of the ...  2001        7.649693  \\n\",\n      \"\\n\",\n      \"[768 rows x 12 columns]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"df.to_pickle('sc_cases_cleaned.pkl',compression='gzip')\\n\",\n    \"print(df)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Iterating over documents in a dataframe\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In the following, we show how to iterate over a dataframe and three different ways of how to tokenize documents.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:24.535487Z\",\n     \"start_time\": \"2022-03-03T18:54:23.692986Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import spacy\\n\",\n    \"# more infos at https://spacy.io/\\n\",\n    \"nlp = spacy.load('en_core_web_sm')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:34.516885Z\",\n     \"start_time\": \"2022-03-03T18:54:24.536688Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"processed = {} # empty python dictionary for processed data\\n\",\n    \"# iterate over rows\\n\",\n    \"for i, row in df.iterrows():\\n\",\n    \"    if i >= 10:\\n\",\n    \"        break\\n\",\n    \"    docid = i # make document identifier\\n\",\n    \"    text = row['opinion_text']     # get text snippet\\n\",\n    \"    document = nlp(text) # get sentences/tokens\\n\",\n    \"    processed[docid] = document # add to dictionary    \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:34.519332Z\",\n     \"start_time\": \"2022-03-03T18:54:34.517544Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"opinion 1: JUSTICE GINSBURG delivered the opinion of the Court.\\n\",\n      \"\\n\",\n      \" A motion by a federal prisoner for postconviction relief under 28 U.S.C. § 2255 is subject to a one-year time limitation that generally runs from \\\"the date on which the judgment of conviction becomes final.\\\" \\n\",\n      \"\\n\",\n      \" opinion 2: Justice Stevens delivered the opinion of the Court. \\n\",\n      \"\\n\",\n      \"In most of the United States, not including California, the minimum price paid to dairy farmers producing raw milk is regulated pursuant to federal marketing orders.  Those orders guarantee a uniform price for the producers,\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# first and second opinions\\n\",\n    \"print (\\\"opinion 1:\\\", processed[0][:50], \\\"\\\\n\\\\n\\\", \\\"opinion 2:\\\", processed[1][:50])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's see in more detail what information we can extract from documents procesesd using spaCy: \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:34.525070Z\",\n     \"start_time\": \"2022-03-03T18:54:34.521139Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"JUSTICE PROPN compound\\n\",\n      \"GINSBURG PROPN nsubj\\n\",\n      \"delivered VERB ROOT\\n\",\n      \"the DET det\\n\",\n      \"opinion NOUN dobj\\n\",\n      \"of ADP prep\\n\",\n      \"the DET det\\n\",\n      \"Court PROPN pobj\\n\",\n      \". PUNCT punct\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"  SPACE dep\\n\",\n      \"A DET det\\n\",\n      \"motion NOUN nsubj\\n\",\n      \"by ADP prep\\n\",\n      \"a DET det\\n\",\n      \"federal ADJ amod\\n\",\n      \"prisoner NOUN pobj\\n\",\n      \"for ADP prep\\n\",\n      \"postconviction NOUN compound\\n\",\n      \"relief NOUN pobj\\n\",\n      \"under ADP prep\\n\",\n      \"28 NUM nummod\\n\",\n      \"U.S.C. PROPN compound\\n\",\n      \"§ PROPN pobj\\n\",\n      \"2255 NUM nummod\\n\",\n      \"is AUX ROOT\\n\",\n      \"subject ADJ acomp\\n\",\n      \"to ADP prep\\n\",\n      \"a DET det\\n\",\n      \"one NUM nummod\\n\",\n      \"- PUNCT punct\\n\",\n      \"year NOUN compound\\n\",\n      \"time NOUN compound\\n\",\n      \"limitation NOUN pobj\\n\",\n      \"that PRON nsubj\\n\",\n      \"generally ADV advmod\\n\",\n      \"runs VERB relcl\\n\",\n      \"from ADP prep\\n\",\n      \"\\\" PUNCT punct\\n\",\n      \"the DET det\\n\",\n      \"date NOUN pobj\\n\",\n      \"on ADP prep\\n\",\n      \"which PRON pobj\\n\",\n      \"the DET det\\n\",\n      \"judgment NOUN nsubj\\n\",\n      \"of ADP prep\\n\",\n      \"conviction NOUN pobj\\n\",\n      \"becomes VERB relcl\\n\",\n      \"final ADJ acomp\\n\",\n      \". PUNCT punct\\n\",\n      \"\\\" PUNCT punct\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for token in processed[0][:50]:\\n\",\n    \"       print(token.text, token.pos_, token.dep_)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"alternatively, we can preprocess with gensim\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:35.152483Z\",\n     \"start_time\": \"2022-03-03T18:54:34.525947Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"opinion 1: ['justice', 'ginsburg', 'delivered', 'the', 'opinion', 'of', 'the', 'court', 'motion', 'by', 'federal', 'prisoner', 'for', 'postconviction', 'relief', 'under', 'is', 'subject', 'to', 'one', 'year', 'time', 'limitation', 'that', 'generally', 'runs', 'from', 'the', 'date', 'on', 'which', 'the', 'judgment', 'of', 'conviction', 'becomes', 'final', 'this', 'case', 'concerns', 'the', 'starting', 'date', 'for', 'the', 'one', 'year', 'limitation', 'it', 'presents'] \\n\",\n      \"\\n\",\n      \" opinion 2: ['justice', 'stevens', 'delivered', 'the', 'opinion', 'of', 'the', 'court', 'in', 'most', 'of', 'the', 'united', 'states', 'not', 'including', 'california', 'the', 'minimum', 'price', 'paid', 'to', 'dairy', 'farmers', 'producing', 'raw', 'milk', 'is', 'regulated', 'pursuant', 'to', 'federal', 'marketing', 'orders', 'those', 'orders', 'guarantee', 'uniform', 'price', 'for', 'the', 'producers', 'but', 'through', 'pooling', 'mechanisms', 'require', 'the', 'processors', 'of']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"from gensim.utils import simple_preprocess\\n\",\n    \"\\n\",\n    \"processed = {} # empty python dictionary for processed data\\n\",\n    \"# iterate over rows\\n\",\n    \"for i, row in df.iterrows():\\n\",\n    \"    docid = i # make document identifier\\n\",\n    \"    text = row['opinion_text']     # get text snippet\\n\",\n    \"    document = simple_preprocess(text) # get sentences/tokens\\n\",\n    \"    processed[docid] = document # add to dictionary    \\n\",\n    \"    if i > 100:\\n\",\n    \"        break\\n\",\n    \"# first and second opinions\\n\",\n    \"print (\\\"opinion 1:\\\", processed[0][:50], \\\"\\\\n\\\\n\\\", \\\"opinion 2:\\\", processed[1][:50]) # note how simple preprocess drops punctuation\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"or with nltk\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:37.494062Z\",\n     \"start_time\": \"2022-03-03T18:54:35.153364Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"opinion 1: ['justice', 'ginsburg', 'delivered', 'the', 'opinion', 'of', 'the', 'court', '.', 'a', 'motion', 'by', 'a', 'federal', 'prisoner', 'for', 'postconviction', 'relief', 'under', '28', 'u.s.c', '.', '§', '2255', 'is', 'subject', 'to', 'a', 'one-year', 'time', 'limitation', 'that', 'generally', 'runs', 'from', '``', 'the', 'date', 'on', 'which', 'the', 'judgment', 'of', 'conviction', 'becomes', 'final', '.', \\\"''\\\", '§', '2255'] \\n\",\n      \"\\n\",\n      \" opinion 2: ['justice', 'stevens', 'delivered', 'the', 'opinion', 'of', 'the', 'court', '.', 'in', 'most', 'of', 'the', 'united', 'states', ',', 'not', 'including', 'california', ',', 'the', 'minimum', 'price', 'paid', 'to', 'dairy', 'farmers', 'producing', 'raw', 'milk', 'is', 'regulated', 'pursuant', 'to', 'federal', 'marketing', 'orders', '.', 'those', 'orders', 'guarantee', 'a', 'uniform', 'price', 'for', 'the', 'producers', ',', 'but', 'through']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"from nltk.tokenize import word_tokenize\\n\",\n    \"processed = {} # empty python dictionary for processed data\\n\",\n    \"# iterate over rows\\n\",\n    \"for i, row in df.iterrows():\\n\",\n    \"    docid = i # make document identifier\\n\",\n    \"    text = row['opinion_text']     # get text snippet\\n\",\n    \"    document = word_tokenize(text.lower()) # get sentences/tokens\\n\",\n    \"    processed[docid] = document # add to dictionary    \\n\",\n    \"    if i > 100:\\n\",\n    \"        break\\n\",\n    \"# first and second opinions\\n\",\n    \"print (\\\"opinion 1:\\\", processed[0][:50], \\\"\\\\n\\\\n\\\", \\\"opinion 2:\\\", processed[1][:50]) # note that we just tokenize and keep all tokens\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Saving data\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:37.554721Z\",\n     \"start_time\": \"2022-03-03T18:54:37.494841Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# save as python pickle\\n\",\n    \"pd.to_pickle(processed, 'processed_corpus.pkl')\\n\",\n    \"# delete it\\n\",\n    \"import os \\n\",\n    \"os.remove('processed_corpus.pkl')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:37.557086Z\",\n     \"start_time\": \"2022-03-03T18:54:37.555589Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Merging Data-frames Example\\n\",\n    \"# Perform a left join:\\n\",\n    \"# df_merged = pd.merge(df1,df2,on='id', how='left', validation='m:1')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Web Scraping\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Downloading URL's\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-03T18:54:39.084595Z\",\n     \"start_time\": \"2022-03-03T18:54:37.557840Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"b'\\\\n<!DOCTYPE html>\\\\n<html lang=\\\"en\\\">\\\\n<head>\\\\n  <meta charset=\\\"utf-8\\\"/>\\\\n  <meta http-equiv=\\\"Content-Language\\\" content=\\\"en\\\"/>\\\\n  <meta name=\\\"language\\\" content=\\\"en_us\\\"/>\\\\n  <meta name=\\\"viewport\\\" content=\\\"width=device-width,initial-scale=1\\\"/>\\\\n\\\\n  \\\\n  <meta name=\\\"description\\\" content=\\\"Opinion for People v. Germany, 674 P.2d 345 \\\\xe2\\\\x80\\\\x94 Brought to you by Free Law Project, a non-profit dedicated to creating high qua'\\n\",\n      \"\\n\",\n      \"b'    s = d.getElementsByTagName(\\\\'script\\\\')[0];\\\\n      g.type = \\\\'text/javascript\\\\';\\\\n      g.async = true;\\\\n      g.defer = true;\\\\n      g.src = u + \\\\'matomo.js\\\\';\\\\n      s.parentNode.insertBefore(g, s);\\\\n    })();\\\\n  </script>\\\\n  <noscript><p><img src=\\\"//matomo.courtlistener.com//piwik.php?idsite=1&rec=1\\\"\\\\n                    style=\\\"border:0;\\\" alt=\\\"\\\"/></p></noscript>\\\\n  <!-- End Matomo Code -->\\\\n\\\\n</body>\\\\n</html>\\\\n'\\n\",\n      \"\\n\",\n      \"78512 characters in string.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"import urllib.request as urllib # Python's module for accessing web pages\\n\",\n    \"url = 'https://goo.gl/VRF8Xs' # shortened URL for court case\\n\",\n    \"page = urllib.urlopen(url) # open the web page\\n\",\n    \"\\n\",\n    \"html = page.read() # read web page contents as a string\\n\",\n    \"print(html[:400])  # print first 400 characters\\n\",\n    \"print()\\n\",\n    \"print(html[-400:]) # print last 400 characters\\n\",\n    \"print()\\n\",\n    \"print(len(html),'characters in string.')   # print length of string\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Parsing HTML\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 291,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T09:32:09.647832Z\",\n     \"start_time\": \"2022-02-25T09:32:09.602699Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<title>People v. Germany, 674 P.2d 345 – CourtListener.com</title>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Parse raw HTML\\n\",\n    \"# !pip install beautifulsoup4\\n\",\n    \"from bs4 import BeautifulSoup # package for parsing HTML\\n\",\n    \"soup = BeautifulSoup(html, 'lxml') # parse html of web page\\n\",\n    \"print(soup.title) # example usage: print title item\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 292,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T09:32:18.769526Z\",\n     \"start_time\": \"2022-02-25T09:32:18.758006Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"519\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# extract text\\n\",\n    \"text = soup.get_text() # get text (remove HTML markup)\\n\",\n    \"lines = text.splitlines() # split string into separate lines\\n\",\n    \"print(len(lines)) # print number of lines\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 293,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T09:32:26.434807Z\",\n     \"start_time\": \"2022-02-25T09:32:26.422384Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"187\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"lines = [line for line in lines if line != ''] # drop empty lines\\n\",\n    \"print(len(lines)) # print number of lines\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 294,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T09:32:30.847356Z\",\n     \"start_time\": \"2022-02-25T09:32:30.839684Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"['People v. Germany, 674 P.2d 345 – CourtListener.com', 'Toggle navigation', 'About', 'FAQ', 'Donate', 'Sign in / Register', 'From Free Law Project, a 501(c)(3) non-profit.', 'Opinions\\\\xa0', 'Advanced Search', 'Citation Look Up', 'Citation Visualizations', 'RECAP Archive', 'Oral Arguments', 'Judges', 'Financial Disclosures', '\\\\xa0Donate', 'Your Notes', '                    (edit)', '                     ', '                    (none)']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(lines[:20]) # print first 20 lines\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Removing unicode characters\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 295,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T09:32:53.962331Z\",\n     \"start_time\": \"2022-02-25T09:32:53.952376Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"['Visualizations\\\\xa0'] ['Visualizations ']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# !pip install unidecode\\n\",\n    \"from unidecode import unidecode # package for removing unicode\\n\",\n    \"uncode_str = 'Visualizations\\\\xa0'\\n\",\n    \"fixed = unidecode(uncode_str) # example usage\\n\",\n    \"print([uncode_str],[fixed]) # print cleaned string (replaced with a space)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Quantity of Text\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Count words per document.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 301,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T09:35:39.259306Z\",\n     \"start_time\": \"2022-02-25T09:35:39.016620Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<AxesSubplot:>\"\n      ]\n     },\n     \"execution_count\": 301,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAXcAAAD4CAYAAAAXUaZHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAURUlEQVR4nO3dbYxcV33H8e+fJKRWlsZxE1auY3VDcVuFWJhkFYJAaDcISMILB4lGQYjYkMptFSRQ3SqGviiUIqUPAYlC0y5KGgcoSxqIYuWhNDVZRXkRUpsaPySELMSUrIwtiOOwQNM6/ffFHKfDsusdz+zM7J79fqTR3Hvuwzn/veOf7965MxuZiSSpLi/r9wAkSQvPcJekChnuklQhw12SKmS4S1KFTu/3AADOPffcHBoaamvbn/70p5x11lkLO6BFzHrrt9xqtt727d69+0eZed5syxZFuA8NDbFr1662tp2YmGBkZGRhB7SIWW/9llvN1tu+iPj+XMu8LCNJFTLcJalChrskVchwl6QKGe6SVCHDXZIqZLhLUoUMd0mqkOEuSRVaFJ9QXaqGtt3X8z63rj/OSM97lbTUeOYuSRWaN9wj4lci4rGI+FZEHIiIj5X22yPi6YjYUx4bSntExKcjYjIi9kbExV2uQZI0QyuXZV4ALs/M6Yg4A3gkIh4oy/4kM++asf6VwLryeD1wS3mWJPXIvGfu2TBdZs8oj5P9Ve2NwB1lu0eBlRGxuvOhSpJaFZkny+myUsRpwG7g1cBnM/PGiLgdeAONM/udwLbMfCEi7gVuysxHyrY7gRszc9eMfW4BtgAMDg5eMj4+3lYB09PTDAwMtLVtp/ZNHet5n4Mr4JWrzu55v/3Sz+PbL8utZutt3+jo6O7MHJ5tWUt3y2Tmi8CGiFgJ3B0RFwEfBn4IvBwYA24E/rzVQWXmWNmO4eHhbPf7jfv5XdCb+3S3zDV+93XVllvN1tsdp3S3TGY+BzwEXJGZh8qllxeAfwQuLatNAWubNju/tEmSeqSVu2XOK2fsRMQK4K3At09cR4+IAK4G9pdNdgDXlbtmLgOOZeahLoxdkjSHVi7LrAa2l+vuLwPuzMx7I+LrEXEeEMAe4A/K+vcDVwGTwM+A9y34qCVJJzVvuGfmXuB1s7RfPsf6CdzQ+dAkSe3yE6qSVCHDXZIqZLhLUoUMd0mqkOEuSRUy3CWpQoa7JFXIcJekChnuklQhw12SKmS4S1KFDHdJqpDhLkkVMtwlqUKGuyRVyHCXpAoZ7pJUIcNdkipkuEtShQx3SarQvOEeEb8SEY9FxLci4kBEfKy0XxAR34iIyYj4ckS8vLSfWeYny/KhLtcgSZqhlTP3F4DLM/O1wAbgioi4DPhL4FOZ+WrgKHB9Wf964Ghp/1RZT5LUQ/OGezZMl9kzyiOBy4G7Svt24OoyvbHMU5a/JSJioQYsSZpfZOb8K0WcBuwGXg18Fvhr4NFydk5ErAUeyMyLImI/cEVmPlOWfRd4fWb+aMY+twBbAAYHBy8ZHx9vq4Dp6WkGBgba2rZT+6aO9bzPwRXwylVn97zffunn8e2X5Vaz9bZvdHR0d2YOz7bs9FZ2kJkvAhsiYiVwN/A7nQ4qM8eAMYDh4eEcGRlpaz8TExO0u22nNm+7r+d9bl1/nGv6VG8/9PP49styq9l6u+OU7pbJzOeAh4A3ACsj4sR/DucDU2V6ClgLUJafDfx4IQYrSWpNK3fLnFfO2ImIFcBbgSdohPy7ymqbgHvK9I4yT1n+9Wzl2o8kacG0cllmNbC9XHd/GXBnZt4bEY8D4xHxF8B/ALeW9W8FPh8Rk8CzwLVdGLck6STmDffM3Au8bpb27wGXztL+X8DvLsjoJElt8ROqklQhw12SKmS4S1KFDHdJqpDhLkkVMtwlqUKGuyRVyHCXpAoZ7pJUIcNdkipkuEtShQx3SaqQ4S5JFTLcJalChrskVchwl6QKGe6SVCHDXZIqZLhLUoUMd0mq0LzhHhFrI+KhiHg8Ig5ExAdL+0cjYioi9pTHVU3bfDgiJiPiyYh4ezcLkCT9stNbWOc4sDUzvxkRrwB2R8SDZdmnMvNvmleOiAuBa4HXAL8O/FtE/FZmvriQA5ckzW3eM/fMPJSZ3yzTPwGeANacZJONwHhmvpCZTwOTwKULMVhJUmsiM1tfOWIIeBi4CPgjYDPwPLCLxtn90Yj4DPBoZn6hbHMr8EBm3jVjX1uALQCDg4OXjI+Pt1XA9PQ0AwMDbW3bqX1Tx3re5+AKeOWqs3veb7/08/j2y3Kr2XrbNzo6ujszh2db1splGQAiYgD4CvChzHw+Im4BPg5keb4ZeH+r+8vMMWAMYHh4OEdGRlrd9BdMTEzQ7rad2rztvp73uXX9ca7pU7390M/j2y/LrWbr7Y6W7paJiDNoBPsXM/OrAJl5ODNfzMz/BT7H/196mQLWNm1+fmmTJPVIK3fLBHAr8ERmfrKpfXXTau8E9pfpHcC1EXFmRFwArAMeW7ghS5Lm08plmTcC7wX2RcSe0vYR4N0RsYHGZZmDwO8DZOaBiLgTeJzGnTY3eKeMJPXWvOGemY8AMcui+0+yzSeAT3QwLklSB/yEqiRVyHCXpAoZ7pJUIcNdkipkuEtShVr+hKoWj6E+fDL2hIM3vaNvfUtqnWfuklQhw12SKmS4S1KFDHdJqpDhLkkVMtwlqUKGuyRVyHCXpAoZ7pJUIcNdkipkuEtShQx3SaqQ4S5JFTLcJalC84Z7RKyNiIci4vGIOBARHyztqyLiwYh4qjyfU9ojIj4dEZMRsTciLu52EZKkX9TKmftxYGtmXghcBtwQERcC24CdmbkO2FnmAa4E1pXHFuCWBR+1JOmk5g33zDyUmd8s0z8BngDWABuB7WW17cDVZXojcEc2PAqsjIjVCz1wSdLcIjNbXzliCHgYuAj4z8xcWdoDOJqZKyPiXuCmzHykLNsJ3JiZu2bsawuNM3sGBwcvGR8fb6uA6elpBgYG2tq2U/umjvW8z8EVcPjnPe/2JevXnN3T/vp5fPtludVsve0bHR3dnZnDsy1r+c/sRcQA8BXgQ5n5fCPPGzIzI6L1/yUa24wBYwDDw8M5MjJyKpu/ZGJigna37dTmPvy5u63rj3Pzvv79dcSD7xnpaX/9PL79stxqtt7uaOlumYg4g0awfzEzv1qaD5+43FKej5T2KWBt0+bnlzZJUo+0crdMALcCT2TmJ5sW7QA2lelNwD1N7deVu2YuA45l5qEFHLMkaR6t/H7/RuC9wL6I2FPaPgLcBNwZEdcD3weuKcvuB64CJoGfAe9byAFLkuY3b7iXN0ZjjsVvmWX9BG7ocFySpA74CVVJqpDhLkkVMtwlqUKGuyRVyHCXpAoZ7pJUIcNdkipkuEtShQx3SaqQ4S5JFTLcJalChrskVchwl6QKGe6SVCHDXZIqZLhLUoUMd0mqkOEuSRUy3CWpQvOGe0TcFhFHImJ/U9tHI2IqIvaUx1VNyz4cEZMR8WREvL1bA5ckza2VM/fbgStmaf9UZm4oj/sBIuJC4FrgNWWbv4uI0xZqsJKk1swb7pn5MPBsi/vbCIxn5guZ+TQwCVzawfgkSW3o5Jr7ByJib7lsc05pWwP8oGmdZ0qbJKmHIjPnXyliCLg3My8q84PAj4AEPg6szsz3R8RngEcz8wtlvVuBBzLzrln2uQXYAjA4OHjJ+Ph4WwVMT08zMDDQ1rad2jd1rOd9Dq6Awz/vebcvWb/m7J7218/j2y/LrWbrbd/o6OjuzByebdnp7ewwMw+fmI6IzwH3ltkpYG3TqueXttn2MQaMAQwPD+fIyEg7Q2FiYoJ2t+3U5m339bzPreuPc/O+tg7bgjj4npGe9tfP49svy61m6+2Oti7LRMTqptl3AifupNkBXBsRZ0bEBcA64LHOhihJOlXzngJGxJeAEeDciHgG+DNgJCI20LgscxD4fYDMPBARdwKPA8eBGzLzxa6MXJI0p3nDPTPfPUvzrSdZ/xPAJzoZlCSpM35CVZIqZLhLUoUMd0mqkOEuSRUy3CWpQoa7JFXIcJekChnuklQhw12SKmS4S1KFDHdJqpDhLkkVMtwlqUKGuyRVyHCXpAoZ7pJUIcNdkipkuEtShQx3SaqQ4S5JFZo33CPitog4EhH7m9pWRcSDEfFUeT6ntEdEfDoiJiNib0Rc3M3BS5Jm18qZ++3AFTPatgE7M3MdsLPMA1wJrCuPLcAtCzNMSdKpmDfcM/Nh4NkZzRuB7WV6O3B1U/sd2fAosDIiVi/QWCVJLYrMnH+liCHg3sy8qMw/l5kry3QARzNzZUTcC9yUmY+UZTuBGzNz1yz73ELj7J7BwcFLxsfH2ypgenqagYGBtrbt1L6pYz3vc3AFHP55z7t9yfo1Z/e0v34e335ZbjVbb/tGR0d3Z+bwbMtO73TnmZkRMf//EL+83RgwBjA8PJwjIyNt9T8xMUG723Zq87b7et7n1vXHuXlfx4etbQffM9LT/vp5fPtludVsvd3R7t0yh09cbinPR0r7FLC2ab3zS5skqYfaDfcdwKYyvQm4p6n9unLXzGXAscw81OEYJUmnaN7f7yPiS8AIcG5EPAP8GXATcGdEXA98H7imrH4/cBUwCfwMeF8XxixJmse84Z6Z755j0VtmWTeBGzod1KnYN3WsL9e+JWkx8xOqklQhw12SKmS4S1KFDHdJqpDhLkkVMtwlqUKGuyRVyHCXpAoZ7pJUIcNdkipkuEtShQx3SapQ//7qg5akoR5/SdvW9cfZvO0+Dt70jp72Ky11nrlLUoUMd0mqkOEuSRUy3CWpQoa7JFXIcJekChnuklShju5zj4iDwE+AF4HjmTkcEauALwNDwEHgmsw82tkwJUmnYiHO3Eczc0NmDpf5bcDOzFwH7CzzkqQe6sZlmY3A9jK9Hbi6C31Ikk4iMrP9jSOeBo4CCfxDZo5FxHOZubIsD+DoifkZ224BtgAMDg5eMj4+3tYYjjx7jMM/b2/8S9HgCpZlvevXnN3vofTM9PQ0AwMD/R5Gz1hv+0ZHR3c3XTX5BZ1+t8ybMnMqIl4JPBgR325emJkZEbP+75GZY8AYwPDwcI6MjLQ1gL/94j3cvG/5fEXO1vXHl2W9B98z0u+h9MzExATt/ntYiqy3Ozq6LJOZU+X5CHA3cClwOCJWA5TnI50OUpJ0atoO94g4KyJecWIaeBuwH9gBbCqrbQLu6XSQkqRT08nv94PA3Y3L6pwO/FNm/ktE/DtwZ0RcD3wfuKbzYUqSTkXb4Z6Z3wNeO0v7j4G3dDIoSVJn/ISqJFXIcJekChnuklQhw12SKmS4S1KFDHdJqtDy+Ry7lrShbff1re+DN72jb31L7fLMXZIqZLhLUoUMd0mqkOEuSRUy3CWpQoa7JFXIcJekChnuklQhw12SKmS4S1KF/PoBaR69/uqDreuPs3nbfX7tgTrimbskVchwl6QKdS3cI+KKiHgyIiYjYlu3+pEk/bKuhHtEnAZ8FrgSuBB4d0Rc2I2+JEm/rFtvqF4KTGbm9wAiYhzYCDzepf6k6vTzO+x76cQbyMvFzHq79cZ5ZObC7zTiXcAVmfl7Zf69wOsz8wNN62wBtpTZ3waebLO7c4EfdTDcpcZ667fcarbe9v1GZp4324K+3QqZmWPAWKf7iYhdmTm8AENaEqy3fsutZuvtjm69oToFrG2aP7+0SZJ6oFvh/u/Auoi4ICJeDlwL7OhSX5KkGbpyWSYzj0fEB4CvAacBt2XmgW70xQJc2llirLd+y61m6+2CrryhKknqLz+hKkkVMtwlqUJLNtxr+nqDiDgYEfsiYk9E7CptqyLiwYh4qjyfU9ojIj5d6t4bERc37WdTWf+piNjUr3pmExG3RcSRiNjf1LZgNUbEJeVnOFm2jd5W+IvmqPejETFVjvOeiLiqadmHy9ifjIi3N7XP+jovNyt8o7R/udy40DcRsTYiHoqIxyPiQER8sLRXeYxPUu/iOcaZueQeNN6k/S7wKuDlwLeAC/s9rg7qOQicO6Ptr4BtZXob8Jdl+irgASCAy4BvlPZVwPfK8zll+px+19ZUz5uBi4H93agReKysG2XbKxdhvR8F/niWdS8sr+EzgQvKa/u0k73OgTuBa8v03wN/2Od6VwMXl+lXAN8pdVV5jE9S76I5xkv1zP2lrzfIzP8GTny9QU02AtvL9Hbg6qb2O7LhUWBlRKwG3g48mJnPZuZR4EHgih6PeU6Z+TDw7IzmBamxLPvVzHw0G/8S7mjaV1/MUe9cNgLjmflCZj4NTNJ4jc/6Oi9nrJcDd5Xtm392fZGZhzLzm2X6J8ATwBoqPcYnqXcuPT/GSzXc1wA/aJp/hpP/YBe7BP41InZH42sZAAYz81CZ/iEwWKbnqn0p/kwWqsY1ZXpm+2L0gXIZ4rYTlyg49Xp/DXguM4/PaF8UImIIeB3wDZbBMZ5RLyySY7xUw702b8rMi2l8i+YNEfHm5oXlTKXqe1aXQ43ALcBvAhuAQ8DNfR1NF0TEAPAV4EOZ+XzzshqP8Sz1LppjvFTDvaqvN8jMqfJ8BLibxq9qh8uvopTnI2X1uWpfij+ThapxqkzPbF9UMvNwZr6Ymf8LfI7GcYZTr/fHNC5jnD6jva8i4gwaQffFzPxqaa72GM9W72I6xks13Kv5eoOIOCsiXnFiGngbsJ9GPSfuFNgE3FOmdwDXlbsNLgOOlV97vwa8LSLOKb8Kvq20LWYLUmNZ9nxEXFauVV7XtK9F40TIFe+kcZyhUe+1EXFmRFwArKPx5uGsr/NyBvwQ8K6yffPPri/Kz/1W4InM/GTToiqP8Vz1Lqpj3K93mzt90Hi3/Ts03mn+036Pp4M6XkXjHfJvAQdO1ELjmttO4Cng34BVpT1o/CGU7wL7gOGmfb2fxhs1k8D7+l3bjDq/ROPX1P+hcf3w+oWsERgu/5C+C3yG8unrRVbv50s9e8s/9tVN6/9pGfuTNN0FMtfrvLxuHis/h38GzuxzvW+iccllL7CnPK6q9RifpN5Fc4z9+gFJqtBSvSwjSToJw12SKmS4S1KFDHdJqpDhLkkVMtwlqUKGuyRV6P8AE8dw10s3oFsAAAAASUVORK5CYII=\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"def get_words_per_doc(txt):\\n\",\n    \"    # split text into words and count them.\\n\",\n    \"    return len(txt.split()) \\n\",\n    \"\\n\",\n    \"# apply to our dataframe\\n\",\n    \"df['num_words'] = df['opinion_text'].apply(get_words_per_doc)\\n\",\n    \"df['num_words'].hist()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 302,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T09:35:42.316770Z\",\n     \"start_time\": \"2022-02-25T09:35:42.234336Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# plot length by year\\n\",\n    \"ax = df.groupby('year')['num_words'].mean().plot()\\n\",\n    \"ax.set_ylabel('Average Opinion Length')\\n\",\n    \"import matplotlib.pyplot as plt\\n\",\n    \"plt.show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 303,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T09:35:44.161062Z\",\n     \"start_time\": \"2022-02-25T09:35:43.959415Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<seaborn.axisgrid.JointGrid at 0x32c9c65b0>\"\n      ]\n     },\n     \"execution_count\": 303,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x432 with 3 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"df['log_words'] = np.log(df['num_words'])\\n\",\n    \"import seaborn as sns\\n\",\n    \"sns.jointplot(data=df,x='year', y='log_words',kind='hex')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Build a frequency distribution over words with `Counter`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 304,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T09:37:22.448696Z\",\n     \"start_time\": \"2022-02-25T09:37:22.317909Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[('the', 32485),\\n\",\n       \" ('of', 16429),\\n\",\n       \" ('to', 12675),\\n\",\n       \" ('a', 9144),\\n\",\n       \" ('that', 8737),\\n\",\n       \" ('in', 8484),\\n\",\n       \" ('and', 7815),\\n\",\n       \" ('at', 5172),\\n\",\n       \" ('for', 4569),\\n\",\n       \" ('is', 4115),\\n\",\n       \" ('not', 3658),\\n\",\n       \" ('l.', 3297),\\n\",\n       \" ('ed.', 3273),\\n\",\n       \" ('as', 3108),\\n\",\n       \" ('or', 2956),\\n\",\n       \" ('s.', 2904),\\n\",\n       \" ('ct.', 2805),\\n\",\n       \" ('§', 2752),\\n\",\n       \" ('court', 2667),\\n\",\n       \" ('on', 2666)]\"\n      ]\n     },\n     \"execution_count\": 304,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"from collections import Counter\\n\",\n    \"freqs = Counter()\\n\",\n    \"for i, row in df.iterrows():\\n\",\n    \"    freqs.update(row['opinion_text'].lower().split())\\n\",\n    \"    if i > 100:\\n\",\n    \"        break\\n\",\n    \"freqs.most_common()[:20] # can use most frequent words as style/function words\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"toc-hr-collapsed\": false\n   },\n   \"source\": [\n    \"# Dictionary / Matching Methods\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Sentiment Analysis\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 261,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T08:49:07.616803Z\",\n     \"start_time\": \"2022-02-25T08:49:07.610484Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"3.2.2\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"import spacy\\n\",\n    \"from spacytextblob.spacytextblob import SpacyTextBlob\\n\",\n    \"print (spacy.__version__)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 262,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T08:49:09.741266Z\",\n     \"start_time\": \"2022-02-25T08:49:08.751772Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"polarity 0.05404135338345859\\n\",\n      \"subjectivity 0.5065358709273183\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Dictionary-Based Sentiment Analysis\\n\",\n    \"# nltk.download('vader_lexicon')\\n\",\n    \"\\n\",\n    \"# textblob sentiment analysis: https://github.com/sloria/TextBlob\\n\",\n    \"# pip install spacytextblob\\n\",\n    \"\\n\",\n    \"import spacy\\n\",\n    \"from spacytextblob.spacytextblob import SpacyTextBlob\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"nlp = spacy.load('en_core_web_sm')\\n\",\n    \"# spacy_text_blob = SpacyTextBlob()\\n\",\n    \"nlp.add_pipe('spacytextblob')\\n\",\n    \"doc = nlp(df.iloc[0][\\\"opinion_text\\\"])\\n\",\n    \"#from nltk.sentiment.vader import SentimentIntensityAnalyzer\\n\",\n    \"#sid = SentimentIntensityAnalyzer()\\n\",\n    \"#polarity = sid.polarity_scores(text)\\n\",\n    \"print(\\\"polarity\\\", doc._.polarity) # sentimentintensityanalayzer nltk: {'neg': 0.134, 'neu': 0.785, 'pos': 0.081, 'compound': -0.9999}\\n\",\n    \"print (\\\"subjectivity\\\", doc._.subjectivity)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 263,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T08:50:48.585836Z\",\n     \"start_time\": \"2022-02-25T08:49:12.565542Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# sample 10% of the dataset\\n\",\n    \"dfs = df.sample(frac=.1) \\n\",\n    \"# apply compound sentiment score to data-frame\\n\",\n    \"def get_sentiment(snippet):\\n\",\n    \"    #return sid.polarity_scores(snippet)['compound']\\n\",\n    \"    return nlp(snippet)._.polarity\\n\",\n    \"dfs['sentiment'] = dfs['opinion_text'].apply(get_sentiment)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 264,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T08:50:48.590377Z\",\n     \"start_time\": \"2022-02-25T08:50:48.586905Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[' \\\\n\\\\n This case presents the question whether uses of patented inventions in preclinical research, the',\\n\",\n       \" 't. \\\\n\\\\n This case requires us to decide whether the use of race as a factor in student admissions by t',\\n\",\n       \" ' \\\\n\\\\n  The State of Washington prohibits labor unions from using the agency-shop fees of a nonmember f',\\n\",\n       \" ' \\\\n\\\\n The question is whether the provision of the Fair Labor Standards Act of 1938 (FLSA or Act), tha',\\n\",\n       \" \\\"t. \\\\n\\\\n We granted certiorari to resolve whether the Nevada Supreme Court's refusal to extend full fai\\\"]\"\n      ]\n     },\n     \"execution_count\": 264,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"dfs.sort_values('sentiment',inplace=True)\\n\",\n    \"# print beginning of most positive documents\\n\",\n    \"[x[50:150] for x  in dfs[-5:]['opinion_text']]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 265,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T08:50:48.593796Z\",\n     \"start_time\": \"2022-02-25T08:50:48.591101Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['\\\\n\\\\nThe False Claims Act (FCA) imposes civil liability on any person who knowingly uses a \\\"false recor',\\n\",\n       \" ' \\\\n\\\\nWhen an alien is found ineligible to remain in the United States, the process for selecting the c',\\n\",\n       \" 'he Court. \\\\n\\\\n Petitioner Josue Leocal, a Haitian citizen who is a lawful permanent resident of the Un',\\n\",\n       \" \\\" \\\\n\\\\n Respondent Arturo Recuenco was convicted of assault in the second degree based on the jury's fin\\\",\\n\",\n       \" 'he Court. \\\\n\\\\n InTotten v. United States,92 U.S. 105, 23 L. Ed. 605 (1876), we held that public policy']\"\n      ]\n     },\n     \"execution_count\": 265,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# print beginning of most negative documents\\n\",\n    \"[x[50:150] for x  in dfs[:5]['opinion_text']]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 266,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T08:51:03.211610Z\",\n     \"start_time\": \"2022-02-25T08:50:58.841088Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[' Court. \\\\n\\\\n  Under the Internal Revenue Code, individuals may subtract from their adjusted gross inco',\\n\",\n       \" 't and delivered an opinion, in which Justice Souter, Justice Ginsburg, and Justice Breyer join. \\\\n\\\\n T',\\n\",\n       \" '.\\\\n\\\\nA citizen of Hawaii comes before us claiming that an explicit, race-based voting qualification ha',\\n\",\n       \" 't and delivered the opinion of the Court with respect to Parts I, II, III, and VI, an opinion with r',\\n\",\n       \" 't. \\\\n\\\\n  For private actions brought under 42 U.S.C. § 1983 and other specified measures designed to s']\"\n      ]\n     },\n     \"execution_count\": 266,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"from nltk.sentiment.vader import SentimentIntensityAnalyzer\\n\",\n    \"sid = SentimentIntensityAnalyzer()\\n\",\n    \"# sample 20% of the dataset\\n\",\n    \"dfs = df.sample(frac=.1) \\n\",\n    \"\\n\",\n    \"# apply compound sentiment score to data-frame\\n\",\n    \"def get_sentiment(snippet):\\n\",\n    \"    return sid.polarity_scores(snippet)['compound']\\n\",\n    \"dfs['sentiment_vader'] = dfs['opinion_text'].apply(get_sentiment)\\n\",\n    \"dfs.sort_values('sentiment_vader',inplace=True)\\n\",\n    \"# print beginning of most positive documents\\n\",\n    \"[x[50:150] for x  in dfs[-5:]['opinion_text']]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Sentiment Analysis with Huggingface \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 206,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T08:06:44.820739Z\",\n     \"start_time\": \"2022-02-25T08:06:33.006201Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stderr\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"No model was supplied, defaulted to distilbert-base-uncased-finetuned-sst-2-english (https://huggingface.co/distilbert-base-uncased-finetuned-sst-2-english)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"from transformers import pipeline, AutoModelForTokenClassification, AutoTokenizer\\n\",\n    \"pipe = pipeline(\\\"sentiment-analysis\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 225,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T08:12:48.077724Z\",\n     \"start_time\": \"2022-02-25T08:12:33.578170Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"4a535366d00343c9b7130ea1443f84d1\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/plain\": [\n       \"  0%|          | 0/768 [00:00<?, ?it/s]\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"from torch.utils.data import Dataset\\n\",\n    \"from tqdm.auto import tqdm\\n\",\n    \"\\n\",\n    \"class OpinionDataset(Dataset):\\n\",\n    \"    def __init__(self, df):\\n\",\n    \"        super().__init__()\\n\",\n    \"        self.df = df\\n\",\n    \"    def __len__(self):\\n\",\n    \"        return len(df)\\n\",\n    \"\\n\",\n    \"    def __getitem__(self, i):\\n\",\n    \"        return df.iloc[i][\\\"opinion_text\\\"][:512] # BERT max seq length\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"dataset = OpinionDataset(df)\\n\",\n    \"sentiments = []\\n\",\n    \"\\n\",\n    \"for out in tqdm(pipe(dataset, batch_size=16), total=len(dataset)):\\n\",\n    \"        if out['label'] == \\\"NEGATIVE\\\":\\n\",\n    \"            sentiments.append(-1*out['score'])\\n\",\n    \"        else:\\n\",\n    \"            sentiments.append(out['score'])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 213,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T08:08:31.770176Z\",\n     \"start_time\": \"2022-02-25T08:08:31.762865Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"df['sentiments'] = sentiments\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 214,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T08:08:32.130342Z\",\n     \"start_time\": \"2022-02-25T08:08:32.122275Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['. \\\\n\\\\nLiberty protects the person from unwarranted government intrusions into a dwelling or other priv',\\n\",\n       \" '. \\\\n\\\\nPetitioner Edward Jerome Harbison was sentenced to death by a Tennessee court in 1983.  In 1997,',\\n\",\n       \" '\\\\n\\\\nThis case concerns the timeliness of a complaint filed in a private securities fraud action.  The ',\\n\",\n       \" \\\"\\\\n\\\\n When a debtor files a Chapter 7 bankruptcy petition, all of the debtor's assets become property o\\\",\\n\",\n       \" '. \\\\n\\\\n The question before us is whether the Controlled Substances Act allows the United States Attorn']\"\n      ]\n     },\n     \"execution_count\": 214,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"df.sort_values('sentiments',inplace=True)\\n\",\n    \"# print beginning of most positive documents\\n\",\n    \"[x[50:150] for x  in df[-5:]['opinion_text']]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 215,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T08:08:40.938052Z\",\n     \"start_time\": \"2022-02-25T08:08:40.924251Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[\\\" \\\\n\\\\n Officers executing a warrant to search for cocaine in respondent Banks's apartment knocked and a\\\",\\n\",\n       \" ' and delivered the opinion of the Court with respect to Parts I, II, and III-A, and an opinion with ',\\n\",\n       \" 't.\\\\n\\\\nThe question presented in this case is whether an anonymous tip that a person is carrying a gun ',\\n\",\n       \" 't.\\\\n\\\\nPetitioner, a nonnamed member of a class certified under Federal Rule of Civil Procedure 23(b)(1',\\n\",\n       \" 'The issue is whether the Burma law of the Commonwealth of Massachusetts, restricting the authority o']\"\n      ]\n     },\n     \"execution_count\": 215,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# print beginning of most negative documents\\n\",\n    \"[x[50:150] for x  in df[:5]['opinion_text']]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## StopWords\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 84,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-21T10:19:55.651335Z\",\n     \"start_time\": \"2022-02-21T10:19:55.649820Z\"\n    },\n    \"scrolled\": true\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"{'quite', 'herself', 'below', 'on', 'per', 'if', 'from', 'under', 'already', 'rather', 'seemed', 'seeming', 'nine', 'and', 'whither', 'among', 'many', 'can', '‘m', 'hence', 'yourself', 'always', 'some', 'yet', 'whom', 'within', 'sometimes', 'for', 'move', 'eight', '’ve', 'formerly', 'we', 'latterly', 'herein', 'third', 'whose', 'due', 'cannot', 'back', '‘s', 'five', 'used', 'more', 'again', \\\"'m\\\", 'or', 'unless', 'during', 'before', 'towards', 'where', 'serious', 'somehow', 'my', 'after', 'itself', 'various', 'the', 'once', 'show', 'whole', 'done', 'hundred', 'mostly', 'onto', 'this', 'yours', 'without', 'above', 'until', 'both', 'its', 'those', 'few', 'say', 'himself', 'then', 'former', 'often', 'doing', 'against', 'beyond', 'else', 'not', 'be', 'all', 'his', 'toward', 'became', 'an', 'indeed', 'who', 'will', 'she', 'would', 'yourselves', 'i', 'only', \\\"'re\\\", 'next', \\\"n't\\\", 'with', 'him', 'either', 'neither', 'made', 'latter', 'is', 'moreover', 'front', 'none', 'give', 'four', 'top', 'over', 'whereby', 'beside', 'empty', 'might', 'others', 'may', 'therein', 'beforehand', 'hereupon', 'whereupon', 'twenty', 'ca', 'go', 'thereupon', 'no', 'somewhere', \\\"'ve\\\", 'now', 'ten', 'six', '‘d', 'become', 'fifty', 'was', 'ours', 'meanwhile', 'anything', 'everywhere', 'whatever', 'into', 'own', 'between', 'forty', 'sometime', 'up', 'seem', 'everything', '’ll', 'been', 'such', 'myself', 'take', 'also', 'eleven', '’m', 'nobody', 'therefore', 'you', 'her', 'our', 'which', 'someone', 'anyone', 'please', 'every', 'same', 'what', 'that', 'of', 'should', 'full', \\\"'d\\\", 'alone', 'hereafter', 'three', 'because', 'never', 'something', 'while', 'whenever', 'very', 'here', 'through', 'one', 'whoever', 'why', 'least', 'anyhow', 'nothing', 'had', 'throughout', 'at', 'thereafter', 'hereby', 'me', '’d', 'in', 'although', 'thru', 'two', 'otherwise', 'out', 'regarding', 'via', 'however', 'keep', 'though', 'across', 'see', 'behind', 'thereby', 're', 'everyone', 'sixty', 'their', 'fifteen', 'how', 'perhaps', 'last', 'afterwards', 'n’t', 'other', 'first', 'ever', 'off', 'upon', 'amongst', 'whence', 'well', 'themselves', 'twelve', \\\"'ll\\\", 'am', 'thus', 'mine', '‘ve', 'even', 'he', 'whereas', 'did', 'several', '‘ll', 'than', 'really', 'there', 'nevertheless', 'as', 'less', 'besides', 'along', 'any', 'get', 'further', 'so', 'thence', 'name', 'hers', 'have', 'wherein', 'but', 'they', 'nowhere', 'being', 'these', 'most', 'much', '’re', 'about', 'another', 'make', 'do', 'down', '’s', 'seems', 'bottom', 'noone', 'your', 'when', 'elsewhere', 'enough', 'does', 'by', 'namely', 'ourselves', '‘re', 'still', 'becoming', 'each', 'them', 'are', 'around', 'a', 'it', 'us', 'to', 'amount', 'anywhere', 'whereafter', 'must', 'just', 'could', 'n‘t', 'call', 'together', 'were', 'side', 'part', 'almost', 'has', 'anyway', 'using', 'nor', 'since', 'whether', \\\"'s\\\", 'becomes', 'too', 'put', 'except', 'wherever'}\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"#from nltk.corpus import stopwords\\n\",\n    \"#stopwords = set(stopwords.words('english'))\\n\",\n    \"#stopwords\\n\",\n    \"from spacy.lang.en import stop_words\\n\",\n    \"print (stop_words.STOP_WORDS)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 85,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-21T10:19:55.654433Z\",\n     \"start_time\": \"2022-02-21T10:19:55.652082Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"191526\"\n      ]\n     },\n     \"execution_count\": 85,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#stopfreq = np.sum([freqs[x] for x in stopwords])\\n\",\n    \"#stopfreq # 174132 for NLTK stopwords\\n\",\n    \"stopwords = stop_words.STOP_WORDS\\n\",\n    \"stopfreq = np.sum([freqs[x] for x in stopwords])\\n\",\n    \"stopfreq\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 86,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-21T10:19:55.663598Z\",\n     \"start_time\": \"2022-02-21T10:19:55.655124Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"306516\"\n      ]\n     },\n     \"execution_count\": 86,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"otherfreq = np.sum([freqs[x] for x in freqs if x not in stopwords])\\n\",\n    \"otherfreq\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## RegEx\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Please refer to [RegExOne Regular Expressions Lessons](regexone.com) and [the python documentation](https://docs.python.org/3/howto/regex.html).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 140,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-24T19:55:30.599081Z\",\n     \"start_time\": \"2022-02-24T19:55:30.582719Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"['Justice Kennedy ', 'justice that ', 'Justice Alito ']\\n\",\n      \"['Justice Breyer ']\\n\",\n      \"['Justice Kennedy ', 'Justice Calogero ', 'justice that ', 'Justice Brennan ', 'Justice Marshall ', 'justice is ']\\n\",\n      \"['Justice Breyer ', 'Justice Alito ']\\n\",\n      \"['Justice Thomas ', 'Justice Souter ', 'justice system ']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"import re\\n\",\n    \"\\n\",\n    \"docs = dfs[:5]['opinion_text']\\n\",\n    \"\\n\",\n    \"# Extract words after justice.\\n\",\n    \"for doc in docs:    \\n\",\n    \"    print(re.findall(r'Justice \\\\w+ ', # pattern to match. always put 'r' in front of string so that backslashes are treated literally.\\n\",\n    \"                     doc,            # string\\n\",\n    \"                     re.IGNORECASE))  # ignore upper/lowercase (optional)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 141,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-24T19:55:36.006992Z\",\n     \"start_time\": \"2022-02-24T19:55:35.971925Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"['state-court', 'father-in', 'cross-examination', 'right-side', 'ex-husband', 'blood-type', 'blood-group', 'blood-type', 'O-type', 'blood-type', 'cross-examination', 'ninety-three', 'guilt-phase', 'court-appointed', 'jury-instructions', 'ineffective-assistance', 'state-law', 'six-judge', 'eight-judge', 'actual-innocence', 'real-life', 'who-done', 'state-court', 'miscarriage-of', 'actual-innocence', 'actual-innocence', 'sentencing-related', 'reasonable-doubt', 'guilt-phase', 'blood-caked', 'half-full', 'cross-examination', 'cross-examine', 'post-trial', 'self-described', 'knocked-over', 'eleventh-hour']\\n\",\n      \"['state-court', 'one-third', 'ingle-digit', 'error-free', 'error-free']\\n\",\n      \"['year-old', 'T-shirt', 'drive-by', 'sixty-five', 'ex-wife', 'first-degree', 'non-homicide', 'bright-line', 'IV-B', 'state-law', 'state-law', 'Thirty-seven', 'Courts-Martial', 'four-Member', 'year-old', 'year-old', 'state-court', 'year-olds', 'year-old', 'Long-Term', 'case-specific', 'Woodson-Lockett', 'first-degree', 'first-degree', 'Inter-University', 'Incident-Based', 'first-degree', 'first-time', 'common-sense', 'cold-blooded', 'III-D', 'IV-A', 'long-term', 'abuse-related', 'year-olds', 'Goodman-Brown', 'consensus-making']\\n\",\n      \"['pro-life', 'anti-abortion', 'pro-choice', 'pro-choice', 'pro-life', 'pro-life', 'clinic-related', 'extortion-related', 'extortion-related', 'extortion-related', 'Allied-Bruce', 'Anti-Racketeering', 'Anti-Racketeering', 'non-property', 'Anti-Racketeering', 'bona-fide', 'bona-fide', 'bona-fide', 'bona-fide', 'Anti-Racketeering']\\n\",\n      \"['month-old', 'first-degree', 'first-degree', 'third-party', 'state-court', 'death-eligible', 'death-eligible', 'death-eligible', 'death-eligible', 'Furman-type', 'well-established', 'guilt-phase', 'Bedau-Radelet', 'bright-line']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Extract hyphenated words\\n\",\n    \"for doc in docs:    \\n\",\n    \"    print(re.findall(r'[a-z]+-[a-z]+', \\n\",\n    \"                     doc,            \\n\",\n    \"                     re.IGNORECASE))  \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 142,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-24T19:55:55.577176Z\",\n     \"start_time\": \"2022-02-24T19:55:55.538386Z\"\n    },\n    \"scrolled\": true\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"0 (792, 804) 513 U.S. 298\\n\",\n      \"0 (8282, 8290) 9 and 11\\n\",\n      \"0 (8535, 8544) 7 Tr. 985\\n\",\n      \"0 (10385, 10393) 30 or 10\\n\",\n      \"0 (17080, 17089) 6 Tr. 864\\n\",\n      \"0 (22356, 22367) 10 Tr. 1410\\n\",\n      \"0 (23416, 23430) 743 S.W.2d 141\\n\",\n      \"0 (24205, 24217) 498 U.S. 912\\n\",\n      \"0 (24917, 24935) 111 (repealed 1995\\n\",\n      \"0 (24958, 24972) 911 S.W.2d 705\\n\",\n      \"0 (25032, 25045) 517 U.S. 1193\\n\",\n      \"0 (25662, 25674) 505 U.S. 333\\n\",\n      \"0 (26525, 26537) 311 F.3d 767\\n\",\n      \"0 (26666, 26678) 506 U.S. 390\\n\",\n      \"0 (27879, 27891) 539 U.S. 937\\n\",\n      \"0 (28244, 28256) 386 F.3d 668\\n\",\n      \"0 (28857, 28870) 545 U.S. 1151\\n\",\n      \"0 (29143, 29155) 477 U.S. 478\\n\",\n      \"0 (29218, 29230) 456 U.S. 107\\n\",\n      \"0 (29298, 29309) 433 U.S. 72\\n\",\n      \"0 (30883, 30895) 499 U.S. 467\\n\",\n      \"0 (34597, 34609) 443 U.S. 307\\n\",\n      \"0 (35481, 35498) 1996 (AEDPA), 110\\n\",\n      \"0 (36519, 36531) 517 U.S. 314\\n\",\n      \"0 (39216, 39226) 9 Tr. 1302\\n\",\n      \"0 (49546, 49555) 6 Tr. 906\\n\",\n      \"0 (55145, 55155) 7 Tr. 1087\\n\",\n      \"0 (59905, 59913) 30 to 10\\n\",\n      \"1 (1439, 1451) 517 U.S. 559\\n\",\n      \"1 (1846, 1858) 538 U.S. 408\\n\",\n      \"1 (1904, 1916) 540 U.S. 801\\n\",\n      \"1 (4983, 4995) 509 U.S. 443\\n\",\n      \"1 (5440, 5451) 340 Ore. 35\\n\",\n      \"1 (5460, 5468) 127 P. 3\\n\",\n      \"1 (5627, 5635) 127 P. 3\\n\",\n      \"1 (6533, 6545) 418 U.S. 323\\n\",\n      \"1 (6625, 6637) 453 U.S. 247\\n\",\n      \"1 (6728, 6738) 499 U.S. 1\\n\",\n      \"1 (7960, 7972) 512 U.S. 415\\n\",\n      \"1 (8137, 8149) 532 U.S. 424\\n\",\n      \"1 (9380, 9391) 405 U.S. 56\\n\",\n      \"1 (14277, 14285) 127 P. 3\\n\",\n      \"1 (15546, 15554) 127 P. 3\\n\",\n      \"1 (15770, 15778) 127 P. 3\\n\",\n      \"1 (15935, 15943) 127 P. 3\\n\",\n      \"1 (16749, 16761) 515 U.S. 389\\n\",\n      \"1 (17116, 17128) 334 U.S. 728\\n\",\n      \"2 (314, 322) 8 and 14\\n\",\n      \"2 (353, 365) 370 U.S. 660\\n\",\n      \"2 (827, 840) 42 (West 1997\\n\",\n      \"2 (2067, 2075) 20 and 9\\n\",\n      \"2 (5948, 5956) 30 and 7\\n\",\n      \"2 (6821, 6834) 42 (West 1997\\n\",\n      \"2 (8024, 8032) 12 to 13\\n\",\n      \"2 (8163, 8175) 4 (West 1997\\n\",\n      \"2 (9094, 9103) 16 (La. 5\\n\",\n      \"2 (9112, 9121) 957 So. 2\\n\",\n      \"2 (9908, 9920) 2076 (La. 12\\n\",\n      \"2 (9929, 9938) 685 So. 2\\n\",\n      \"2 (10079, 10091) 433 U.S. 584\\n\",\n      \"2 (10556, 10565) 957 So. 2\\n\",\n      \"2 (10893, 10905) 543 U.S. 551\\n\",\n      \"2 (10972, 10984) 536 U.S. 304\\n\",\n      \"2 (11190, 11199) 957 So. 2\\n\",\n      \"2 (12047, 12056) 957 So. 2\\n\",\n      \"2 (12508, 12520) 433 U.S. 917\\n\",\n      \"2 (12749, 12758) 957 So. 2\\n\",\n      \"2 (12795, 12808) 552 U.S. 1087\\n\",\n      \"2 (13654, 13666) 217 U.S. 349\\n\",\n      \"2 (14092, 14103) 356 U.S. 86\\n\",\n      \"2 (14423, 14435) 408 U.S. 238\\n\",\n      \"2 (14913, 14925) 501 U.S. 957\\n\",\n      \"2 (15855, 15867) 428 U.S. 153\\n\",\n      \"2 (16562, 16574) 433 U.S. 584\\n\",\n      \"2 (16887, 16899) 458 U.S. 782\\n\",\n      \"2 (17196, 17208) 481 U.S. 137\\n\",\n      \"2 (19540, 19553) 1930 and 1964\\n\",\n      \"2 (19686, 19694) 262 to 5\\n\",\n      \"2 (20627, 20639) 428 U.S. 280\\n\",\n      \"2 (20808, 20820) 428 U.S. 325\\n\",\n      \"2 (20941, 20955) 550 S.W.2d 643\\n\",\n      \"2 (20957, 20972) 646 (Tenn. 1977\\n\",\n      \"2 (21052, 21061) 403 So. 2\\n\",\n      \"2 (21068, 21082) 951 (Fla. 1981\\n\",\n      \"2 (21173, 21182) 548 So. 2\\n\",\n      \"2 (21193, 21208) 403 (Miss. 1989\\n\",\n      \"2 (22581, 22595) 30 (Supp. 2007\\n\",\n      \"2 (22928, 22942) 108 Stat. 1972\\n\",\n      \"2 (23365, 23376) 243 Ga. 131\\n\",\n      \"2 (23387, 23401) 252 S.E.2d 625\\n\",\n      \"2 (24079, 24090) 283 Ga. 206\\n\",\n      \"2 (24097, 24111) 657 S.E.2d 838\\n\",\n      \"2 (24676, 24685) 403 So. 2\\n\",\n      \"2 (25248, 25257) 721 So. 2\\n\",\n      \"2 (25425, 25434) 453 So. 2\\n\",\n      \"2 (26982, 26997) 70 between 1989\\n\",\n      \"2 (27134, 27147) 1995 and 2005\\n\",\n      \"2 (27535, 27548) 1954 and 1982\\n\",\n      \"2 (28910, 28924) 2000 ed.), 920\\n\",\n      \"2 (35264, 35273) 685 So. 2\\n\",\n      \"2 (35528, 35537) 350 So. 2\\n\",\n      \"2 (35545, 35561) 1360 (Miss. 1977\\n\",\n      \"2 (35925, 35938) 207 Ariz. 261\\n\",\n      \"2 (35951, 35958) 85 P. 3\\n\",\n      \"2 (35973, 35985) 8 (App. 2004\\n\",\n      \"2 (36331, 36340) 30 Cal. 4\\n\",\n      \"2 (36376, 36383) 69 P. 3\\n\",\n      \"2 (36737, 36746) 921 So. 2\\n\",\n      \"2 (36753, 36767) 526 (Fla. 2005\\n\",\n      \"2 (36821, 36830) 695 So. 2\\n\",\n      \"2 (36832, 36846) 691 (Fla. 1997\\n\",\n      \"2 (36868, 36881) 185 Mont. 299\\n\",\n      \"2 (36888, 36901) 605 P.2d 1000\\n\",\n      \"2 (37002, 37014) 947 P.2d 630\\n\",\n      \"2 (37016, 37030) 653 (Utah 1997\\n\",\n      \"2 (37164, 37174) 212 Ill. 2\\n\",\n      \"2 (37186, 37200) 816 N.E.2d 322\\n\",\n      \"2 (38353, 38362) 403 So. 2\\n\",\n      \"2 (38470, 38477) 69 P. 3\\n\",\n      \"2 (41783, 41796) 1986 and 2001\\n\",\n      \"2 (42064, 42077) 1989 and 2005\\n\",\n      \"2 (42483, 42495) 492 U.S. 361\\n\",\n      \"2 (42528, 42542) 306 (1989), 12\\n\",\n      \"2 (42823, 42832) 16 and 18\\n\",\n      \"2 (44657, 44665) 262 to 5\\n\",\n      \"2 (44716, 44728) 487 U.S. 815\\n\",\n      \"2 (49033, 49045) 479 U.S. 538\\n\",\n      \"2 (49250, 49262) 428 U.S. 153\\n\",\n      \"2 (49305, 49317) 408 U.S. 238\\n\",\n      \"2 (49375, 49387) 446 U.S. 420\\n\",\n      \"2 (49981, 49993) 438 U.S. 586\\n\",\n      \"2 (50213, 50225) 512 U.S. 967\\n\",\n      \"2 (50411, 50423) 497 U.S. 639\\n\",\n      \"2 (51219, 51230) 553 U.S. 35\\n\",\n      \"2 (51422, 51435) 510 U.S. 1141\\n\",\n      \"2 (53625, 53637) 458 U.S. 782\\n\",\n      \"2 (58238, 58250) 428 U.S. 262\\n\",\n      \"2 (58509, 58521) 507 U.S. 463\\n\",\n      \"2 (59651, 59663) 428 U.S. 153\\n\",\n      \"2 (63414, 63426) 551 U.S. 930\\n\",\n      \"2 (64865, 64877) 121 (Aug. 26\\n\",\n      \"2 (66509, 66526) 1989 Through 2003\\n\",\n      \"2 (67311, 67322) 480 U.S. 39\\n\",\n      \"3 (2982, 2994) 968 F.2d 612\\n\",\n      \"3 (3221, 3233) 510 U.S. 249\\n\",\n      \"3 (3588, 3600) 267 F.3d 687\\n\",\n      \"3 (3689, 3701) 537 U.S. 393\\n\",\n      \"3 (9304, 9316) 513 U.S. 265\\n\",\n      \"3 (9390, 9402) 471 U.S. 858\\n\",\n      \"3 (9621, 9633) 529 U.S. 848\\n\",\n      \"3 (10188, 10200) 48 Stat. 979\\n\",\n      \"3 (10408, 10420) 48 Stat. 980\\n\",\n      \"3 (11187, 11199) 60 Stat. 420\\n\",\n      \"3 (11426, 11438) 435 U.S. 371\\n\",\n      \"3 (12551, 12563) 60 Stat. 420\\n\",\n      \"3 (14046, 14058) 342 U.S. 246\\n\",\n      \"3 (14322, 14334) 508 U.S. 200\\n\",\n      \"3 (14438, 14450) 353 U.S. 222\\n\",\n      \"3 (15638, 15650) 410 U.S. 396\\n\",\n      \"3 (16083, 16096) 184 F.3d 1071\\n\",\n      \"3 (16134, 16145) 511 F.2d 25\\n\",\n      \"3 (16902, 16914) 348 U.S. 528\\n\",\n      \"3 (17079, 17091) 107 U.S. 147\\n\",\n      \"3 (19939, 19950) 534 U.S. 84\\n\",\n      \"3 (20825, 20837) 48 Stat. 979\\n\",\n      \"3 (22957, 22969) 60 Stat. 420\\n\",\n      \"4 (2389, 2401) 278 Kan. 520\\n\",\n      \"4 (2412, 2420) 102 P. 3\\n\",\n      \"4 (2796, 2804) 102 P. 3\\n\",\n      \"4 (3370, 3383) 544 U.S. 1060\\n\",\n      \"4 (3899, 3911) 420 U.S. 469\\n\",\n      \"4 (4073, 4086) 544 U.S. 1060\\n\",\n      \"4 (6128, 6140) 466 U.S. 380\\n\",\n      \"4 (6220, 6232) 459 U.S. 553\\n\",\n      \"4 (6296, 6308) 467 U.S. 649\\n\",\n      \"4 (6751, 6763) 272 Kan. 894\\n\",\n      \"4 (6765, 6776) 40 P.3d 139\\n\",\n      \"4 (7858, 7871) 463 U.S. 1032\\n\",\n      \"4 (7980, 7992) 497 U.S. 639\\n\",\n      \"4 (8080, 8092) 536 U.S. 584\\n\",\n      \"4 (8597, 8610) 159 Ariz. 571\\n\",\n      \"4 (8612, 8625) 769 P.2d 1017\\n\",\n      \"4 (8759, 8772) 865 F.2d 1011\\n\",\n      \"4 (10835, 10847) 494 U.S. 299\\n\",\n      \"4 (11235, 11247) 494 U.S. 370\\n\",\n      \"4 (11539, 11551) 428 U.S. 280\\n\",\n      \"4 (11638, 11650) 428 U.S. 325\\n\",\n      \"4 (14639, 14652) 191 Ariz. 372\\n\",\n      \"4 (14659, 14671) 956 P.2d 499\\n\",\n      \"4 (14713, 14725) 135 Ariz. 42\\n\",\n      \"4 (14731, 14741) 659 P.2d 1\\n\",\n      \"4 (16698, 16710) 408 U.S. 238\\n\",\n      \"4 (16785, 16797) 428 U.S. 153\\n\",\n      \"4 (17522, 17534) 487 U.S. 164\\n\",\n      \"4 (17627, 17639) 462 U.S. 862\\n\",\n      \"4 (17816, 17828) 506 U.S. 461\\n\",\n      \"4 (17978, 17990) 438 U.S. 586\\n\",\n      \"4 (18590, 18602) 337 U.S. 241\\n\",\n      \"4 (19087, 19099) 455 U.S. 104\\n\",\n      \"4 (19340, 19350) 476 U.S. 1\\n\",\n      \"4 (20227, 20239) 481 U.S. 279\\n\",\n      \"4 (26924, 26936) 428 U.S. 280\\n\",\n      \"4 (27005, 27017) 428 U.S. 325\\n\",\n      \"4 (28944, 28956) 494 U.S. 370\\n\",\n      \"4 (29035, 29047) 271 U.S. 104\\n\",\n      \"4 (29551, 29563) 479 U.S. 538\\n\",\n      \"4 (29967, 29980) 206 -207, 165\\n\",\n      \"4 (33210, 33220) 185 Ill. 2\\n\",\n      \"4 (33232, 33246) 708 N.E.2d 365\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# extract citations\\n\",\n    \"for i, doc in enumerate(docs):\\n\",\n    \"    finder = re.finditer('\\\\d+ [^\\\\s]+ \\\\d+', # pattern to match ([^\\\\s] means non-white-space)\\n\",\n    \"                     doc)            # string\\n\",\n    \"    for m in finder: \\n\",\n    \"        print(i, m.span(),m.group()) # location (start,end) and matching string\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 146,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-24T19:58:23.470487Z\",\n     \"start_time\": \"2022-02-24T19:58:23.465391Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# baker-bloom economic uncertainty\\n\",\n    \"pattern1 = r'(\\\\b)uncertain[a-z]*'\\n\",\n    \"pattern2 = r'(\\\\b)econom[a-z]*'\\n\",\n    \"pattern3 = r'(\\\\b)congress(\\\\b)|(\\\\b)deficit(\\\\b)|(\\\\b)federal reserve(\\\\b)|(\\\\b)legislation(\\\\b)|(\\\\b)regulation(\\\\b)|(\\\\b)white house(\\\\b)'\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 144,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-24T19:57:51.856588Z\",\n     \"start_time\": \"2022-02-24T19:57:51.848343Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<re.Match object; span=(30, 41), match='uncertainty'>\"\n      ]\n     },\n     \"execution_count\": 144,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.search(pattern1,'The White House tried to calm uncertainty in the markets.')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 145,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-24T19:57:57.465095Z\",\n     \"start_time\": \"2022-02-24T19:57:57.455425Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<re.Match object; span=(46, 53), match='economy'>\"\n      ]\n     },\n     \"execution_count\": 145,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.search(pattern2,'The Congress tried to calm uncertainty in the economy.')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 147,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-24T19:58:25.501487Z\",\n     \"start_time\": \"2022-02-24T19:58:25.495322Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"re.search(pattern3,'The Congress tried to calm uncertainty in the markets.')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 148,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-24T19:58:25.891850Z\",\n     \"start_time\": \"2022-02-24T19:58:25.885051Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<re.Match object; span=(4, 12), match='Congress'>\"\n      ]\n     },\n     \"execution_count\": 148,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.search(pattern3,'The Congress tried to calm uncertainty in the markets.', re.IGNORECASE)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 149,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-24T19:58:27.988977Z\",\n     \"start_time\": \"2022-02-24T19:58:27.983865Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def indicates_uncertainty(doc):\\n\",\n    \"    m1 = re.search(pattern1, doc, re.IGNORECASE)\\n\",\n    \"    m2 = re.search(pattern2, doc, re.IGNORECASE)\\n\",\n    \"    m3 = re.search(pattern3, doc, re.IGNORECASE)\\n\",\n    \"    if m1 and m2 and m3:\\n\",\n    \"        return True\\n\",\n    \"    else:\\n\",\n    \"        return False\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 150,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-24T19:58:31.927254Z\",\n     \"start_time\": \"2022-02-24T19:58:31.915697Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 150,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"indicates_uncertainty('The White House tried to calm uncertainty in the economy.')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 151,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-24T19:59:06.550986Z\",\n     \"start_time\": \"2022-02-24T19:59:06.537632Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 151,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"indicates_uncertainty('The White House tried to calm uncertainty in the markets.')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 305,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T09:55:15.135040Z\",\n     \"start_time\": \"2022-02-25T09:55:13.319551Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"df['uncertainty'] = df['opinion_text'].apply(indicates_uncertainty)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 47,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.057291666666666664\"\n      ]\n     },\n     \"execution_count\": 47,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"df.uncertainty.mean()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 48,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<AxesSubplot:xlabel='year'>\"\n      ]\n     },\n     \"execution_count\": 48,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"df.groupby('year')['uncertainty'].mean().plot()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## WordNet\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"These examples are based on the [NLTK tutorial](https://www.nltk.org/howto/wordnet.html).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 311,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T09:58:47.493172Z\",\n     \"start_time\": \"2022-02-25T09:58:47.486145Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# nltk.download('wordnet')\\n\",\n    \"from nltk.corpus import wordnet as wn\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 156,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-24T20:02:33.505007Z\",\n     \"start_time\": \"2022-02-24T20:02:33.498808Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[Synset('judge.n.01'),\\n\",\n       \" Synset('evaluator.n.01'),\\n\",\n       \" Synset('judge.v.01'),\\n\",\n       \" Synset('evaluate.v.02'),\\n\",\n       \" Synset('estimate.v.01'),\\n\",\n       \" Synset('pronounce.v.02'),\\n\",\n       \" Synset('judge.v.05')]\"\n      ]\n     },\n     \"execution_count\": 156,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"wn.synsets('judge')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 312,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T09:59:45.313935Z\",\n     \"start_time\": \"2022-02-25T09:59:45.305618Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[Synset('judge.v.01'),\\n\",\n       \" Synset('evaluate.v.02'),\\n\",\n       \" Synset('estimate.v.01'),\\n\",\n       \" Synset('pronounce.v.02'),\\n\",\n       \" Synset('judge.v.05')]\"\n      ]\n     },\n     \"execution_count\": 312,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"wn.synsets('judge', pos='v') # can filter on part of speech\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 313,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T09:59:55.836509Z\",\n     \"start_time\": \"2022-02-25T09:59:55.828784Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Synset('judge.n.01')\"\n      ]\n     },\n     \"execution_count\": 313,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"judge = wn.synset('judge.n.01')\\n\",\n    \"judge\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 314,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T10:00:03.911052Z\",\n     \"start_time\": \"2022-02-25T10:00:03.902438Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'a public official authorized to decide questions brought before a court of justice'\"\n      ]\n     },\n     \"execution_count\": 314,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"judge.definition()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 315,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T10:00:10.315766Z\",\n     \"start_time\": \"2022-02-25T10:00:10.304304Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['I estimate this chicken to weigh three pounds']\"\n      ]\n     },\n     \"execution_count\": 315,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"wn.synset('estimate.v.01').examples()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 171,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T07:57:50.442433Z\",\n     \"start_time\": \"2022-02-25T07:57:50.431143Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[Synset('adjudicator.n.01'), Synset('official.n.01')]\"\n      ]\n     },\n     \"execution_count\": 171,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# categories to which \\\"judge.n.01\\\" belongs\\n\",\n    \"judge.hypernyms()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 316,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T10:00:48.120317Z\",\n     \"start_time\": \"2022-02-25T10:00:48.113103Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[Synset('entity.n.01')]\"\n      ]\n     },\n     \"execution_count\": 316,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# the root category of \\\"judge.n.01\\\"\\n\",\n    \"judge.root_hypernyms()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 317,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T10:00:53.937497Z\",\n     \"start_time\": \"2022-02-25T10:00:53.928251Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[Synset('think.v.03')]\"\n      ]\n     },\n     \"execution_count\": 317,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"wn.synset('estimate.v.01').root_hypernyms()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 318,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T10:01:08.703182Z\",\n     \"start_time\": \"2022-02-25T10:01:08.696863Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[Synset('alcalde.n.01'),\\n\",\n       \" Synset('chief_justice.n.01'),\\n\",\n       \" Synset('daniel.n.02'),\\n\",\n       \" Synset('doge.n.01'),\\n\",\n       \" Synset('justiciar.n.01'),\\n\",\n       \" Synset('magistrate.n.01'),\\n\",\n       \" Synset('ordinary.n.01'),\\n\",\n       \" Synset('praetor.n.01'),\\n\",\n       \" Synset('qadi.n.01'),\\n\",\n       \" Synset('recorder.n.03'),\\n\",\n       \" Synset('trial_judge.n.01'),\\n\",\n       \" Synset('trier.n.01')]\"\n      ]\n     },\n     \"execution_count\": 318,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# members of the \\\"judge.n.01\\\" category\\n\",\n    \"judge.hyponyms()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 178,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T08:02:52.324402Z\",\n     \"start_time\": \"2022-02-25T08:02:52.314403Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[Synset('jury.n.01')]\"\n      ]\n     },\n     \"execution_count\": 178,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# \\\"holonym\\\" is a part of a whole\\n\",\n    \"juror = wn.synset('juror.n.01')\\n\",\n    \"juror.member_holonyms()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 179,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T08:02:52.486713Z\",\n     \"start_time\": \"2022-02-25T08:02:52.476865Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[Synset('person.n.01')]\"\n      ]\n     },\n     \"execution_count\": 179,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# can find \\\"lowest common hypernyms\\\":\\n\",\n    \"judge.lowest_common_hypernyms(juror)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 319,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T10:01:45.760265Z\",\n     \"start_time\": \"2022-02-25T10:01:45.748916Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[Lemma('judge.n.01.judge'),\\n\",\n       \" Lemma('judge.n.01.justice'),\\n\",\n       \" Lemma('judge.n.01.jurist')]\"\n      ]\n     },\n     \"execution_count\": 319,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# \\\"lemmas\\\" are specific senses of a specific word.\\n\",\n    \"judge.lemmas()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 320,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T10:01:57.383094Z\",\n     \"start_time\": \"2022-02-25T10:01:57.373544Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['judge', 'justice', 'jurist']\"\n      ]\n     },\n     \"execution_count\": 320,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"[lemma.name() for lemma in judge.lemmas()]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 182,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T08:02:54.261992Z\",\n     \"start_time\": \"2022-02-25T08:02:54.251066Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[Lemma('judicial.s.01.judicial'),\\n\",\n       \" Lemma('judicial.a.02.judicial'),\\n\",\n       \" Lemma('judicial.a.03.judicial'),\\n\",\n       \" Lemma('judgeship.n.01.judgeship'),\\n\",\n       \" Lemma('judge.v.05.judge'),\\n\",\n       \" Lemma('judge.v.05.adjudicate'),\\n\",\n       \" Lemma('decide.v.02.adjudicate')]\"\n      ]\n     },\n     \"execution_count\": 182,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# lemmas have additional properties\\n\",\n    \"judge_lemma = judge.lemmas()[0]\\n\",\n    \"judge_lemma.derivationally_related_forms()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 183,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T08:02:55.555900Z\",\n     \"start_time\": \"2022-02-25T08:02:55.548222Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[Lemma('bad.a.01.bad')]\"\n      ]\n     },\n     \"execution_count\": 183,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"good = wn.synset('good.a.01').lemmas()[0]\\n\",\n    \"good.antonyms()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 184,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T08:02:55.928847Z\",\n     \"start_time\": \"2022-02-25T08:02:55.918782Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['Somebody judge something', 'Somebody judge PP', 'Somebody judge that CLAUSE']\"\n      ]\n     },\n     \"execution_count\": 184,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# verb frames summarize the different semantic contexts that a verb can be used\\n\",\n    \"judge_verb = wn.synset('estimate.v.01').lemmas()[4]\\n\",\n    \"judge_verb.frame_strings()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 186,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T08:03:04.668594Z\",\n     \"start_time\": \"2022-02-25T08:03:04.657402Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.1111111111111111\"\n      ]\n     },\n     \"execution_count\": 186,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# measure similarity in the dictionary between words\\n\",\n    \"judge.path_similarity(wn.synset('juror.n.01'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 203,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T08:05:31.074790Z\",\n     \"start_time\": \"2022-02-25T08:05:31.062152Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.08333333333333333\"\n      ]\n     },\n     \"execution_count\": 203,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"judge.path_similarity(wn.synset('cat.n.01'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 204,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T08:05:31.469152Z\",\n     \"start_time\": \"2022-02-25T08:05:31.458493Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.5454545454545454\"\n      ]\n     },\n     \"execution_count\": 204,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Wu-Palmer similarity.\\n\",\n    \"judge.wup_similarity(juror)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 205,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T08:05:31.752657Z\",\n     \"start_time\": \"2022-02-25T08:05:31.741757Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.5217391304347826\"\n      ]\n     },\n     \"execution_count\": 205,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"judge.wup_similarity(wn.synset('cat.n.01'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 190,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-02-25T08:03:26.100296Z\",\n     \"start_time\": \"2022-02-25T08:03:23.887564Z\"\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Synset('judgeship.n.01')\\n\",\n      \"Synset('judgment.n.02')\\n\",\n      \"Synset('value_judgment.n.01')\\n\",\n      \"Synset('judgment.n.03')\\n\",\n      \"Synset('confession_of_judgment.n.01')\\n\",\n      \"Synset('default_judgment.n.01')\\n\",\n      \"Synset('final_judgment.n.01')\\n\",\n      \"Synset('judgment_in_personam.n.01')\\n\",\n      \"Synset('judgment_in_rem.n.01')\\n\",\n      \"Synset('judgment_of_dismissal.n.01')\\n\",\n      \"Synset('judgment_on_the_merits.n.01')\\n\",\n      \"Synset('summary_judgment.n.01')\\n\",\n      \"Synset('judgment.n.06')\\n\",\n      \"Synset('judgment.n.04')\\n\",\n      \"Synset('prejudgment.n.01')\\n\",\n      \"Synset('judgment.n.01')\\n\",\n      \"Synset('judges.n.01')\\n\",\n      \"Synset('back_judge.n.01')\\n\",\n      \"Synset('field_judge.n.01')\\n\",\n      \"Synset('judge.n.01')\\n\",\n      \"Synset('judge_advocate.n.02')\\n\",\n      \"Synset('judge_advocate.n.01')\\n\",\n      \"Synset('judge_advocate_general.n.01')\\n\",\n      \"Synset('line_judge.n.01')\\n\",\n      \"Synset('side_judge.n.01')\\n\",\n      \"Synset('trial_judge.n.01')\\n\",\n      \"Synset('judgment_lien.n.01')\\n\",\n      \"Synset('judgment_day.n.01')\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Can iterate over all synsets; e.g., all nouns:\\n\",\n    \"for synset in list(wn.all_synsets('n')):\\n\",\n    \"    if 'judg' in str(synset):\\n\",\n    \"        print(synset)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Exercise**. Use wordnet to expand the set of words in the Baker-Bloom-Davis dictionary and re-compute policy uncertainty scores by year. \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3 (ipykernel)\",\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.8.10\"\n  },\n  \"toc\": {\n   \"base_numbering\": \"1\",\n   \"nav_menu\": {},\n   \"number_sections\": true,\n   \"sideBar\": true,\n   \"skip_h1_title\": false,\n   \"title_cell\": \"Week 01. Text Data Essentials\",\n   \"title_sidebar\": \"Contents\",\n   \"toc_cell\": true,\n   \"toc_position\": {\n    \"height\": \"calc(100% - 180px)\",\n    \"left\": \"10px\",\n    \"top\": \"150px\",\n    \"width\": \"165px\"\n   },\n   \"toc_section_display\": true,\n   \"toc_window_display\": true\n  },\n  \"toc-autonumbering\": false,\n  \"toc-showcode\": false,\n  \"toc-showmarkdowntxt\": false,\n  \"toc-showtags\": false\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "Notebook/K_mean_clustering.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"toc\": true\n   },\n   \"source\": [\n    \"<h1>Table of Contents<span class=\\\"tocSkip\\\"></span></h1>\\n\",\n    \"<div class=\\\"toc\\\"><ul class=\\\"toc-item\\\"><li><span><a href=\\\"#Document-Distance\\\" data-toc-modified-id=\\\"Document-Distance-1\\\"><span class=\\\"toc-item-num\\\">1&nbsp;&nbsp;</span>Document Distance</a></span><ul class=\\\"toc-item\\\"><li><span><a href=\\\"#Text-Re-Use\\\" data-toc-modified-id=\\\"Text-Re-Use-1.1\\\"><span class=\\\"toc-item-num\\\">1.1&nbsp;&nbsp;</span>Text Re-Use</a></span></li><li><span><a href=\\\"#Cosine-Similarity\\\" data-toc-modified-id=\\\"Cosine-Similarity-1.2\\\"><span class=\\\"toc-item-num\\\">1.2&nbsp;&nbsp;</span>Cosine Similarity</a></span></li><li><span><a href=\\\"#Jensen-Shannon-Divergence\\\" data-toc-modified-id=\\\"Jensen-Shannon-Divergence-1.3\\\"><span class=\\\"toc-item-num\\\">1.3&nbsp;&nbsp;</span>Jensen-Shannon Divergence</a></span></li></ul></li><li><span><a href=\\\"#Clustering\\\" data-toc-modified-id=\\\"Clustering-2\\\"><span class=\\\"toc-item-num\\\">2&nbsp;&nbsp;</span>Clustering</a></span><ul class=\\\"toc-item\\\"><li><span><a href=\\\"#K-means-clustering\\\" data-toc-modified-id=\\\"K-means-clustering-2.1\\\"><span class=\\\"toc-item-num\\\">2.1&nbsp;&nbsp;</span>K-means clustering</a></span><ul class=\\\"toc-item\\\"><li><span><a href=\\\"#Silhouette-Score\\\" data-toc-modified-id=\\\"Silhouette-Score-2.1.1\\\"><span class=\\\"toc-item-num\\\">2.1.1&nbsp;&nbsp;</span>Silhouette Score</a></span></li></ul></li><li><span><a href=\\\"#K-Medoids\\\" data-toc-modified-id=\\\"K-Medoids-2.2\\\"><span class=\\\"toc-item-num\\\">2.2&nbsp;&nbsp;</span>K-Medoids</a></span></li><li><span><a href=\\\"#DBSCAN\\\" data-toc-modified-id=\\\"DBSCAN-2.3\\\"><span class=\\\"toc-item-num\\\">2.3&nbsp;&nbsp;</span>DBSCAN</a></span><ul class=\\\"toc-item\\\"><li><span><a href=\\\"#Hierarchical-DBSCAN\\\" data-toc-modified-id=\\\"Hierarchical-DBSCAN-2.3.1\\\"><span class=\\\"toc-item-num\\\">2.3.1&nbsp;&nbsp;</span>Hierarchical DBSCAN</a></span></li></ul></li><li><span><a href=\\\"#Hierarchical-Clustering\\\" data-toc-modified-id=\\\"Hierarchical-Clustering-2.4\\\"><span class=\\\"toc-item-num\\\">2.4&nbsp;&nbsp;</span>Hierarchical Clustering</a></span></li><li><span><a href=\\\"#Principal-Component-Analysis\\\" data-toc-modified-id=\\\"Principal-Component-Analysis-2.5\\\"><span class=\\\"toc-item-num\\\">2.5&nbsp;&nbsp;</span>Principal Component Analysis</a></span></li></ul></li><li><span><a href=\\\"#Latent-Dirichlet-Allocation\\\" data-toc-modified-id=\\\"Latent-Dirichlet-Allocation-3\\\"><span class=\\\"toc-item-num\\\">3&nbsp;&nbsp;</span>Latent Dirichlet Allocation</a></span><ul class=\\\"toc-item\\\"><li><span><a href=\\\"#Singular-Value-Decomposition-(SVD)\\\" data-toc-modified-id=\\\"Singular-Value-Decomposition-(SVD)-3.1\\\"><span class=\\\"toc-item-num\\\">3.1&nbsp;&nbsp;</span>Singular Value Decomposition (SVD)</a></span></li><li><span><a href=\\\"#Non-negative-Matrix-Factorization-(NMF)\\\" data-toc-modified-id=\\\"Non-negative-Matrix-Factorization-(NMF)-3.2\\\"><span class=\\\"toc-item-num\\\">3.2&nbsp;&nbsp;</span>Non-negative Matrix Factorization (NMF)</a></span></li><li><span><a href=\\\"#Author-Topic-Model\\\" data-toc-modified-id=\\\"Author-Topic-Model-3.3\\\"><span class=\\\"toc-item-num\\\">3.3&nbsp;&nbsp;</span>Author Topic Model</a></span></li></ul></li></ul></div>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Natural Language Processing for Law and Social Science<br>\\n\",\n    \"Directed by Elliott Ash, ETH Zurich, edited by Estheryu991\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T09:40:51.192954Z\",\n     \"start_time\": \"2022-03-11T09:40:51.186493Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# set random seed\\n\",\n    \"import numpy as np\\n\",\n    \"np.random.seed(4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T09:40:51.740668Z\",\n     \"start_time\": \"2022-03-11T09:40:51.614198Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Setup\\n\",\n    \"import warnings; warnings.simplefilter('ignore')\\n\",\n    \"%matplotlib inline\\n\",\n    \"import pandas as pd\\n\",\n    \"df = pd.read_pickle('sc_cases_cleaned.pkl',compression='gzip')\\n\",\n    \"X = pd.read_pickle('X.pkl').toarray()\\n\",\n    \"X_tfidf = pd.read_pickle('X_tfidf.pkl').toarray()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T09:40:52.236650Z\",\n     \"start_time\": \"2022-03-11T09:40:52.209792Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from gensim.utils import simple_preprocess\\n\",\n    \"text0 = ' '.join(simple_preprocess(df['opinion_text'][0]))\\n\",\n    \"text1 = ' '.join(simple_preprocess(df['opinion_text'][1]))\\n\",\n    \"\\n\",\n    \"text1[:1000]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Document Distance\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Text Re-Use\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notes on this implementation of the Smith-Waterman algorithm can be found [here](https://tiefenauer.github.io/blog/smith-waterman/#step-1-scoring-matrix)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T09:41:24.617382Z\",\n     \"start_time\": \"2022-03-11T09:41:23.676571Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import itertools\\n\",\n    \"import numpy as np\\n\",\n    \"\\n\",\n    \"def matrix(a, b, match_score=3, gap_cost=2):\\n\",\n    \"    H = np.zeros((len(a) + 1, len(b) + 1), np.int)\\n\",\n    \"\\n\",\n    \"    for i, j in itertools.product(range(1, H.shape[0]), range(1, H.shape[1])):\\n\",\n    \"        match = H[i - 1, j - 1] + (match_score if a[i - 1] == b[j - 1] else - match_score)\\n\",\n    \"        delete = H[i - 1, j] - gap_cost\\n\",\n    \"        insert = H[i, j - 1] - gap_cost\\n\",\n    \"        H[i, j] = max(match, delete, insert, 0)\\n\",\n    \"    return H\\n\",\n    \"def traceback(H, b, b_='', old_i=0):\\n\",\n    \"    # flip H to get index of **last** occurrence of H.max() with np.argmax()\\n\",\n    \"    H_flip = np.flip(np.flip(H, 0), 1)\\n\",\n    \"    i_, j_ = np.unravel_index(H_flip.argmax(), H_flip.shape)\\n\",\n    \"    i, j = np.subtract(H.shape, (i_ + 1, j_ + 1))  # (i, j) are **last** indexes of H.max()\\n\",\n    \"    if H[i, j] == 0:\\n\",\n    \"        return b_, j\\n\",\n    \"    b_ = b[j - 1] + '-' + b_ if old_i - i > 1 else b[j - 1] + b_\\n\",\n    \"    return traceback(H[0:i, 0:j], b, b_, i)\\n\",\n    \"def smith_waterman(a, b, match_score=3, gap_cost=2):\\n\",\n    \"    a, b = a.upper(), b.upper()\\n\",\n    \"    H = matrix(a, b, match_score, gap_cost)\\n\",\n    \"    b_, pos = traceback(H, b)\\n\",\n    \"    return pos, pos + len(b_)\\n\",\n    \"\\n\",\n    \"start, end = smith_waterman(text0[:1000], text1[:1000])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T09:41:24.865349Z\",\n     \"start_time\": \"2022-03-11T09:41:24.852460Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"text0[start: end]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Cosine Similarity\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T09:41:43.952894Z\",\n     \"start_time\": \"2022-03-11T09:41:43.919280Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# compute pair-wise similarities between all documents in corpus\\\"\\n\",\n    \"from sklearn.metrics.pairwise import cosine_similarity\\n\",\n    \"\\n\",\n    \"sim = cosine_similarity(X[:100])\\n\",\n    \"sim.shape\\n\",\n    \"\\n\",\n    \"sim\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T09:41:49.366523Z\",\n     \"start_time\": \"2022-03-11T09:41:49.344155Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# TF-IDF Similarity\\n\",\n    \"tsim = cosine_similarity(X[:100])\\n\",\n    \"tsim[:3,:3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Jensen-Shannon Divergence\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T08:38:11.995406Z\",\n     \"start_time\": \"2022-03-11T08:38:11.985278Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from scipy.stats import entropy\\n\",\n    \"def js(p, q):\\n\",\n    \"    p /= p.sum()\\n\",\n    \"    q /= q.sum()\\n\",\n    \"    m = (p + q) / 2\\n\",\n    \"    return (entropy(p, m) + entropy(q, m)) / 2\\n\",\n    \"js(tsim[0],tsim[1])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Clustering\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## K-means clustering\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T09:43:29.382083Z\",\n     \"start_time\": \"2022-03-11T09:43:25.856420Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# create 100 clusters of similar documents\\n\",\n    \"from sklearn.cluster import KMeans\\n\",\n    \"num_clusters = 40\\n\",\n    \"km = KMeans(n_clusters=num_clusters)\\n\",\n    \"km.fit(X)\\n\",\n    \"doc_clusters = km.labels_.tolist()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T09:43:55.174072Z\",\n     \"start_time\": \"2022-03-11T09:43:55.149135Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"df['cluster'] = doc_clusters\\n\",\n    \"df[df['cluster']==3]['opinion_text']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Silhouette Score\\n\",\n    \"\\n\",\n    \"Choose the optimal number of clusters. \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T09:44:52.277204Z\",\n     \"start_time\": \"2022-03-11T09:44:52.141635Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from sklearn.metrics import silhouette_score\\n\",\n    \"silhouette_score(X, km.labels_)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T09:46:45.296285Z\",\n     \"start_time\": \"2022-03-11T09:45:12.878930Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"sil_scores = []\\n\",\n    \"for n in range(2, num_clusters):\\n\",\n    \"    km = KMeans(n_clusters=n)\\n\",\n    \"    km.fit(X)\\n\",\n    \"    sil_scores.append(silhouette_score(X, km.labels_))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T09:46:45.467824Z\",\n     \"start_time\": \"2022-03-11T09:46:45.343903Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import matplotlib.pyplot as plt \\n\",\n    \"plt.plot(range(2, num_clusters), sil_scores)\\n\",\n    \"plt.xlabel('Number of Clusters')\\n\",\n    \"plt.ylabel('Silhouette Score')\\n\",\n    \"plt.show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:07:17.926048Z\",\n     \"start_time\": \"2022-03-11T07:07:17.917927Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"opt_sil_score = max(sil_scores[5:20])\\n\",\n    \"sil_scores.index(opt_sil_score)\\n\",\n    \"opt_num_cluster = range(2, num_clusters)[sil_scores.index(opt_sil_score)]\\n\",\n    \"print('The optimal number of clusters is %s' %opt_num_cluster)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:07:19.322909Z\",\n     \"start_time\": \"2022-03-11T07:07:17.934484Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"km = KMeans(n_clusters=opt_num_cluster)\\n\",\n    \"km.fit(X)\\n\",\n    \"doc_clusters = km.labels_.tolist()\\n\",\n    \"\\n\",\n    \"df['cluster_mean'] = doc_clusters\\n\",\n    \"df[df['cluster_mean']==1]['opinion_text']\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## K-Medoids\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:07:19.388613Z\",\n     \"start_time\": \"2022-03-11T07:07:19.340115Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#!pip install sklearn_extra\\n\",\n    \"from sklearn_extra.cluster import KMedoids\\n\",\n    \"\\n\",\n    \"kmed = KMedoids(n_clusters=opt_num_cluster)\\n\",\n    \"kmed.fit(X)\\n\",\n    \"doc_clusters = kmed.labels_.tolist()\\n\",\n    \"\\n\",\n    \"df['cluster_med'] = doc_clusters\\n\",\n    \"df[df['cluster_med']==1]['opinion_text']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## DBSCAN\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:07:19.439357Z\",\n     \"start_time\": \"2022-03-11T07:07:19.391327Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from sklearn.cluster import DBSCAN\\n\",\n    \"\\n\",\n    \"dbscan = DBSCAN(eps=0.95, min_samples=5)\\n\",\n    \"dbscan.fit(X_tfidf)\\n\",\n    \"db_clusters = dbscan.labels_\\n\",\n    \"\\n\",\n    \"df['cluster_db'] = db_clusters\\n\",\n    \"df[df['cluster_db']==1]['opinion_text']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Hierarchical DBSCAN\\n\",\n    \"\\n\",\n    \"Automatically chooses epsilon, performing DBSCAN over various epsilon values e returns the result that gives the best stability over epsilon. For reference see [here](https://github.com/scikit-learn-contrib/hdbscan/).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:07:20.304382Z\",\n     \"start_time\": \"2022-03-11T07:07:19.445785Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#!pip install hdbscan\\n\",\n    \"\\n\",\n    \"from hdbscan import HDBSCAN\\n\",\n    \"\\n\",\n    \"hdbscan = HDBSCAN(min_cluster_size=5)\\n\",\n    \"hdbscan.fit(X_tfidf)\\n\",\n    \"hdb_clusters = hdbscan.labels_\\n\",\n    \"\\n\",\n    \"df['cluster_hdb'] = hdb_clusters\\n\",\n    \"df[df['cluster_hdb']==1]['opinion_text']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Hierarchical Clustering\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:07:20.394867Z\",\n     \"start_time\": \"2022-03-11T07:07:20.305217Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from sklearn.cluster import AgglomerativeClustering\\n\",\n    \"\\n\",\n    \"cluster = AgglomerativeClustering(n_clusters=opt_num_cluster, affinity='euclidean', linkage='ward')\\n\",\n    \"cluster.fit_predict(X)\\n\",\n    \"\\n\",\n    \"clusters = dbscan.labels_\\n\",\n    \"\\n\",\n    \"df['cluster_hie'] = clusters\\n\",\n    \"df[df['cluster_hie']==1]['opinion_text']\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Principal Component Analysis\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:07:20.548510Z\",\n     \"start_time\": \"2022-03-11T07:07:20.395612Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#%% Principal Components\\n\",\n    \"from sklearn.decomposition import PCA\\n\",\n    \"pca = PCA(n_components=3,svd_solver='randomized')\\n\",\n    \"Xpca = pca.fit_transform(X)\\n\",\n    \"pca.explained_variance_ratio_\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:07:20.624942Z\",\n     \"start_time\": \"2022-03-11T07:07:20.563819Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#%% PCA Viz\\n\",\n    \"plt.scatter(Xpca[:,0],Xpca[:,1], alpha=.1)\\n\",\n    \"plt.show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:07:20.771563Z\",\n     \"start_time\": \"2022-03-11T07:07:20.636987Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#%% PCA 3D Viz\\n\",\n    \"from mpl_toolkits.mplot3d import Axes3D\\n\",\n    \"Axes3D(plt.figure()).scatter(Xpca[:,0],Xpca[:,1], Xpca[:,2], alpha=.1)\\n\",\n    \"plt.show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:07:21.644782Z\",\n     \"start_time\": \"2022-03-11T07:07:20.780568Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#%% make components to explain 95% of variance\\n\",\n    \"pca = PCA(n_components=.95)\\n\",\n    \"X95 = pca.fit_transform(X)\\n\",\n    \"pca.n_components_\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:07:21.792302Z\",\n     \"start_time\": \"2022-03-11T07:07:21.645487Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#%% PCA Inverse Transform\\n\",\n    \"Xrestore = pca.inverse_transform(X95)\\n\",\n    \"plt.plot(Xrestore[0],X[0],'ro')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:07:32.071529Z\",\n     \"start_time\": \"2022-03-11T07:07:21.816551Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#%% Incremental PCA\\n\",\n    \"X_mm = np.memmap('X.pkl',shape=(32567, 525))\\n\",\n    \"\\n\",\n    \"from sklearn.decomposition import IncrementalPCA\\n\",\n    \"inc_pca = IncrementalPCA(n_components=100, batch_size=1000)\\n\",\n    \"inc_pca.fit(X_mm)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:07:32.079855Z\",\n     \"start_time\": \"2022-03-11T07:07:32.072452Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#%% PC Regression\\n\",\n    \"from sklearn.linear_model import LinearRegression\\n\",\n    \"from sklearn.model_selection import cross_val_score\\n\",\n    \"Y = df['log_cite_count']\\n\",\n    \"lin_reg = LinearRegression()\\n\",\n    \"scores = cross_val_score(lin_reg,\\n\",\n    \"                         X95[:,:10],\\n\",\n    \"                         Y) \\n\",\n    \"scores.mean()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:07:36.448807Z\",\n     \"start_time\": \"2022-03-11T07:07:32.082221Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#%% MDS, Isomap, and T-SNE\\n\",\n    \"from sklearn.manifold import MDS, Isomap, TSNE\\n\",\n    \"mds = MDS(n_components=2)\\n\",\n    \"Xmds = mds.fit_transform(X[:500,:200])\\n\",\n    \"Axes3D(plt.figure()).scatter(Xmds[:,0],Xmds[:,1], alpha=.3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:07:36.765819Z\",\n     \"start_time\": \"2022-03-11T07:07:36.472825Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#%% Isomap\\n\",\n    \"iso = Isomap(n_components=2)\\n\",\n    \"Xiso = iso.fit_transform(X[:500,:200])\\n\",\n    \"Axes3D(plt.figure()).scatter(Xiso[:,0],Xiso[:,1], alpha=.3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:07:38.158032Z\",\n     \"start_time\": \"2022-03-11T07:07:36.781207Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#%% t-SNE\\n\",\n    \"tsne = TSNE(n_components=2, n_iter=250)\\n\",\n    \"Xtsne = tsne.fit_transform(X[:500,:200])\\n\",\n    \"Axes3D(plt.figure()).scatter(Xtsne[:,0],Xtsne[:,1], alpha=.3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Latent Dirichlet Allocation\\n\",\n    \"\\n\",\n    \"For further reference see the material from topic [modeling with gensim](https://www.machinelearningplus.com/nlp/topic-modeling-gensim-python/).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T08:04:52.181598Z\",\n     \"start_time\": \"2022-03-11T08:02:37.752474Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# clean document\\n\",\n    \"from gensim.utils import simple_preprocess\\n\",\n    \"import spacy\\n\",\n    \"from spacy.tokenizer import Tokenizer\\n\",\n    \"from tqdm import tqdm as tq\\n\",\n    \"nlp = spacy.load('en_core_web_sm')\\n\",\n    \"# this is faster and we don't need the whole grammatical parse analysis\\n\",\n    \"\\n\",\n    \"def tokenize(x, nlp):\\n\",\n    \"    # lemmatize and lowercase without stopwords, punctuation and numbers\\n\",\n    \"    return [w.lemma_.lower() for w in nlp(x) if not w.is_stop and not w.is_punct and not w.is_digit and len(w) > 2]\\n\",\n    \"\\n\",\n    \"# split into paragraphs\\n\",\n    \"doc_clean = []\\n\",\n    \"for doc in tq(df['opinion_text'][:100]):\\n\",\n    \"    # split by paragraph\\n\",\n    \"    for paragraph in doc.split(\\\"\\\\n\\\\n\\\"):\\n\",\n    \"        doc_clean.append(tokenize(paragraph, nlp))\\n\",\n    \"print (doc_clean[:10])\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"# randomize document order\\n\",\n    \"from random import shuffle\\n\",\n    \"shuffle(doc_clean)\\n\",\n    \"\\n\",\n    \"# creating the term dictionary\\n\",\n    \"from gensim import corpora\\n\",\n    \"dictionary = corpora.Dictionary(doc_clean)\\n\",\n    \"# filter extremes, drop all words appearing in less than 10 paragraphs and all words appearing in at least every third paragraph\\n\",\n    \"dictionary.filter_extremes(no_below=10, no_above=0.33, keep_n=1000)\\n\",\n    \"print (len(dictionary))\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"# creating the document-term matrix\\n\",\n    \"doc_term_matrix = [dictionary.doc2bow(doc) for doc in doc_clean]\\n\",\n    \"\\n\",\n    \"# train LDA with 10 topics and print\\n\",\n    \"from gensim.models.ldamodel import LdaModel\\n\",\n    \"lda = LdaModel(doc_term_matrix, num_topics=10, \\n\",\n    \"               id2word = dictionary, passes=3)\\n\",\n    \"lda.show_topics(formatted=False)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"start_time\": \"2022-03-11T10:01:55.267Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# to get the topic proportions for a document, use\\n\",\n    \"# the corresponding row from the document-term matrix.\\n\",\n    \"lda[doc_term_matrix[1]]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"start_time\": \"2022-03-11T10:01:49.081Z\"\n    },\n    \"scrolled\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# or, for all documents\\n\",\n    \"[lda[d] for d in doc_term_matrix]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:26:40.906548Z\",\n     \"start_time\": \"2022-03-11T07:26:36.749256Z\"\n    },\n    \"scrolled\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"###\\n\",\n    \"# LDA Word Clouds\\n\",\n    \"###\\n\",\n    \"\\n\",\n    \"from numpy.random import randint\\n\",\n    \"from wordcloud import WordCloud\\n\",\n    \"import matplotlib.pyplot as plt\\n\",\n    \"\\n\",\n    \"# make directory if not exists\\n\",\n    \"from os import mkdir\\n\",\n    \"try:\\n\",\n    \"    mkdir('lda')\\n\",\n    \"except:\\n\",\n    \"    pass\\n\",\n    \"\\n\",\n    \"# make word clouds for the topics\\n\",\n    \"for i,weights in lda.show_topics(num_topics=-1,\\n\",\n    \"                                 num_words=100,\\n\",\n    \"                                 formatted=False):\\n\",\n    \"    \\n\",\n    \"    #logweights = [w[0], np.log(w[1]) for w in weights]\\n\",\n    \"    maincol = randint(0,360)\\n\",\n    \"    def colorfunc(word=None, font_size=None, \\n\",\n    \"                  position=None, orientation=None, \\n\",\n    \"                  font_path=None, random_state=None):   \\n\",\n    \"        color = randint(maincol-10, maincol+10)\\n\",\n    \"        if color < 0:\\n\",\n    \"            color = 360 + color\\n\",\n    \"        return \\\"hsl(%d, %d%%, %d%%)\\\" % (color,randint(65, 75)+font_size / 7, randint(35, 45)-font_size / 10)   \\n\",\n    \"\\n\",\n    \"    \\n\",\n    \"    wordcloud = WordCloud(background_color=\\\"white\\\", \\n\",\n    \"                          ranks_only=False, \\n\",\n    \"                          max_font_size=120,\\n\",\n    \"                          color_func=colorfunc,\\n\",\n    \"                          height=600,width=800).generate_from_frequencies(dict(weights))\\n\",\n    \"\\n\",\n    \"    plt.clf()\\n\",\n    \"    plt.imshow(wordcloud,interpolation=\\\"bilinear\\\")\\n\",\n    \"    plt.axis(\\\"off\\\")\\n\",\n    \"    plt.show()\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:16:19.464120Z\",\n     \"start_time\": \"2022-03-11T07:16:17.547251Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# pyLDAvis, for more details, refer to https://github.com/bmabey/pyLDAvis\\n\",\n    \"import pyLDAvis.gensim\\n\",\n    \"pyLDAvis.enable_notebook()\\n\",\n    \"pyLDAvis.gensim.prepare(lda, doc_term_matrix, dictionary)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Using Mallet to calculate coherence scores for different number of topics to automatically determine the best number of topics\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T08:37:27.411606Z\",\n     \"start_time\": \"2022-03-11T08:31:06.461743Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# you need gensim version <= 3.8.3 for this to work\\n\",\n    \"import gensim\\n\",\n    \"from gensim.corpora import Dictionary\\n\",\n    \"from gensim.models.wrappers import LdaMallet\\n\",\n    \"from gensim.models.coherencemodel import CoherenceModel\\n\",\n    \"\\n\",\n    \"mallet_path = '~/Downloads/mallet-2.0.8/bin/mallet'\\n\",\n    \"scores = []\\n\",\n    \"for num_topics in range(2, 20, 2):\\n\",\n    \"    print (num_topics)\\n\",\n    \"    lda = LdaMallet(mallet_path, doc_term_matrix, num_topics=num_topics, id2word=dictionary)\\n\",\n    \"    coherence = CoherenceModel(model=lda, texts=doc_clean, corpus=doc_term_matrix, dictionary=dictionary, coherence='c_v')\\n\",\n    \"    scores.append((num_topics, coherence.get_coherence()))\\n\",\n    \"pd.DataFrame(scores, columns=[\\\"Number of Topics\\\", \\\"Coherence Scores\\\"])\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Singular Value Decomposition (SVD)\\n\",\n    \"\\n\",\n    \"For further reference for this and the following section see [here](https://github.com/fastai/course-nlp/blob/219d0c217bd83339e21471d31cd787e86d6ec0a0/2-svd-nmf-topic-modeling.ipynb).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:30:57.630094Z\",\n     \"start_time\": \"2022-03-11T07:30:56.943444Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from scipy import linalg\\n\",\n    \"\\n\",\n    \"X = pd.read_pickle('X.pkl').todense()\\n\",\n    \"vec = pd.read_pickle('vec-3grams-1.pkl')\\n\",\n    \"vocab = np.array(vec.get_feature_names())\\n\",\n    \"vocab[400:500]\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:31:00.112146Z\",\n     \"start_time\": \"2022-03-11T07:30:59.201038Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"U, s, Vh = linalg.svd(X, full_matrices=False)\\n\",\n    \"print(U.shape, s.shape, Vh.shape)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:31:01.693951Z\",\n     \"start_time\": \"2022-03-11T07:31:01.399719Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"plt.plot(s)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:31:03.071259Z\",\n     \"start_time\": \"2022-03-11T07:31:03.057501Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"num_top_words=8\\n\",\n    \"\\n\",\n    \"def show_topics(a):\\n\",\n    \"    top_words = lambda t: [vocab[i] for i in np.argsort(t)[:-num_top_words-1:-1]]\\n\",\n    \"    topic_words = ([top_words(t) for t in a])\\n\",\n    \"    return [' '.join(t) for t in topic_words]\\n\",\n    \"\\n\",\n    \"show_topics(Vh[:10])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Non-negative Matrix Factorization (NMF) \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:31:06.882377Z\",\n     \"start_time\": \"2022-03-11T07:31:04.922245Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from sklearn import decomposition\\n\",\n    \"\\n\",\n    \"clf = decomposition.NMF(n_components=10, random_state=1)\\n\",\n    \"\\n\",\n    \"W1 = clf.fit_transform(X)\\n\",\n    \"H1 = clf.components_\\n\",\n    \"\\n\",\n    \"show_topics(H1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Author Topic Model\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:31:09.147221Z\",\n     \"start_time\": \"2022-03-11T07:31:09.077828Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from gensim.models import AuthorTopicModel\\n\",\n    \"from gensim.test.utils import temporary_file\\n\",\n    \"\\n\",\n    \"df = df.reset_index()\\n\",\n    \"df['id'] = df.index\\n\",\n    \"author2doc = df[:100][['authorship','id']]\\n\",\n    \"author2doc = author2doc.groupby('authorship').apply(lambda x: list(x['id'])).to_dict()\\n\",\n    \"author2doc\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2022-03-11T07:31:10.623422Z\",\n     \"start_time\": \"2022-03-11T07:31:10.554968Z\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"model = AuthorTopicModel(\\n\",\n    \"        doc_term_matrix, author2doc=author2doc, id2word=dictionary, num_topics=10)\\n\",\n    \"\\n\",\n    \"# For each author list topic distribution\\n\",\n    \"author_vecs = [model.get_author_topics(author) for author in model.id2author.values()]\\n\",\n    \"author_vecs[:2]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3 (ipykernel)\",\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.8.10\"\n  },\n  \"toc\": {\n   \"base_numbering\": 1,\n   \"nav_menu\": {},\n   \"number_sections\": true,\n   \"sideBar\": true,\n   \"skip_h1_title\": false,\n   \"title_cell\": \"Table of Contents\",\n   \"title_sidebar\": \"Contents\",\n   \"toc_cell\": true,\n   \"toc_position\": {},\n   \"toc_section_display\": true,\n   \"toc_window_display\": true\n  },\n  \"toc-autonumbering\": true\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "Notebook/text_data.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Week 04. Machine Learning with Text Data\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Natural Language Processing for Law and Social Science<br>\\n\",\n    \"Elliott Ash, ETH Zurich\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# set random seed\\n\",\n    \"import numpy as np\\n\",\n    \"np.random.seed(4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"ValueError\",\n     \"evalue\": \"unsupported pickle protocol: 5\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[0;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[0;31mValueError\\u001b[0m                                Traceback (most recent call last)\",\n      \"\\u001b[0;32m<ipython-input-4-03608dc38725>\\u001b[0m in \\u001b[0;36m<module>\\u001b[0;34m()\\u001b[0m\\n\\u001b[1;32m      3\\u001b[0m \\u001b[0mget_ipython\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mmagic\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0;34m'matplotlib notebook'\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m      4\\u001b[0m \\u001b[0;32mimport\\u001b[0m \\u001b[0mpandas\\u001b[0m \\u001b[0;32mas\\u001b[0m \\u001b[0mpd\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m----> 5\\u001b[0;31m \\u001b[0mdf\\u001b[0m \\u001b[0;34m=\\u001b[0m \\u001b[0mpd\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mread_pickle\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0;34m'sc_cases_cleaned.pkl'\\u001b[0m\\u001b[0;34m,\\u001b[0m\\u001b[0mcompression\\u001b[0m\\u001b[0;34m=\\u001b[0m\\u001b[0;34m'gzip'\\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      6\\u001b[0m \\u001b[0mdf\\u001b[0m\\u001b[0;34m=\\u001b[0m\\u001b[0mdf\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mreset_index\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mdrop\\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\\u001b[1;32m      7\\u001b[0m \\u001b[0mdf\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mhead\\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\",\n      \"\\u001b[0;32m/home/dominsta/anaconda3/envs/legal_dna/lib/python3.6/site-packages/pandas/io/pickle.py\\u001b[0m in \\u001b[0;36mread_pickle\\u001b[0;34m(filepath_or_buffer, compression)\\u001b[0m\\n\\u001b[1;32m    180\\u001b[0m                 \\u001b[0;31m# We want to silence any warnings about, e.g. moved modules.\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m    181\\u001b[0m                 \\u001b[0mwarnings\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0msimplefilter\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0;34m\\\"ignore\\\"\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0mWarning\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m--> 182\\u001b[0;31m                 \\u001b[0;32mreturn\\u001b[0m \\u001b[0mpickle\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mload\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mf\\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    183\\u001b[0m         \\u001b[0;32mexcept\\u001b[0m \\u001b[0mexcs_to_catch\\u001b[0m\\u001b[0;34m:\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m    184\\u001b[0m             \\u001b[0;31m# e.g.\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[0;31mValueError\\u001b[0m: unsupported pickle protocol: 5\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# set up\\n\",\n    \"import warnings; warnings.simplefilter('ignore')\\n\",\n    \"%matplotlib notebook\\n\",\n    \"import pandas as pd\\n\",\n    \"df = pd.read_pickle('sc_cases_cleaned.pkl',compression='gzip')\\n\",\n    \"df=df.reset_index(drop=True)\\n\",\n    \"df.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"scrolled\": true\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"SCALIA       94\\n\",\n       \"GINSBURG     89\\n\",\n       \"THOMAS       87\\n\",\n       \"KENNEDY      86\\n\",\n       \"BREYER       85\\n\",\n       \"STEVENS      79\\n\",\n       \"SOUTER       77\\n\",\n       \"O'CONNOR     52\\n\",\n       \"REHNQUIST    49\\n\",\n       \"ROBERTS      38\\n\",\n       \"ALITO        32\\n\",\n       \"Name: authorship, dtype: int64\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"df = df.assign(authorship_id=(df['authorship']).astype('category').cat.codes)\\n\",\n    \"df['authorship'].value_counts() \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/javascript\": [\n       \"/* Put everything inside the global mpl namespace */\\n\",\n       \"/* global mpl */\\n\",\n       \"window.mpl = {};\\n\",\n       \"\\n\",\n       \"mpl.get_websocket_type = function () {\\n\",\n       \"    if (typeof WebSocket !== 'undefined') {\\n\",\n       \"        return WebSocket;\\n\",\n       \"    } else if (typeof MozWebSocket !== 'undefined') {\\n\",\n       \"        return MozWebSocket;\\n\",\n       \"    } else {\\n\",\n       \"        alert(\\n\",\n       \"            'Your browser does not have WebSocket support. ' +\\n\",\n       \"                'Please try Chrome, Safari or Firefox ≥ 6. ' +\\n\",\n       \"                'Firefox 4 and 5 are also supported but you ' +\\n\",\n       \"                'have to enable WebSockets in about:config.'\\n\",\n       \"        );\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\\n\",\n       \"    this.id = figure_id;\\n\",\n       \"\\n\",\n       \"    this.ws = websocket;\\n\",\n       \"\\n\",\n       \"    this.supports_binary = this.ws.binaryType !== undefined;\\n\",\n       \"\\n\",\n       \"    if (!this.supports_binary) {\\n\",\n       \"        var warnings = document.getElementById('mpl-warnings');\\n\",\n       \"        if (warnings) {\\n\",\n       \"            warnings.style.display = 'block';\\n\",\n       \"            warnings.textContent =\\n\",\n       \"                'This browser does not support binary websocket messages. ' +\\n\",\n       \"                'Performance may be slow.';\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    this.imageObj = new Image();\\n\",\n       \"\\n\",\n       \"    this.context = undefined;\\n\",\n       \"    this.message = undefined;\\n\",\n       \"    this.canvas = undefined;\\n\",\n       \"    this.rubberband_canvas = undefined;\\n\",\n       \"    this.rubberband_context = undefined;\\n\",\n       \"    this.format_dropdown = undefined;\\n\",\n       \"\\n\",\n       \"    this.image_mode = 'full';\\n\",\n       \"\\n\",\n       \"    this.root = document.createElement('div');\\n\",\n       \"    this.root.setAttribute('style', 'display: inline-block');\\n\",\n       \"    this._root_extra_style(this.root);\\n\",\n       \"\\n\",\n       \"    parent_element.appendChild(this.root);\\n\",\n       \"\\n\",\n       \"    this._init_header(this);\\n\",\n       \"    this._init_canvas(this);\\n\",\n       \"    this._init_toolbar(this);\\n\",\n       \"\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    this.waiting = false;\\n\",\n       \"\\n\",\n       \"    this.ws.onopen = function () {\\n\",\n       \"        fig.send_message('supports_binary', { value: fig.supports_binary });\\n\",\n       \"        fig.send_message('send_image_mode', {});\\n\",\n       \"        if (fig.ratio !== 1) {\\n\",\n       \"            fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\\n\",\n       \"        }\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onload = function () {\\n\",\n       \"        if (fig.image_mode === 'full') {\\n\",\n       \"            // Full images could contain transparency (where diff images\\n\",\n       \"            // almost always do), so we need to clear the canvas so that\\n\",\n       \"            // there is no ghosting.\\n\",\n       \"            fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\\n\",\n       \"        }\\n\",\n       \"        fig.context.drawImage(fig.imageObj, 0, 0);\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onunload = function () {\\n\",\n       \"        fig.ws.close();\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.ws.onmessage = this._make_on_message_function(this);\\n\",\n       \"\\n\",\n       \"    this.ondownload = ondownload;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_header = function () {\\n\",\n       \"    var titlebar = document.createElement('div');\\n\",\n       \"    titlebar.classList =\\n\",\n       \"        'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\\n\",\n       \"    var titletext = document.createElement('div');\\n\",\n       \"    titletext.classList = 'ui-dialog-title';\\n\",\n       \"    titletext.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'width: 100%; text-align: center; padding: 3px;'\\n\",\n       \"    );\\n\",\n       \"    titlebar.appendChild(titletext);\\n\",\n       \"    this.root.appendChild(titlebar);\\n\",\n       \"    this.header = titletext;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_canvas = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var canvas_div = (this.canvas_div = document.createElement('div'));\\n\",\n       \"    canvas_div.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'border: 1px solid #ddd;' +\\n\",\n       \"            'box-sizing: content-box;' +\\n\",\n       \"            'clear: both;' +\\n\",\n       \"            'min-height: 1px;' +\\n\",\n       \"            'min-width: 1px;' +\\n\",\n       \"            'outline: 0;' +\\n\",\n       \"            'overflow: hidden;' +\\n\",\n       \"            'position: relative;' +\\n\",\n       \"            'resize: both;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    function on_keyboard_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.key_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keydown',\\n\",\n       \"        on_keyboard_event_closure('key_press')\\n\",\n       \"    );\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keyup',\\n\",\n       \"        on_keyboard_event_closure('key_release')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    this._canvas_extra_style(canvas_div);\\n\",\n       \"    this.root.appendChild(canvas_div);\\n\",\n       \"\\n\",\n       \"    var canvas = (this.canvas = document.createElement('canvas'));\\n\",\n       \"    canvas.classList.add('mpl-canvas');\\n\",\n       \"    canvas.setAttribute('style', 'box-sizing: content-box;');\\n\",\n       \"\\n\",\n       \"    this.context = canvas.getContext('2d');\\n\",\n       \"\\n\",\n       \"    var backingStore =\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        this.context.webkitBackingStorePixelRatio ||\\n\",\n       \"        this.context.mozBackingStorePixelRatio ||\\n\",\n       \"        this.context.msBackingStorePixelRatio ||\\n\",\n       \"        this.context.oBackingStorePixelRatio ||\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        1;\\n\",\n       \"\\n\",\n       \"    this.ratio = (window.devicePixelRatio || 1) / backingStore;\\n\",\n       \"    if (this.ratio !== 1) {\\n\",\n       \"        fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var rubberband_canvas = (this.rubberband_canvas = document.createElement(\\n\",\n       \"        'canvas'\\n\",\n       \"    ));\\n\",\n       \"    rubberband_canvas.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    var resizeObserver = new ResizeObserver(function (entries) {\\n\",\n       \"        var nentries = entries.length;\\n\",\n       \"        for (var i = 0; i < nentries; i++) {\\n\",\n       \"            var entry = entries[i];\\n\",\n       \"            var width, height;\\n\",\n       \"            if (entry.contentBoxSize) {\\n\",\n       \"                if (entry.contentBoxSize instanceof Array) {\\n\",\n       \"                    // Chrome 84 implements new version of spec.\\n\",\n       \"                    width = entry.contentBoxSize[0].inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize[0].blockSize;\\n\",\n       \"                } else {\\n\",\n       \"                    // Firefox implements old version of spec.\\n\",\n       \"                    width = entry.contentBoxSize.inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize.blockSize;\\n\",\n       \"                }\\n\",\n       \"            } else {\\n\",\n       \"                // Chrome <84 implements even older version of spec.\\n\",\n       \"                width = entry.contentRect.width;\\n\",\n       \"                height = entry.contentRect.height;\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            // Keep the size of the canvas and rubber band canvas in sync with\\n\",\n       \"            // the canvas container.\\n\",\n       \"            if (entry.devicePixelContentBoxSize) {\\n\",\n       \"                // Chrome 84 implements new version of spec.\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'width',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].inlineSize\\n\",\n       \"                );\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'height',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].blockSize\\n\",\n       \"                );\\n\",\n       \"            } else {\\n\",\n       \"                canvas.setAttribute('width', width * fig.ratio);\\n\",\n       \"                canvas.setAttribute('height', height * fig.ratio);\\n\",\n       \"            }\\n\",\n       \"            canvas.setAttribute(\\n\",\n       \"                'style',\\n\",\n       \"                'width: ' + width + 'px; height: ' + height + 'px;'\\n\",\n       \"            );\\n\",\n       \"\\n\",\n       \"            rubberband_canvas.setAttribute('width', width);\\n\",\n       \"            rubberband_canvas.setAttribute('height', height);\\n\",\n       \"\\n\",\n       \"            // And update the size in Python. We ignore the initial 0/0 size\\n\",\n       \"            // that occurs as the element is placed into the DOM, which should\\n\",\n       \"            // otherwise not happen due to the minimum size styling.\\n\",\n       \"            if (width != 0 && height != 0) {\\n\",\n       \"                fig.request_resize(width, height);\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    });\\n\",\n       \"    resizeObserver.observe(canvas_div);\\n\",\n       \"\\n\",\n       \"    function on_mouse_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.mouse_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousedown',\\n\",\n       \"        on_mouse_event_closure('button_press')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseup',\\n\",\n       \"        on_mouse_event_closure('button_release')\\n\",\n       \"    );\\n\",\n       \"    // Throttle sequential mouse events to 1 every 20ms.\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousemove',\\n\",\n       \"        on_mouse_event_closure('motion_notify')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseenter',\\n\",\n       \"        on_mouse_event_closure('figure_enter')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseleave',\\n\",\n       \"        on_mouse_event_closure('figure_leave')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener('wheel', function (event) {\\n\",\n       \"        if (event.deltaY < 0) {\\n\",\n       \"            event.step = 1;\\n\",\n       \"        } else {\\n\",\n       \"            event.step = -1;\\n\",\n       \"        }\\n\",\n       \"        on_mouse_event_closure('scroll')(event);\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    canvas_div.appendChild(canvas);\\n\",\n       \"    canvas_div.appendChild(rubberband_canvas);\\n\",\n       \"\\n\",\n       \"    this.rubberband_context = rubberband_canvas.getContext('2d');\\n\",\n       \"    this.rubberband_context.strokeStyle = '#000000';\\n\",\n       \"\\n\",\n       \"    this._resize_canvas = function (width, height, forward) {\\n\",\n       \"        if (forward) {\\n\",\n       \"            canvas_div.style.width = width + 'px';\\n\",\n       \"            canvas_div.style.height = height + 'px';\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    // Disable right mouse context menu.\\n\",\n       \"    this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\\n\",\n       \"        event.preventDefault();\\n\",\n       \"        return false;\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    function set_focus() {\\n\",\n       \"        canvas.focus();\\n\",\n       \"        canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    window.setTimeout(set_focus, 100);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'mpl-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var button = (fig.buttons[name] = document.createElement('button'));\\n\",\n       \"        button.classList = 'mpl-widget';\\n\",\n       \"        button.setAttribute('role', 'button');\\n\",\n       \"        button.setAttribute('aria-disabled', 'false');\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"\\n\",\n       \"        var icon_img = document.createElement('img');\\n\",\n       \"        icon_img.src = '_images/' + image + '.png';\\n\",\n       \"        icon_img.srcset = '_images/' + image + '_large.png 2x';\\n\",\n       \"        icon_img.alt = tooltip;\\n\",\n       \"        button.appendChild(icon_img);\\n\",\n       \"\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fmt_picker = document.createElement('select');\\n\",\n       \"    fmt_picker.classList = 'mpl-widget';\\n\",\n       \"    toolbar.appendChild(fmt_picker);\\n\",\n       \"    this.format_dropdown = fmt_picker;\\n\",\n       \"\\n\",\n       \"    for (var ind in mpl.extensions) {\\n\",\n       \"        var fmt = mpl.extensions[ind];\\n\",\n       \"        var option = document.createElement('option');\\n\",\n       \"        option.selected = fmt === mpl.default_extension;\\n\",\n       \"        option.innerHTML = fmt;\\n\",\n       \"        fmt_picker.appendChild(option);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\\n\",\n       \"    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\\n\",\n       \"    // which will in turn request a refresh of the image.\\n\",\n       \"    this.send_message('resize', { width: x_pixels, height: y_pixels });\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_message = function (type, properties) {\\n\",\n       \"    properties['type'] = type;\\n\",\n       \"    properties['figure_id'] = this.id;\\n\",\n       \"    this.ws.send(JSON.stringify(properties));\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_draw_message = function () {\\n\",\n       \"    if (!this.waiting) {\\n\",\n       \"        this.waiting = true;\\n\",\n       \"        this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    var format_dropdown = fig.format_dropdown;\\n\",\n       \"    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\\n\",\n       \"    fig.ondownload(fig, format);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_resize = function (fig, msg) {\\n\",\n       \"    var size = msg['size'];\\n\",\n       \"    if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\\n\",\n       \"        fig._resize_canvas(size[0], size[1], msg['forward']);\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\\n\",\n       \"    var x0 = msg['x0'] / fig.ratio;\\n\",\n       \"    var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\\n\",\n       \"    var x1 = msg['x1'] / fig.ratio;\\n\",\n       \"    var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\\n\",\n       \"    x0 = Math.floor(x0) + 0.5;\\n\",\n       \"    y0 = Math.floor(y0) + 0.5;\\n\",\n       \"    x1 = Math.floor(x1) + 0.5;\\n\",\n       \"    y1 = Math.floor(y1) + 0.5;\\n\",\n       \"    var min_x = Math.min(x0, x1);\\n\",\n       \"    var min_y = Math.min(y0, y1);\\n\",\n       \"    var width = Math.abs(x1 - x0);\\n\",\n       \"    var height = Math.abs(y1 - y0);\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.clearRect(\\n\",\n       \"        0,\\n\",\n       \"        0,\\n\",\n       \"        fig.canvas.width / fig.ratio,\\n\",\n       \"        fig.canvas.height / fig.ratio\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\\n\",\n       \"    // Updates the figure title.\\n\",\n       \"    fig.header.textContent = msg['label'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_cursor = function (fig, msg) {\\n\",\n       \"    var cursor = msg['cursor'];\\n\",\n       \"    switch (cursor) {\\n\",\n       \"        case 0:\\n\",\n       \"            cursor = 'pointer';\\n\",\n       \"            break;\\n\",\n       \"        case 1:\\n\",\n       \"            cursor = 'default';\\n\",\n       \"            break;\\n\",\n       \"        case 2:\\n\",\n       \"            cursor = 'crosshair';\\n\",\n       \"            break;\\n\",\n       \"        case 3:\\n\",\n       \"            cursor = 'move';\\n\",\n       \"            break;\\n\",\n       \"    }\\n\",\n       \"    fig.rubberband_canvas.style.cursor = cursor;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_message = function (fig, msg) {\\n\",\n       \"    fig.message.textContent = msg['message'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_draw = function (fig, _msg) {\\n\",\n       \"    // Request the server to send over a new figure.\\n\",\n       \"    fig.send_draw_message();\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\\n\",\n       \"    fig.image_mode = msg['mode'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\\n\",\n       \"    for (var key in msg) {\\n\",\n       \"        if (!(key in fig.buttons)) {\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"        fig.buttons[key].disabled = !msg[key];\\n\",\n       \"        fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\\n\",\n       \"    if (msg['mode'] === 'PAN') {\\n\",\n       \"        fig.buttons['Pan'].classList.add('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    } else if (msg['mode'] === 'ZOOM') {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.add('active');\\n\",\n       \"    } else {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Called whenever the canvas gets updated.\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// A function to construct a web socket function for onmessage handling.\\n\",\n       \"// Called in the figure constructor.\\n\",\n       \"mpl.figure.prototype._make_on_message_function = function (fig) {\\n\",\n       \"    return function socket_on_message(evt) {\\n\",\n       \"        if (evt.data instanceof Blob) {\\n\",\n       \"            /* FIXME: We get \\\"Resource interpreted as Image but\\n\",\n       \"             * transferred with MIME type text/plain:\\\" errors on\\n\",\n       \"             * Chrome.  But how to set the MIME type?  It doesn't seem\\n\",\n       \"             * to be part of the websocket stream */\\n\",\n       \"            evt.data.type = 'image/png';\\n\",\n       \"\\n\",\n       \"            /* Free the memory for the previous frames */\\n\",\n       \"            if (fig.imageObj.src) {\\n\",\n       \"                (window.URL || window.webkitURL).revokeObjectURL(\\n\",\n       \"                    fig.imageObj.src\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\\n\",\n       \"                evt.data\\n\",\n       \"            );\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        } else if (\\n\",\n       \"            typeof evt.data === 'string' &&\\n\",\n       \"            evt.data.slice(0, 21) === 'data:image/png;base64'\\n\",\n       \"        ) {\\n\",\n       \"            fig.imageObj.src = evt.data;\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var msg = JSON.parse(evt.data);\\n\",\n       \"        var msg_type = msg['type'];\\n\",\n       \"\\n\",\n       \"        // Call the  \\\"handle_{type}\\\" callback, which takes\\n\",\n       \"        // the figure and JSON message as its only arguments.\\n\",\n       \"        try {\\n\",\n       \"            var callback = fig['handle_' + msg_type];\\n\",\n       \"        } catch (e) {\\n\",\n       \"            console.log(\\n\",\n       \"                \\\"No handler for the '\\\" + msg_type + \\\"' message type: \\\",\\n\",\n       \"                msg\\n\",\n       \"            );\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        if (callback) {\\n\",\n       \"            try {\\n\",\n       \"                // console.log(\\\"Handling '\\\" + msg_type + \\\"' message: \\\", msg);\\n\",\n       \"                callback(fig, msg);\\n\",\n       \"            } catch (e) {\\n\",\n       \"                console.log(\\n\",\n       \"                    \\\"Exception inside the 'handler_\\\" + msg_type + \\\"' callback:\\\",\\n\",\n       \"                    e,\\n\",\n       \"                    e.stack,\\n\",\n       \"                    msg\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\\n\",\n       \"mpl.findpos = function (e) {\\n\",\n       \"    //this section is from http://www.quirksmode.org/js/events_properties.html\\n\",\n       \"    var targ;\\n\",\n       \"    if (!e) {\\n\",\n       \"        e = window.event;\\n\",\n       \"    }\\n\",\n       \"    if (e.target) {\\n\",\n       \"        targ = e.target;\\n\",\n       \"    } else if (e.srcElement) {\\n\",\n       \"        targ = e.srcElement;\\n\",\n       \"    }\\n\",\n       \"    if (targ.nodeType === 3) {\\n\",\n       \"        // defeat Safari bug\\n\",\n       \"        targ = targ.parentNode;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // pageX,Y are the mouse positions relative to the document\\n\",\n       \"    var boundingRect = targ.getBoundingClientRect();\\n\",\n       \"    var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\\n\",\n       \"    var y = e.pageY - (boundingRect.top + document.body.scrollTop);\\n\",\n       \"\\n\",\n       \"    return { x: x, y: y };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"/*\\n\",\n       \" * return a copy of an object with only non-object keys\\n\",\n       \" * we need this to avoid circular references\\n\",\n       \" * http://stackoverflow.com/a/24161582/3208463\\n\",\n       \" */\\n\",\n       \"function simpleKeys(original) {\\n\",\n       \"    return Object.keys(original).reduce(function (obj, key) {\\n\",\n       \"        if (typeof original[key] !== 'object') {\\n\",\n       \"            obj[key] = original[key];\\n\",\n       \"        }\\n\",\n       \"        return obj;\\n\",\n       \"    }, {});\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.mouse_event = function (event, name) {\\n\",\n       \"    var canvas_pos = mpl.findpos(event);\\n\",\n       \"\\n\",\n       \"    if (name === 'button_press') {\\n\",\n       \"        this.canvas.focus();\\n\",\n       \"        this.canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var x = canvas_pos.x * this.ratio;\\n\",\n       \"    var y = canvas_pos.y * this.ratio;\\n\",\n       \"\\n\",\n       \"    this.send_message(name, {\\n\",\n       \"        x: x,\\n\",\n       \"        y: y,\\n\",\n       \"        button: event.button,\\n\",\n       \"        step: event.step,\\n\",\n       \"        guiEvent: simpleKeys(event),\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    /* This prevents the web browser from automatically changing to\\n\",\n       \"     * the text insertion cursor when the button is pressed.  We want\\n\",\n       \"     * to control all of the cursor setting manually through the\\n\",\n       \"     * 'cursor' event from matplotlib */\\n\",\n       \"    event.preventDefault();\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (_event, _name) {\\n\",\n       \"    // Handle any extra behaviour associated with a key event\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.key_event = function (event, name) {\\n\",\n       \"    // Prevent repeat events\\n\",\n       \"    if (name === 'key_press') {\\n\",\n       \"        if (event.which === this._key) {\\n\",\n       \"            return;\\n\",\n       \"        } else {\\n\",\n       \"            this._key = event.which;\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"    if (name === 'key_release') {\\n\",\n       \"        this._key = null;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var value = '';\\n\",\n       \"    if (event.ctrlKey && event.which !== 17) {\\n\",\n       \"        value += 'ctrl+';\\n\",\n       \"    }\\n\",\n       \"    if (event.altKey && event.which !== 18) {\\n\",\n       \"        value += 'alt+';\\n\",\n       \"    }\\n\",\n       \"    if (event.shiftKey && event.which !== 16) {\\n\",\n       \"        value += 'shift+';\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    value += 'k';\\n\",\n       \"    value += event.which.toString();\\n\",\n       \"\\n\",\n       \"    this._key_event_extra(event, name);\\n\",\n       \"\\n\",\n       \"    this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onclick = function (name) {\\n\",\n       \"    if (name === 'download') {\\n\",\n       \"        this.handle_save(this, null);\\n\",\n       \"    } else {\\n\",\n       \"        this.send_message('toolbar_button', { name: name });\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\\n\",\n       \"    this.message.textContent = tooltip;\\n\",\n       \"};\\n\",\n       \"mpl.toolbar_items = [[\\\"Home\\\", \\\"Reset original view\\\", \\\"fa fa-home icon-home\\\", \\\"home\\\"], [\\\"Back\\\", \\\"Back to previous view\\\", \\\"fa fa-arrow-left icon-arrow-left\\\", \\\"back\\\"], [\\\"Forward\\\", \\\"Forward to next view\\\", \\\"fa fa-arrow-right icon-arrow-right\\\", \\\"forward\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Pan\\\", \\\"Left button pans, Right button zooms\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-arrows icon-move\\\", \\\"pan\\\"], [\\\"Zoom\\\", \\\"Zoom to rectangle\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-square-o icon-check-empty\\\", \\\"zoom\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Download\\\", \\\"Download plot\\\", \\\"fa fa-floppy-o icon-save\\\", \\\"download\\\"]];\\n\",\n       \"\\n\",\n       \"mpl.extensions = [\\\"eps\\\", \\\"jpeg\\\", \\\"pdf\\\", \\\"png\\\", \\\"ps\\\", \\\"raw\\\", \\\"svg\\\", \\\"tif\\\"];\\n\",\n       \"\\n\",\n       \"mpl.default_extension = \\\"png\\\";/* global mpl */\\n\",\n       \"\\n\",\n       \"var comm_websocket_adapter = function (comm) {\\n\",\n       \"    // Create a \\\"websocket\\\"-like object which calls the given IPython comm\\n\",\n       \"    // object with the appropriate methods. Currently this is a non binary\\n\",\n       \"    // socket, so there is still some room for performance tuning.\\n\",\n       \"    var ws = {};\\n\",\n       \"\\n\",\n       \"    ws.close = function () {\\n\",\n       \"        comm.close();\\n\",\n       \"    };\\n\",\n       \"    ws.send = function (m) {\\n\",\n       \"        //console.log('sending', m);\\n\",\n       \"        comm.send(m);\\n\",\n       \"    };\\n\",\n       \"    // Register the callback with on_msg.\\n\",\n       \"    comm.on_msg(function (msg) {\\n\",\n       \"        //console.log('receiving', msg['content']['data'], msg);\\n\",\n       \"        // Pass the mpl event to the overridden (by mpl) onmessage function.\\n\",\n       \"        ws.onmessage(msg['content']['data']);\\n\",\n       \"    });\\n\",\n       \"    return ws;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.mpl_figure_comm = function (comm, msg) {\\n\",\n       \"    // This is the function which gets called when the mpl process\\n\",\n       \"    // starts-up an IPython Comm through the \\\"matplotlib\\\" channel.\\n\",\n       \"\\n\",\n       \"    var id = msg.content.data.id;\\n\",\n       \"    // Get hold of the div created by the display call when the Comm\\n\",\n       \"    // socket was opened in Python.\\n\",\n       \"    var element = document.getElementById(id);\\n\",\n       \"    var ws_proxy = comm_websocket_adapter(comm);\\n\",\n       \"\\n\",\n       \"    function ondownload(figure, _format) {\\n\",\n       \"        window.open(figure.canvas.toDataURL());\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fig = new mpl.figure(id, ws_proxy, ondownload, element);\\n\",\n       \"\\n\",\n       \"    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\\n\",\n       \"    // web socket which is closed, not our websocket->open comm proxy.\\n\",\n       \"    ws_proxy.onopen();\\n\",\n       \"\\n\",\n       \"    fig.parent_element = element;\\n\",\n       \"    fig.cell_info = mpl.find_output_cell(\\\"<div id='\\\" + id + \\\"'></div>\\\");\\n\",\n       \"    if (!fig.cell_info) {\\n\",\n       \"        console.error('Failed to find cell for figure', id, fig);\\n\",\n       \"        return;\\n\",\n       \"    }\\n\",\n       \"    fig.cell_info[0].output_area.element.one(\\n\",\n       \"        'cleared',\\n\",\n       \"        { fig: fig },\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_close = function (fig, msg) {\\n\",\n       \"    var width = fig.canvas.width / fig.ratio;\\n\",\n       \"    fig.cell_info[0].output_area.element.off(\\n\",\n       \"        'cleared',\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    // Update the output cell to use the data from the current canvas.\\n\",\n       \"    fig.push_to_output();\\n\",\n       \"    var dataURL = fig.canvas.toDataURL();\\n\",\n       \"    // Re-enable the keyboard manager in IPython - without this line, in FF,\\n\",\n       \"    // the notebook keyboard shortcuts fail.\\n\",\n       \"    IPython.keyboard_manager.enable();\\n\",\n       \"    fig.parent_element.innerHTML =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"    fig.close_ws(fig, msg);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.close_ws = function (fig, msg) {\\n\",\n       \"    fig.send_message('closing', msg);\\n\",\n       \"    // fig.ws.close()\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\\n\",\n       \"    // Turn the data on the canvas into data in the output cell.\\n\",\n       \"    var width = this.canvas.width / this.ratio;\\n\",\n       \"    var dataURL = this.canvas.toDataURL();\\n\",\n       \"    this.cell_info[1]['text/html'] =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Tell IPython that the notebook contents must change.\\n\",\n       \"    IPython.notebook.set_dirty(true);\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"    var fig = this;\\n\",\n       \"    // Wait a second, then push the new image to the DOM so\\n\",\n       \"    // that it is saved nicely (might be nice to debounce this).\\n\",\n       \"    setTimeout(function () {\\n\",\n       \"        fig.push_to_output();\\n\",\n       \"    }, 1000);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'btn-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'btn-group';\\n\",\n       \"    var button;\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'btn-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        button = fig.buttons[name] = document.createElement('button');\\n\",\n       \"        button.classList = 'btn btn-default';\\n\",\n       \"        button.href = '#';\\n\",\n       \"        button.title = name;\\n\",\n       \"        button.innerHTML = '<i class=\\\"fa ' + image + ' fa-lg\\\"></i>';\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Add the status bar.\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message pull-right';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"\\n\",\n       \"    // Add the close button to the window.\\n\",\n       \"    var buttongrp = document.createElement('div');\\n\",\n       \"    buttongrp.classList = 'btn-group inline pull-right';\\n\",\n       \"    button = document.createElement('button');\\n\",\n       \"    button.classList = 'btn btn-mini btn-primary';\\n\",\n       \"    button.href = '#';\\n\",\n       \"    button.title = 'Stop Interaction';\\n\",\n       \"    button.innerHTML = '<i class=\\\"fa fa-power-off icon-remove icon-large\\\"></i>';\\n\",\n       \"    button.addEventListener('click', function (_evt) {\\n\",\n       \"        fig.handle_close(fig, {});\\n\",\n       \"    });\\n\",\n       \"    button.addEventListener(\\n\",\n       \"        'mouseover',\\n\",\n       \"        on_mouseover_closure('Stop Interaction')\\n\",\n       \"    );\\n\",\n       \"    buttongrp.appendChild(button);\\n\",\n       \"    var titlebar = this.root.querySelector('.ui-dialog-titlebar');\\n\",\n       \"    titlebar.insertBefore(buttongrp, titlebar.firstChild);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._remove_fig_handler = function (event) {\\n\",\n       \"    var fig = event.data.fig;\\n\",\n       \"    fig.close_ws(fig, {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (el) {\\n\",\n       \"    el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (el) {\\n\",\n       \"    // this is important to make the div 'focusable\\n\",\n       \"    el.setAttribute('tabindex', 0);\\n\",\n       \"    // reach out to IPython and tell the keyboard manager to turn it's self\\n\",\n       \"    // off when our div gets focus\\n\",\n       \"\\n\",\n       \"    // location in version 3\\n\",\n       \"    if (IPython.notebook.keyboard_manager) {\\n\",\n       \"        IPython.notebook.keyboard_manager.register_events(el);\\n\",\n       \"    } else {\\n\",\n       \"        // location in version 2\\n\",\n       \"        IPython.keyboard_manager.register_events(el);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (event, _name) {\\n\",\n       \"    var manager = IPython.notebook.keyboard_manager;\\n\",\n       \"    if (!manager) {\\n\",\n       \"        manager = IPython.keyboard_manager;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Check for shift+enter\\n\",\n       \"    if (event.shiftKey && event.which === 13) {\\n\",\n       \"        this.canvas_div.blur();\\n\",\n       \"        // select the cell after this one\\n\",\n       \"        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\\n\",\n       \"        IPython.notebook.select(index + 1);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    fig.ondownload(fig, null);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.find_output_cell = function (html_output) {\\n\",\n       \"    // Return the cell and output element which can be found *uniquely* in the notebook.\\n\",\n       \"    // Note - this is a bit hacky, but it is done because the \\\"notebook_saving.Notebook\\\"\\n\",\n       \"    // IPython event is triggered only after the cells have been serialised, which for\\n\",\n       \"    // our purposes (turning an active figure into a static one), is too late.\\n\",\n       \"    var cells = IPython.notebook.get_cells();\\n\",\n       \"    var ncells = cells.length;\\n\",\n       \"    for (var i = 0; i < ncells; i++) {\\n\",\n       \"        var cell = cells[i];\\n\",\n       \"        if (cell.cell_type === 'code') {\\n\",\n       \"            for (var j = 0; j < cell.output_area.outputs.length; j++) {\\n\",\n       \"                var data = cell.output_area.outputs[j];\\n\",\n       \"                if (data.data) {\\n\",\n       \"                    // IPython >= 3 moved mimebundle to data attribute of output\\n\",\n       \"                    data = data.data;\\n\",\n       \"                }\\n\",\n       \"                if (data['text/html'] === html_output) {\\n\",\n       \"                    return [cell, data, j];\\n\",\n       \"                }\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// Register the function which deals with the matplotlib target/channel.\\n\",\n       \"// The kernel may be null if the page has been refreshed.\\n\",\n       \"if (IPython.notebook.kernel !== null) {\\n\",\n       \"    IPython.notebook.kernel.comm_manager.register_target(\\n\",\n       \"        'matplotlib',\\n\",\n       \"        mpl.mpl_figure_comm\\n\",\n       \"    );\\n\",\n       \"}\\n\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.Javascript object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<img src=\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4XuxdC7hVVbUeoAiigiEPX6BkPvOmJJivmxIi+MhAzIiuIpXeMFAM3/k4pPKQQrFC0VLogRgmGgoKXkUKKMFHaihJPvKBD+JxJfIUj/uNZevcc/bZ5+wx5phzrT33/tf3+d0bZ465xvzHmP/811hzzd1i27Zt2wgXEAACQAAIAAEgAASAQNUg0AICsGpijYECASAABIAAEAACQCBBAAIQiQAEgAAQAAJAAAgAgSpDAAKwygKO4QIBIAAEgAAQAAJAAAIQOQAEgAAQAAJAAAgAgSpDAAKwygKO4QIBIAAEgAAQAAJAAAIQOQAEgAAQAAJAAAgAgSpDAAKwygKO4QIBIAAEgAAQAAJAAAIQOQAEgAAQAAJAAAgAgSpDAAKwygKO4QIBIAAEgAAQAAJAAAIQOQAEgAAQAAJAAAgAgSpDAAKwygKO4QIBIAAEgAAQAAJAAAIQOQAEgAAQAAJAAAgAgSpDAAKwygKO4QIBIAAEgAAQAAJAAAIQOQAEgAAQAAJAAAgAgSpDAAKwygKO4QIBIAAEgAAQAAJAAAIQOQAEgAAQAAJAAAgAgSpDAAKwygKO4QIBIAAEgAAQAAJAAAIQOQAEgAAQAAJAAAgAgSpDAAKwygKO4QIBIAAEgAAQAAJAAAIQOQAEgAAQAAJAAAgAgSpDAAKwygKO4QIBIAAEgAAQAAJAAAIQOQAEgAAQAAJAAAgAgSpDAAKwygKO4QIBIAAEgAAQAAJAAAIQOQAEgAAQAAJAAAgAgSpDAAKwygKO4QIBIAAEgAAQAAJAAAIQOQAEgAAQAAJAAAgAgSpDAAKwygKO4QIBIAAEgAAQAAJAAAIQOQAEgAAQAAJAAAgAgSpDAAKwygKO4QIBIAAEgAAQAAJAAAIQOQAEgAAQAAJAAAgAgSpDAAKwygKO4QIBIAAEgAAQAAJAAAIQOQAEgAAQAAJAAAgAgSpDAAKwygKO4QIBIAAEgAAQAAJAAAIQOQAEgAAQAAJAAAgAgSpDAAKwygKO4QIBIAAEgAAQAAJAAAIQOQAEgAAQAAJBEZg2bRoNGzaMXnvtNdp3332D3svS+bnnnksLFy6k119/3dINbIFAFAhAAEYRJjgJBIAAEIgXgVgF4KZNm+imm26iE044IfmvWq8ZM2bQ+++/T6NGjapWCCpy3BCAFRlWDCokAh999BHtsMMO1LJly5C3Qd9AoGIQiEUA/utf/6KtW7dS69atE+zXrFlDnTp1ouuuu45qamoqJh7agZx22mn04osvojKqBa7M20MAlnmA4N7HCDzxxBP0hS98ge6//34aOHBgA1j46fRrX/saLVmyhI4++mh6+eWX6eqrr6bHH3+c+An+0EMPpWuvvZZOP/30Oru1a9fS2LFj6dFHH01eS7GYO/bYY2n8+PF02GGH1bXj10G9e/eme+65JyHAu+++m1avXk1sv+uuuyI8QAAICBCIRQAWDgUC8GNEIAAFSR5hEwjACINWjS5v27aN9tlnHzryyCPpvvvuawDBqaeeSitXrqRVq1bRn/70p0TI7bXXXjR06FDaaaed6Fe/+hX99re/pV//+td14nH58uU0ePBg+vKXv0zdu3en9957j6ZOnUobN26kFStW0J577pncIxWAhxxySFL1O+ecc6i2tpYuvPBCatu2bTWGAmMGAmoEignAKVOm0I9//ONk3u62227J3LzxxhsbPVhxmx/84AfJg9d//Md/JP//NddcUzc/Nc7Mmzcvech75plnqEWLFnTggQfSxRdfTEOGDEm6qb8HkPcBMjcUXvWrgZKHTal/v/jFL+jWW29NHjS5Aslj5QfZk046qa4LCWa8x5JfVzPm9a/0FTZzWn1uu/fee+mVV16h2267Lal4Mn8yF37qU59K2rHdk08+2aAv5mLsk5RGtnzbQQCWb2zgWQECV111FU2aNCkRa+3bt0/++sEHHyRi7bvf/W7yiubEE09M9qosW7as7jUOi8fjjjsuafvnP/85sWMR16pVqwavcZnQDjrooKSv+gsMVwA/+clPJsS84447Ii5AAAgoESgUgDxXx4wZk8zXL33pS8kDHAuQz372s7R48eJkbvLF/3bBBRfQf/7nfyYPazxHua9PfOITtPfeeycPaNKL7b7+9a/Tpz/9afrqV7+aCM1nn3024YKf/exnjQTg3//+d/r5z39Ow4cPT8TpGWeckbT5zGc+k/wnfdiU+MdYMCbHHHNMci9+2PzDH/5AXbt2TQQrX1LMtAKwR48eCQ/+13/9F23YsCHZ88hvTfj+fC1YsIAuu+wyeuutt+jmm29O/m3nnXemAQMGSIaGNmWMAARgGQcHrjVEgJ+2Dz74YPrJT35C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rFmz6JprriHO0/333z/h4FNOOSUrl2nfffelN954o9H9LrjgAvrxj3/c6N/zwnnRokXJCRZPP/00MWfNnj27we/a8y9dXHfddXTnnXcmv6d97LHHJpzNmDZ38RjTkzEOO+yw5JxcPibNx9Wcz//617+SdXDu3Ln06quvJr//feKJJ9L48eOTXwNq6nLJMR9jqYQ+IADrRbF///40ePBg6tWrF23evJmuuuqqZNFasWIF7bTTTklLFnYPP/ww8aTnBOVDo/lnqniB42vLli3Ex8mwgOBJxBPznHPOofPOO4/Gjh2btHnttdfo0EMPpW9961v0zW9+k/7nf/6HRo0alfTblIDis5AOOOCAZELwcTIvvPACff3rX0/OLjz//PPrRpHVGNhfnpQsoHbddVe6++676fvf/37yG8o9evRoVng89thjiWBML/4pvVatWmU+hlQArly5ssEvJ3Tu3LnJnx4rtzjwrz784x//qMOO85ZJmx8OmBiLXakAzCIOfH8WgLzoc26w0CsUgFJM649FMs8qgaDTMUjmdeF4maMuuugi4vxOL/7JSp9nnJbCmHPwvvvuI8619OIH4Y4dOxY15d9m//znP588MJ922mk0Y8aMRAA+88wzCWdmcX3wwQcJj6cXrwF9+/ZNHuhPOOGERi7khfO8efOSdeeII46gM844o5EAZNwYR35A5AdvFtW8bvB61qZNm6JQ8rmVvF7dfvvtyXFovL6wIOccYl60Xs35zFx25plnJmslc9i6deuS/OVYLF++vMlba3PMOoZKsocAbCaaTASc9E8++WRCSpygXHljUuJE5YufZLmqkVaxOMGZuPh3QFOi5cl0+eWXE/e3ww47JP8/iz0mlvRi4clPaY888khRj/jJ7bvf/S69++67SR98XXHFFfTAAw80+zQdagzFnGRR95WvfIWuvfbaomNIhcezzz6biGTpFWoMqQBkomERK7nKPQ6cD7wY8EPGPvvsk3sc6jvARM3+FQpAF0wl80wSz1jbFM6JYuNgYcIPaswreV1Nxbwpf5g//v73v9NDDz1U14TfDjBfMI/mcTGG7M8rr7xS9DffywFnFvb1K4Bc/eMHdH5bdckllySw8frFaxL7y+tNsYtFHxdA+OxKvvjXsfgNFT9Q8nrj8yr0uVjf/LaLq49ckeVf6Sp2aXPM5xhi7wsCsJkIrlq1KimX81MTP30+/vjj1KdPn+TJpL5g4IWWSeLiiy9OxM9vfvObBoscL8af/OQnk6dYro6xmPzsZz+bPF2lF1fQuA+epMUufirjSgkvoOnFT6Rf+MIXaO3atfSJT3yiqF2oMRTejImCX53wK2muiha7UgHIhMKvobiiye1PP/30ZudRqDGkApDjx6+xOcZMJvyqpKmr3OPwxS9+MRnL/PnzmxxDlnGo70RTRO2CqWSexU7OzflfOCeKteWFnt8w7LXXXslCzpzDbyHqV99DY8Qx5zch/LaEq05HH310UpVqajHnf+etMcyF6cWvMZn3/vjHP4Z2t1H//HvOLKTYJ34jVK44F4opfoW63377UeHD9vHHH5+I6cmTJxcda9u2bZOK7YABA+r+zluY+CHiwQcf9Iq/RABy5fikk05K7t/U71trc8zrICLvDAKwiQAyYbIw4cT73e9+l7Tiyh/vqeEFtv7FTyj8KpRL7vw6lp9WHn300bommzZtSl4h896Gk08+ORE+3A+/yk0v/tupp55K3Jb3HxZePAm4jM8/W5deXMpnMuf/y1XIwivkGArvddNNNyV7Nbgi2tSrgjVr1tDPfvazRGDxa/Nf//rXxHZM7k2JwJBj4NcaLAJ79uyZxPQnP/kJ/fznP09eVfJiWewq5zhw1ZkXUM7Ts846q0lqyjIO9Z1oSgC6YCqZZ5Fzc5PuF5sTxRrzWwmuWn3mM59JHix5iwbvweK9oXvvvXcm8HClduPGjckWAN4OM2bMGHr77beTtx+77LJLIx/47Qa/svzqV79a9zfeY8127733XiY+178J/zTokCFDiPebNrUPrRxwLhRT/CqdeZY5YY899qgbEvMCt+VXvYUXt+WHBbZloZ5e/JDOb8GYF31epQQgFwl4DAcddBD98pe/bPLW2hzzOYbY+4IAbCKCvNePE4vFX0qWsQnAkGOoDxvjwvs2+AmR9yhqLq7+cIX0t7/9bVGzrMaQ3pyfkFlEsRD0JQCzGgNXVn7wgx8kpJ9uE5DGIlQcIAClEZC3K5ZPEmveZM8Piiyurr/+eomJ9zb8QM0V90mTJtE3vvGNsheAvCeb59KcOXPEWOSBc6UJQMZw0KBB9NZbbyUP6U1V/4oFpVSOiQNZBQ0hAIsEmV9hspjhp+X6X63G9Ao49BhS2PhraP4YhTcKcwVTe/EXZzfccENSHSi8shpD/fteeumliejnp/pil/Z1ZVZj4D0/XFnm/ac333yzNgzJ140h4iARgFpMuc9qfQXcVD5JA/7lL385OY3gnnvukZp4b8d7zPhBkR9YCq9yegXMb3J46w6fePClL31JhUPWOFfSK2AWf1yp5NfYvObyR4Laq7kc0/ZVye0hAOtFlxdR3uzKm2n5qaPwc/n0IxAmT3464YtfI3KJuvAjEBY06avQO+64g1hYvP/++8THMPBHIPzKl/cWphe/ZuC9fKU+AuHXIOkXs7wnJT22Ju0nqzHw/RgHFn8sArUEmfrLlUM+xoD3R+YxhsLJzV/78aspxrXYlX6wUE5xYD/T/YzpflUtaYWKg0QASjGt31f6EUhz80yLQTm3LzWvJb7z15S8ZYSPVOEKXB4Xvw5mkcfbAfjr8MKLPwLhbTD1K258HBe/xs76IxD2kbfcvPnmmw2O8CqFWx44N/URCH8Awh+C8MV7yHlNKvURCG9p4qNf+OLtBhwvfvDI4iOQVPzx1gXe484fXWqvUjmm7a+S20MA1osun/PErzO5+lf/7D/ewJzuy+PXLyzeeBJxWZoFI1+8b4Kv9HgK3i/C+9v4q92zzz472YxdeAwMn+nHAoqfcpgM6x8Dw19hsRDlI2L4YvHJPvF+KRaQvIeGbbnaU/8YmKzGwDjx5mDeTMxfnaYX48R48VU4Bt7bw69T0mNiWGTx0QS8967+eWVZjYE/wuEKLy+KvN+E/WDi4w8o+GOfYmMotzikuHOOMWn+/ve/b8RXecaBneEPFpiUeQFnUk/3H/FZhZwPEkx5LvCe2fT8OMk8qyTilswJrqTyHq60sva9730vOV/zU5/6VLKXmT/G4P22/MDF2GdxsQDhD5P4tS9vTeAPOvgrcN63zIt7oc/Mo7wNg/cT8xsFfrhk3szyGJhU+DA38Oty9qX+VS4485ziucUXcyqLet6L3qFDh0S08Z509r3+MTB8DFP9Y2CY5wYOHFj34R7PTeZ1Fr4sBJkjeR8kzzsfxwc15zPvVeTTNTjW/NV1/fvxmNJtLYU+l8qxLPI81ntAANaLHD9FFbv4C930kOb0IGiuftU/CLr+wcH86oCFIldl+OMPnlA8EQsPguavhnky8h5DFkL1D4Lmp08WmfzFZnrVPyyXz9Fi8clisP6V1Rj4PCzeGFx48VjZb74Kx8BExKTE+DAWXDnlymh6pE7aV1ZjYIHO1VnelM5fv3GVgV8t1j8cutzjkD4cMHmyGOdKXuGVdxyayhXe+8lfjvNVKrfTw3a5EpZeknkWKzEX+i2ZE4wz45nOP+aX/2vvDm4bhIIggLow2qMB+qQHa5CQvpCxL9iymOdjDsnftxtnkGGTi6xchGZLQPbF5WP+sz2d37DKupHcSrOu6xb4pml6zPO8PaGa1/HM+VpuJ8lC4H0RdH5Pf7kIOmfIRWDu/8snPLm1Ynz9i/PZIvv9PXhfBJ33uFwAxD4P1Iz1ZF7yd2fcGZoLxn0RdJ4YXpZl2wl4xevdmXOGV/8oID933MF4PPOnGbvi3Hf9HgLgXTurLgIECBAgQIDAiYAAaDQIECBAgAABAmUCAmBZw5VLgAABAgQIEBAAzQABAgQIECBAoExAACxruHIJECBAgAABAgKgGSBAgAABAgQIlAkIgGUNVy4BAgQIECBAQAA0AwQIECBAgACBMgEBsKzhyiVAgAABAgQICIBmgAABAgQIECBQJiAAljVcuQQIECBAgAABAdAMECBAgAABAgTKBATAsoYrlwABAgQIECAgAJoBAgQIECBAgECZgABY1nDlEiBAgAABAgQEQDNAgAABAgQIECgTEADLGq5cAgQIECBAgIAAaAYIECBAgAABAmUCAmBZw5VLgAABAgQIEBAAzQABAgQIECBAoExAACxruHIJECBAgAABAgKgGSBAgAABAgQIlAkIgGUNVy4BAgQIECBAQAA0AwQIECBAgACBMgEBsKzhyiVAgAABAgQICIBmgAABAgQIECBQJiAAljVcuQQIECBAgAABAdAMECBAgAABAgTKBATAsoYrlwABAgQIECAgAJoBAgQIECBAgECZgABY1nDlEiBAgAABAgQEQDNAgAABAgQIECgTeAItnsXfofx63AAAAABJRU5ErkJggg==\\\" width=\\\"640\\\">\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.HTML object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"array([[<AxesSubplot:title={'center':'year'}>,\\n\",\n       \"        <AxesSubplot:title={'center':'log_cite_count'}>]], dtype=object)\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"df[['year','log_cite_count']].hist()\"\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      \"['act', 'congress', 'district', 'state']\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<768x4 sparse matrix of type '<class 'numpy.int64'>'\\n\",\n       \"\\twith 2534 stored elements in Compressed Sparse Row format>\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"from sklearn.feature_extraction.text import CountVectorizer\\n\",\n    \"vectorizer = CountVectorizer(min_df=0.01, # at min 1% of docs\\n\",\n    \"                        max_df=.9,  \\n\",\n    \"                        max_features=4,\\n\",\n    \"                        stop_words='english',\\n\",\n    \"                        ngram_range=(1,3))\\n\",\n    \"X = vectorizer.fit_transform(df['opinion_text'])\\n\",\n    \"words = vectorizer.get_feature_names()\\n\",\n    \"print(words)\\n\",\n    \"X\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<div>\\n\",\n       \"<style scoped>\\n\",\n       \"    .dataframe tbody tr th:only-of-type {\\n\",\n       \"        vertical-align: middle;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe tbody tr th {\\n\",\n       \"        vertical-align: top;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe thead th {\\n\",\n       \"        text-align: right;\\n\",\n       \"    }\\n\",\n       \"</style>\\n\",\n       \"<table border=\\\"1\\\" class=\\\"dataframe\\\">\\n\",\n       \"  <thead>\\n\",\n       \"    <tr style=\\\"text-align: right;\\\">\\n\",\n       \"      <th></th>\\n\",\n       \"      <th>case_name</th>\\n\",\n       \"      <th>opinion_type</th>\\n\",\n       \"      <th>date_standard</th>\\n\",\n       \"      <th>authorship</th>\\n\",\n       \"      <th>x_republican</th>\\n\",\n       \"      <th>maj_judges</th>\\n\",\n       \"      <th>dissent_judges</th>\\n\",\n       \"      <th>topic_id</th>\\n\",\n       \"      <th>cite_count</th>\\n\",\n       \"      <th>opinion_text</th>\\n\",\n       \"      <th>year</th>\\n\",\n       \"      <th>log_cite_count</th>\\n\",\n       \"      <th>authorship_id</th>\\n\",\n       \"      <th>x_act</th>\\n\",\n       \"      <th>x_congress</th>\\n\",\n       \"      <th>x_district</th>\\n\",\n       \"      <th>x_state</th>\\n\",\n       \"    </tr>\\n\",\n       \"  </thead>\\n\",\n       \"  <tbody>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>0</th>\\n\",\n       \"      <td>ERICK CORNELL CLAY v. UNITED STATES</td>\\n\",\n       \"      <td>majority</td>\\n\",\n       \"      <td>2003-03-04</td>\\n\",\n       \"      <td>GINSBURG</td>\\n\",\n       \"      <td>0.0</td>\\n\",\n       \"      <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\\n\",\n       \"      <td>[]</td>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>2926.0</td>\\n\",\n       \"      <td>JUSTICE GINSBURG delivered the opinion of the ...</td>\\n\",\n       \"      <td>2003</td>\\n\",\n       \"      <td>7.981392</td>\\n\",\n       \"      <td>2</td>\\n\",\n       \"      <td>0.193548</td>\\n\",\n       \"      <td>0.225806</td>\\n\",\n       \"      <td>0.161290</td>\\n\",\n       \"      <td>0.419355</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>1</th>\\n\",\n       \"      <td>HILLSIDE DAIRY INC., A&amp;A DAIRY, L&amp;S DAIRY, AND...</td>\\n\",\n       \"      <td>majority</td>\\n\",\n       \"      <td>2003-06-09</td>\\n\",\n       \"      <td>STEVENS</td>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\\n\",\n       \"      <td>['THOMAS, CLARENCE']</td>\\n\",\n       \"      <td>8.0</td>\\n\",\n       \"      <td>117.0</td>\\n\",\n       \"      <td>Justice Stevens delivered the opinion of the C...</td>\\n\",\n       \"      <td>2003</td>\\n\",\n       \"      <td>4.762174</td>\\n\",\n       \"      <td>9</td>\\n\",\n       \"      <td>0.261905</td>\\n\",\n       \"      <td>0.095238</td>\\n\",\n       \"      <td>0.047619</td>\\n\",\n       \"      <td>0.595238</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>2</th>\\n\",\n       \"      <td>CHARLES RUSSELL RHINES v. DOUGLAS WEBER, WARDEN</td>\\n\",\n       \"      <td>majority</td>\\n\",\n       \"      <td>2005-03-30</td>\\n\",\n       \"      <td>O'CONNOR</td>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\\n\",\n       \"      <td>[]</td>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>23364.0</td>\\n\",\n       \"      <td>Justice O'Connor delivered the opinion of the ...</td>\\n\",\n       \"      <td>2005</td>\\n\",\n       \"      <td>10.058952</td>\\n\",\n       \"      <td>4</td>\\n\",\n       \"      <td>0.012821</td>\\n\",\n       \"      <td>0.025641</td>\\n\",\n       \"      <td>0.461538</td>\\n\",\n       \"      <td>0.500000</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>3</th>\\n\",\n       \"      <td>STATE OF ALASKA v. UNITED STATES OF AMERICA</td>\\n\",\n       \"      <td>majority</td>\\n\",\n       \"      <td>2005-06-06</td>\\n\",\n       \"      <td>KENNEDY</td>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\\n\",\n       \"      <td>['REHNQUIST, WILLIAM', 'SCALIA, ANTONIN', 'THO...</td>\\n\",\n       \"      <td>10.0</td>\\n\",\n       \"      <td>84.0</td>\\n\",\n       \"      <td>Justice Kennedy delivered the opinion of the C...</td>\\n\",\n       \"      <td>2005</td>\\n\",\n       \"      <td>4.430817</td>\\n\",\n       \"      <td>3</td>\\n\",\n       \"      <td>0.322581</td>\\n\",\n       \"      <td>0.129032</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.548387</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>4</th>\\n\",\n       \"      <td>REGINALD A. WILKINSON, DIRECTOR, OHIO DEPARTME...</td>\\n\",\n       \"      <td>majority</td>\\n\",\n       \"      <td>2005-06-13</td>\\n\",\n       \"      <td>KENNEDY</td>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\\n\",\n       \"      <td>[]</td>\\n\",\n       \"      <td>4.0</td>\\n\",\n       \"      <td>4230.0</td>\\n\",\n       \"      <td>Justice Kennedy delivered the opinion of the C...</td>\\n\",\n       \"      <td>2005</td>\\n\",\n       \"      <td>8.349957</td>\\n\",\n       \"      <td>3</td>\\n\",\n       \"      <td>0.019231</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.596154</td>\\n\",\n       \"      <td>0.384615</td>\\n\",\n       \"    </tr>\\n\",\n       \"  </tbody>\\n\",\n       \"</table>\\n\",\n       \"</div>\"\n      ],\n      \"text/plain\": [\n       \"                                           case_name opinion_type  \\\\\\n\",\n       \"0                ERICK CORNELL CLAY v. UNITED STATES     majority   \\n\",\n       \"1  HILLSIDE DAIRY INC., A&A DAIRY, L&S DAIRY, AND...     majority   \\n\",\n       \"2    CHARLES RUSSELL RHINES v. DOUGLAS WEBER, WARDEN     majority   \\n\",\n       \"3        STATE OF ALASKA v. UNITED STATES OF AMERICA     majority   \\n\",\n       \"4  REGINALD A. WILKINSON, DIRECTOR, OHIO DEPARTME...     majority   \\n\",\n       \"\\n\",\n       \"  date_standard authorship  x_republican  \\\\\\n\",\n       \"0    2003-03-04   GINSBURG           0.0   \\n\",\n       \"1    2003-06-09    STEVENS           1.0   \\n\",\n       \"2    2005-03-30   O'CONNOR           1.0   \\n\",\n       \"3    2005-06-06    KENNEDY           1.0   \\n\",\n       \"4    2005-06-13    KENNEDY           1.0   \\n\",\n       \"\\n\",\n       \"                                          maj_judges  \\\\\\n\",\n       \"0  ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...   \\n\",\n       \"1  ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...   \\n\",\n       \"2  ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...   \\n\",\n       \"3  ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...   \\n\",\n       \"4  ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...   \\n\",\n       \"\\n\",\n       \"                                      dissent_judges  topic_id  cite_count  \\\\\\n\",\n       \"0                                                 []       1.0      2926.0   \\n\",\n       \"1                               ['THOMAS, CLARENCE']       8.0       117.0   \\n\",\n       \"2                                                 []       1.0     23364.0   \\n\",\n       \"3  ['REHNQUIST, WILLIAM', 'SCALIA, ANTONIN', 'THO...      10.0        84.0   \\n\",\n       \"4                                                 []       4.0      4230.0   \\n\",\n       \"\\n\",\n       \"                                        opinion_text  year  log_cite_count  \\\\\\n\",\n       \"0  JUSTICE GINSBURG delivered the opinion of the ...  2003        7.981392   \\n\",\n       \"1  Justice Stevens delivered the opinion of the C...  2003        4.762174   \\n\",\n       \"2  Justice O'Connor delivered the opinion of the ...  2005       10.058952   \\n\",\n       \"3  Justice Kennedy delivered the opinion of the C...  2005        4.430817   \\n\",\n       \"4  Justice Kennedy delivered the opinion of the C...  2005        8.349957   \\n\",\n       \"\\n\",\n       \"   authorship_id     x_act  x_congress  x_district   x_state  \\n\",\n       \"0              2  0.193548    0.225806    0.161290  0.419355  \\n\",\n       \"1              9  0.261905    0.095238    0.047619  0.595238  \\n\",\n       \"2              4  0.012821    0.025641    0.461538  0.500000  \\n\",\n       \"3              3  0.322581    0.129032    0.000000  0.548387  \\n\",\n       \"4              3  0.019231    0.000000    0.596154  0.384615  \"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"X = X.todense()\\n\",\n    \"X = X / X.sum(axis=1) # counts to frequencies\\n\",\n    \"for i, word in enumerate(words):\\n\",\n    \"    column = X[:,i]\\n\",\n    \"    df['x_'+word] = column\\n\",\n    \"df.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"log_cite_count    1.000000\\n\",\n       \"x_state           0.153254\\n\",\n       \"x_district        0.111862\\n\",\n       \"x_congress       -0.137626\\n\",\n       \"x_act            -0.237354\\n\",\n       \"Name: log_cite_count, dtype: float64\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# inspecting data\\n\",\n    \"import numpy as np\\n\",\n    \"features = ['x_'+x for x in words]\\n\",\n    \"cites_features = ['log_cite_count'] + features\\n\",\n    \"df2 = df[cites_features]\\n\",\n    \"corr_matrix = df2.corr()\\n\",\n    \"corr_matrix['log_cite_count'].sort_values(ascending=False)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/javascript\": [\n       \"/* Put everything inside the global mpl namespace */\\n\",\n       \"/* global mpl */\\n\",\n       \"window.mpl = {};\\n\",\n       \"\\n\",\n       \"mpl.get_websocket_type = function () {\\n\",\n       \"    if (typeof WebSocket !== 'undefined') {\\n\",\n       \"        return WebSocket;\\n\",\n       \"    } else if (typeof MozWebSocket !== 'undefined') {\\n\",\n       \"        return MozWebSocket;\\n\",\n       \"    } else {\\n\",\n       \"        alert(\\n\",\n       \"            'Your browser does not have WebSocket support. ' +\\n\",\n       \"                'Please try Chrome, Safari or Firefox ≥ 6. ' +\\n\",\n       \"                'Firefox 4 and 5 are also supported but you ' +\\n\",\n       \"                'have to enable WebSockets in about:config.'\\n\",\n       \"        );\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\\n\",\n       \"    this.id = figure_id;\\n\",\n       \"\\n\",\n       \"    this.ws = websocket;\\n\",\n       \"\\n\",\n       \"    this.supports_binary = this.ws.binaryType !== undefined;\\n\",\n       \"\\n\",\n       \"    if (!this.supports_binary) {\\n\",\n       \"        var warnings = document.getElementById('mpl-warnings');\\n\",\n       \"        if (warnings) {\\n\",\n       \"            warnings.style.display = 'block';\\n\",\n       \"            warnings.textContent =\\n\",\n       \"                'This browser does not support binary websocket messages. ' +\\n\",\n       \"                'Performance may be slow.';\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    this.imageObj = new Image();\\n\",\n       \"\\n\",\n       \"    this.context = undefined;\\n\",\n       \"    this.message = undefined;\\n\",\n       \"    this.canvas = undefined;\\n\",\n       \"    this.rubberband_canvas = undefined;\\n\",\n       \"    this.rubberband_context = undefined;\\n\",\n       \"    this.format_dropdown = undefined;\\n\",\n       \"\\n\",\n       \"    this.image_mode = 'full';\\n\",\n       \"\\n\",\n       \"    this.root = document.createElement('div');\\n\",\n       \"    this.root.setAttribute('style', 'display: inline-block');\\n\",\n       \"    this._root_extra_style(this.root);\\n\",\n       \"\\n\",\n       \"    parent_element.appendChild(this.root);\\n\",\n       \"\\n\",\n       \"    this._init_header(this);\\n\",\n       \"    this._init_canvas(this);\\n\",\n       \"    this._init_toolbar(this);\\n\",\n       \"\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    this.waiting = false;\\n\",\n       \"\\n\",\n       \"    this.ws.onopen = function () {\\n\",\n       \"        fig.send_message('supports_binary', { value: fig.supports_binary });\\n\",\n       \"        fig.send_message('send_image_mode', {});\\n\",\n       \"        if (fig.ratio !== 1) {\\n\",\n       \"            fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\\n\",\n       \"        }\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onload = function () {\\n\",\n       \"        if (fig.image_mode === 'full') {\\n\",\n       \"            // Full images could contain transparency (where diff images\\n\",\n       \"            // almost always do), so we need to clear the canvas so that\\n\",\n       \"            // there is no ghosting.\\n\",\n       \"            fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\\n\",\n       \"        }\\n\",\n       \"        fig.context.drawImage(fig.imageObj, 0, 0);\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onunload = function () {\\n\",\n       \"        fig.ws.close();\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.ws.onmessage = this._make_on_message_function(this);\\n\",\n       \"\\n\",\n       \"    this.ondownload = ondownload;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_header = function () {\\n\",\n       \"    var titlebar = document.createElement('div');\\n\",\n       \"    titlebar.classList =\\n\",\n       \"        'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\\n\",\n       \"    var titletext = document.createElement('div');\\n\",\n       \"    titletext.classList = 'ui-dialog-title';\\n\",\n       \"    titletext.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'width: 100%; text-align: center; padding: 3px;'\\n\",\n       \"    );\\n\",\n       \"    titlebar.appendChild(titletext);\\n\",\n       \"    this.root.appendChild(titlebar);\\n\",\n       \"    this.header = titletext;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_canvas = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var canvas_div = (this.canvas_div = document.createElement('div'));\\n\",\n       \"    canvas_div.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'border: 1px solid #ddd;' +\\n\",\n       \"            'box-sizing: content-box;' +\\n\",\n       \"            'clear: both;' +\\n\",\n       \"            'min-height: 1px;' +\\n\",\n       \"            'min-width: 1px;' +\\n\",\n       \"            'outline: 0;' +\\n\",\n       \"            'overflow: hidden;' +\\n\",\n       \"            'position: relative;' +\\n\",\n       \"            'resize: both;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    function on_keyboard_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.key_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keydown',\\n\",\n       \"        on_keyboard_event_closure('key_press')\\n\",\n       \"    );\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keyup',\\n\",\n       \"        on_keyboard_event_closure('key_release')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    this._canvas_extra_style(canvas_div);\\n\",\n       \"    this.root.appendChild(canvas_div);\\n\",\n       \"\\n\",\n       \"    var canvas = (this.canvas = document.createElement('canvas'));\\n\",\n       \"    canvas.classList.add('mpl-canvas');\\n\",\n       \"    canvas.setAttribute('style', 'box-sizing: content-box;');\\n\",\n       \"\\n\",\n       \"    this.context = canvas.getContext('2d');\\n\",\n       \"\\n\",\n       \"    var backingStore =\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        this.context.webkitBackingStorePixelRatio ||\\n\",\n       \"        this.context.mozBackingStorePixelRatio ||\\n\",\n       \"        this.context.msBackingStorePixelRatio ||\\n\",\n       \"        this.context.oBackingStorePixelRatio ||\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        1;\\n\",\n       \"\\n\",\n       \"    this.ratio = (window.devicePixelRatio || 1) / backingStore;\\n\",\n       \"    if (this.ratio !== 1) {\\n\",\n       \"        fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var rubberband_canvas = (this.rubberband_canvas = document.createElement(\\n\",\n       \"        'canvas'\\n\",\n       \"    ));\\n\",\n       \"    rubberband_canvas.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    var resizeObserver = new ResizeObserver(function (entries) {\\n\",\n       \"        var nentries = entries.length;\\n\",\n       \"        for (var i = 0; i < nentries; i++) {\\n\",\n       \"            var entry = entries[i];\\n\",\n       \"            var width, height;\\n\",\n       \"            if (entry.contentBoxSize) {\\n\",\n       \"                if (entry.contentBoxSize instanceof Array) {\\n\",\n       \"                    // Chrome 84 implements new version of spec.\\n\",\n       \"                    width = entry.contentBoxSize[0].inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize[0].blockSize;\\n\",\n       \"                } else {\\n\",\n       \"                    // Firefox implements old version of spec.\\n\",\n       \"                    width = entry.contentBoxSize.inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize.blockSize;\\n\",\n       \"                }\\n\",\n       \"            } else {\\n\",\n       \"                // Chrome <84 implements even older version of spec.\\n\",\n       \"                width = entry.contentRect.width;\\n\",\n       \"                height = entry.contentRect.height;\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            // Keep the size of the canvas and rubber band canvas in sync with\\n\",\n       \"            // the canvas container.\\n\",\n       \"            if (entry.devicePixelContentBoxSize) {\\n\",\n       \"                // Chrome 84 implements new version of spec.\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'width',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].inlineSize\\n\",\n       \"                );\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'height',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].blockSize\\n\",\n       \"                );\\n\",\n       \"            } else {\\n\",\n       \"                canvas.setAttribute('width', width * fig.ratio);\\n\",\n       \"                canvas.setAttribute('height', height * fig.ratio);\\n\",\n       \"            }\\n\",\n       \"            canvas.setAttribute(\\n\",\n       \"                'style',\\n\",\n       \"                'width: ' + width + 'px; height: ' + height + 'px;'\\n\",\n       \"            );\\n\",\n       \"\\n\",\n       \"            rubberband_canvas.setAttribute('width', width);\\n\",\n       \"            rubberband_canvas.setAttribute('height', height);\\n\",\n       \"\\n\",\n       \"            // And update the size in Python. We ignore the initial 0/0 size\\n\",\n       \"            // that occurs as the element is placed into the DOM, which should\\n\",\n       \"            // otherwise not happen due to the minimum size styling.\\n\",\n       \"            if (width != 0 && height != 0) {\\n\",\n       \"                fig.request_resize(width, height);\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    });\\n\",\n       \"    resizeObserver.observe(canvas_div);\\n\",\n       \"\\n\",\n       \"    function on_mouse_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.mouse_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousedown',\\n\",\n       \"        on_mouse_event_closure('button_press')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseup',\\n\",\n       \"        on_mouse_event_closure('button_release')\\n\",\n       \"    );\\n\",\n       \"    // Throttle sequential mouse events to 1 every 20ms.\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousemove',\\n\",\n       \"        on_mouse_event_closure('motion_notify')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseenter',\\n\",\n       \"        on_mouse_event_closure('figure_enter')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseleave',\\n\",\n       \"        on_mouse_event_closure('figure_leave')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener('wheel', function (event) {\\n\",\n       \"        if (event.deltaY < 0) {\\n\",\n       \"            event.step = 1;\\n\",\n       \"        } else {\\n\",\n       \"            event.step = -1;\\n\",\n       \"        }\\n\",\n       \"        on_mouse_event_closure('scroll')(event);\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    canvas_div.appendChild(canvas);\\n\",\n       \"    canvas_div.appendChild(rubberband_canvas);\\n\",\n       \"\\n\",\n       \"    this.rubberband_context = rubberband_canvas.getContext('2d');\\n\",\n       \"    this.rubberband_context.strokeStyle = '#000000';\\n\",\n       \"\\n\",\n       \"    this._resize_canvas = function (width, height, forward) {\\n\",\n       \"        if (forward) {\\n\",\n       \"            canvas_div.style.width = width + 'px';\\n\",\n       \"            canvas_div.style.height = height + 'px';\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    // Disable right mouse context menu.\\n\",\n       \"    this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\\n\",\n       \"        event.preventDefault();\\n\",\n       \"        return false;\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    function set_focus() {\\n\",\n       \"        canvas.focus();\\n\",\n       \"        canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    window.setTimeout(set_focus, 100);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'mpl-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var button = (fig.buttons[name] = document.createElement('button'));\\n\",\n       \"        button.classList = 'mpl-widget';\\n\",\n       \"        button.setAttribute('role', 'button');\\n\",\n       \"        button.setAttribute('aria-disabled', 'false');\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"\\n\",\n       \"        var icon_img = document.createElement('img');\\n\",\n       \"        icon_img.src = '_images/' + image + '.png';\\n\",\n       \"        icon_img.srcset = '_images/' + image + '_large.png 2x';\\n\",\n       \"        icon_img.alt = tooltip;\\n\",\n       \"        button.appendChild(icon_img);\\n\",\n       \"\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fmt_picker = document.createElement('select');\\n\",\n       \"    fmt_picker.classList = 'mpl-widget';\\n\",\n       \"    toolbar.appendChild(fmt_picker);\\n\",\n       \"    this.format_dropdown = fmt_picker;\\n\",\n       \"\\n\",\n       \"    for (var ind in mpl.extensions) {\\n\",\n       \"        var fmt = mpl.extensions[ind];\\n\",\n       \"        var option = document.createElement('option');\\n\",\n       \"        option.selected = fmt === mpl.default_extension;\\n\",\n       \"        option.innerHTML = fmt;\\n\",\n       \"        fmt_picker.appendChild(option);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\\n\",\n       \"    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\\n\",\n       \"    // which will in turn request a refresh of the image.\\n\",\n       \"    this.send_message('resize', { width: x_pixels, height: y_pixels });\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_message = function (type, properties) {\\n\",\n       \"    properties['type'] = type;\\n\",\n       \"    properties['figure_id'] = this.id;\\n\",\n       \"    this.ws.send(JSON.stringify(properties));\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_draw_message = function () {\\n\",\n       \"    if (!this.waiting) {\\n\",\n       \"        this.waiting = true;\\n\",\n       \"        this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    var format_dropdown = fig.format_dropdown;\\n\",\n       \"    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\\n\",\n       \"    fig.ondownload(fig, format);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_resize = function (fig, msg) {\\n\",\n       \"    var size = msg['size'];\\n\",\n       \"    if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\\n\",\n       \"        fig._resize_canvas(size[0], size[1], msg['forward']);\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\\n\",\n       \"    var x0 = msg['x0'] / fig.ratio;\\n\",\n       \"    var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\\n\",\n       \"    var x1 = msg['x1'] / fig.ratio;\\n\",\n       \"    var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\\n\",\n       \"    x0 = Math.floor(x0) + 0.5;\\n\",\n       \"    y0 = Math.floor(y0) + 0.5;\\n\",\n       \"    x1 = Math.floor(x1) + 0.5;\\n\",\n       \"    y1 = Math.floor(y1) + 0.5;\\n\",\n       \"    var min_x = Math.min(x0, x1);\\n\",\n       \"    var min_y = Math.min(y0, y1);\\n\",\n       \"    var width = Math.abs(x1 - x0);\\n\",\n       \"    var height = Math.abs(y1 - y0);\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.clearRect(\\n\",\n       \"        0,\\n\",\n       \"        0,\\n\",\n       \"        fig.canvas.width / fig.ratio,\\n\",\n       \"        fig.canvas.height / fig.ratio\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\\n\",\n       \"    // Updates the figure title.\\n\",\n       \"    fig.header.textContent = msg['label'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_cursor = function (fig, msg) {\\n\",\n       \"    var cursor = msg['cursor'];\\n\",\n       \"    switch (cursor) {\\n\",\n       \"        case 0:\\n\",\n       \"            cursor = 'pointer';\\n\",\n       \"            break;\\n\",\n       \"        case 1:\\n\",\n       \"            cursor = 'default';\\n\",\n       \"            break;\\n\",\n       \"        case 2:\\n\",\n       \"            cursor = 'crosshair';\\n\",\n       \"            break;\\n\",\n       \"        case 3:\\n\",\n       \"            cursor = 'move';\\n\",\n       \"            break;\\n\",\n       \"    }\\n\",\n       \"    fig.rubberband_canvas.style.cursor = cursor;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_message = function (fig, msg) {\\n\",\n       \"    fig.message.textContent = msg['message'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_draw = function (fig, _msg) {\\n\",\n       \"    // Request the server to send over a new figure.\\n\",\n       \"    fig.send_draw_message();\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\\n\",\n       \"    fig.image_mode = msg['mode'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\\n\",\n       \"    for (var key in msg) {\\n\",\n       \"        if (!(key in fig.buttons)) {\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"        fig.buttons[key].disabled = !msg[key];\\n\",\n       \"        fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\\n\",\n       \"    if (msg['mode'] === 'PAN') {\\n\",\n       \"        fig.buttons['Pan'].classList.add('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    } else if (msg['mode'] === 'ZOOM') {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.add('active');\\n\",\n       \"    } else {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Called whenever the canvas gets updated.\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// A function to construct a web socket function for onmessage handling.\\n\",\n       \"// Called in the figure constructor.\\n\",\n       \"mpl.figure.prototype._make_on_message_function = function (fig) {\\n\",\n       \"    return function socket_on_message(evt) {\\n\",\n       \"        if (evt.data instanceof Blob) {\\n\",\n       \"            /* FIXME: We get \\\"Resource interpreted as Image but\\n\",\n       \"             * transferred with MIME type text/plain:\\\" errors on\\n\",\n       \"             * Chrome.  But how to set the MIME type?  It doesn't seem\\n\",\n       \"             * to be part of the websocket stream */\\n\",\n       \"            evt.data.type = 'image/png';\\n\",\n       \"\\n\",\n       \"            /* Free the memory for the previous frames */\\n\",\n       \"            if (fig.imageObj.src) {\\n\",\n       \"                (window.URL || window.webkitURL).revokeObjectURL(\\n\",\n       \"                    fig.imageObj.src\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\\n\",\n       \"                evt.data\\n\",\n       \"            );\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        } else if (\\n\",\n       \"            typeof evt.data === 'string' &&\\n\",\n       \"            evt.data.slice(0, 21) === 'data:image/png;base64'\\n\",\n       \"        ) {\\n\",\n       \"            fig.imageObj.src = evt.data;\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var msg = JSON.parse(evt.data);\\n\",\n       \"        var msg_type = msg['type'];\\n\",\n       \"\\n\",\n       \"        // Call the  \\\"handle_{type}\\\" callback, which takes\\n\",\n       \"        // the figure and JSON message as its only arguments.\\n\",\n       \"        try {\\n\",\n       \"            var callback = fig['handle_' + msg_type];\\n\",\n       \"        } catch (e) {\\n\",\n       \"            console.log(\\n\",\n       \"                \\\"No handler for the '\\\" + msg_type + \\\"' message type: \\\",\\n\",\n       \"                msg\\n\",\n       \"            );\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        if (callback) {\\n\",\n       \"            try {\\n\",\n       \"                // console.log(\\\"Handling '\\\" + msg_type + \\\"' message: \\\", msg);\\n\",\n       \"                callback(fig, msg);\\n\",\n       \"            } catch (e) {\\n\",\n       \"                console.log(\\n\",\n       \"                    \\\"Exception inside the 'handler_\\\" + msg_type + \\\"' callback:\\\",\\n\",\n       \"                    e,\\n\",\n       \"                    e.stack,\\n\",\n       \"                    msg\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\\n\",\n       \"mpl.findpos = function (e) {\\n\",\n       \"    //this section is from http://www.quirksmode.org/js/events_properties.html\\n\",\n       \"    var targ;\\n\",\n       \"    if (!e) {\\n\",\n       \"        e = window.event;\\n\",\n       \"    }\\n\",\n       \"    if (e.target) {\\n\",\n       \"        targ = e.target;\\n\",\n       \"    } else if (e.srcElement) {\\n\",\n       \"        targ = e.srcElement;\\n\",\n       \"    }\\n\",\n       \"    if (targ.nodeType === 3) {\\n\",\n       \"        // defeat Safari bug\\n\",\n       \"        targ = targ.parentNode;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // pageX,Y are the mouse positions relative to the document\\n\",\n       \"    var boundingRect = targ.getBoundingClientRect();\\n\",\n       \"    var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\\n\",\n       \"    var y = e.pageY - (boundingRect.top + document.body.scrollTop);\\n\",\n       \"\\n\",\n       \"    return { x: x, y: y };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"/*\\n\",\n       \" * return a copy of an object with only non-object keys\\n\",\n       \" * we need this to avoid circular references\\n\",\n       \" * http://stackoverflow.com/a/24161582/3208463\\n\",\n       \" */\\n\",\n       \"function simpleKeys(original) {\\n\",\n       \"    return Object.keys(original).reduce(function (obj, key) {\\n\",\n       \"        if (typeof original[key] !== 'object') {\\n\",\n       \"            obj[key] = original[key];\\n\",\n       \"        }\\n\",\n       \"        return obj;\\n\",\n       \"    }, {});\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.mouse_event = function (event, name) {\\n\",\n       \"    var canvas_pos = mpl.findpos(event);\\n\",\n       \"\\n\",\n       \"    if (name === 'button_press') {\\n\",\n       \"        this.canvas.focus();\\n\",\n       \"        this.canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var x = canvas_pos.x * this.ratio;\\n\",\n       \"    var y = canvas_pos.y * this.ratio;\\n\",\n       \"\\n\",\n       \"    this.send_message(name, {\\n\",\n       \"        x: x,\\n\",\n       \"        y: y,\\n\",\n       \"        button: event.button,\\n\",\n       \"        step: event.step,\\n\",\n       \"        guiEvent: simpleKeys(event),\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    /* This prevents the web browser from automatically changing to\\n\",\n       \"     * the text insertion cursor when the button is pressed.  We want\\n\",\n       \"     * to control all of the cursor setting manually through the\\n\",\n       \"     * 'cursor' event from matplotlib */\\n\",\n       \"    event.preventDefault();\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (_event, _name) {\\n\",\n       \"    // Handle any extra behaviour associated with a key event\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.key_event = function (event, name) {\\n\",\n       \"    // Prevent repeat events\\n\",\n       \"    if (name === 'key_press') {\\n\",\n       \"        if (event.which === this._key) {\\n\",\n       \"            return;\\n\",\n       \"        } else {\\n\",\n       \"            this._key = event.which;\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"    if (name === 'key_release') {\\n\",\n       \"        this._key = null;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var value = '';\\n\",\n       \"    if (event.ctrlKey && event.which !== 17) {\\n\",\n       \"        value += 'ctrl+';\\n\",\n       \"    }\\n\",\n       \"    if (event.altKey && event.which !== 18) {\\n\",\n       \"        value += 'alt+';\\n\",\n       \"    }\\n\",\n       \"    if (event.shiftKey && event.which !== 16) {\\n\",\n       \"        value += 'shift+';\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    value += 'k';\\n\",\n       \"    value += event.which.toString();\\n\",\n       \"\\n\",\n       \"    this._key_event_extra(event, name);\\n\",\n       \"\\n\",\n       \"    this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onclick = function (name) {\\n\",\n       \"    if (name === 'download') {\\n\",\n       \"        this.handle_save(this, null);\\n\",\n       \"    } else {\\n\",\n       \"        this.send_message('toolbar_button', { name: name });\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\\n\",\n       \"    this.message.textContent = tooltip;\\n\",\n       \"};\\n\",\n       \"mpl.toolbar_items = [[\\\"Home\\\", \\\"Reset original view\\\", \\\"fa fa-home icon-home\\\", \\\"home\\\"], [\\\"Back\\\", \\\"Back to previous view\\\", \\\"fa fa-arrow-left icon-arrow-left\\\", \\\"back\\\"], [\\\"Forward\\\", \\\"Forward to next view\\\", \\\"fa fa-arrow-right icon-arrow-right\\\", \\\"forward\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Pan\\\", \\\"Left button pans, Right button zooms\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-arrows icon-move\\\", \\\"pan\\\"], [\\\"Zoom\\\", \\\"Zoom to rectangle\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-square-o icon-check-empty\\\", \\\"zoom\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Download\\\", \\\"Download plot\\\", \\\"fa fa-floppy-o icon-save\\\", \\\"download\\\"]];\\n\",\n       \"\\n\",\n       \"mpl.extensions = [\\\"eps\\\", \\\"jpeg\\\", \\\"pdf\\\", \\\"png\\\", \\\"ps\\\", \\\"raw\\\", \\\"svg\\\", \\\"tif\\\"];\\n\",\n       \"\\n\",\n       \"mpl.default_extension = \\\"png\\\";/* global mpl */\\n\",\n       \"\\n\",\n       \"var comm_websocket_adapter = function (comm) {\\n\",\n       \"    // Create a \\\"websocket\\\"-like object which calls the given IPython comm\\n\",\n       \"    // object with the appropriate methods. Currently this is a non binary\\n\",\n       \"    // socket, so there is still some room for performance tuning.\\n\",\n       \"    var ws = {};\\n\",\n       \"\\n\",\n       \"    ws.close = function () {\\n\",\n       \"        comm.close();\\n\",\n       \"    };\\n\",\n       \"    ws.send = function (m) {\\n\",\n       \"        //console.log('sending', m);\\n\",\n       \"        comm.send(m);\\n\",\n       \"    };\\n\",\n       \"    // Register the callback with on_msg.\\n\",\n       \"    comm.on_msg(function (msg) {\\n\",\n       \"        //console.log('receiving', msg['content']['data'], msg);\\n\",\n       \"        // Pass the mpl event to the overridden (by mpl) onmessage function.\\n\",\n       \"        ws.onmessage(msg['content']['data']);\\n\",\n       \"    });\\n\",\n       \"    return ws;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.mpl_figure_comm = function (comm, msg) {\\n\",\n       \"    // This is the function which gets called when the mpl process\\n\",\n       \"    // starts-up an IPython Comm through the \\\"matplotlib\\\" channel.\\n\",\n       \"\\n\",\n       \"    var id = msg.content.data.id;\\n\",\n       \"    // Get hold of the div created by the display call when the Comm\\n\",\n       \"    // socket was opened in Python.\\n\",\n       \"    var element = document.getElementById(id);\\n\",\n       \"    var ws_proxy = comm_websocket_adapter(comm);\\n\",\n       \"\\n\",\n       \"    function ondownload(figure, _format) {\\n\",\n       \"        window.open(figure.canvas.toDataURL());\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fig = new mpl.figure(id, ws_proxy, ondownload, element);\\n\",\n       \"\\n\",\n       \"    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\\n\",\n       \"    // web socket which is closed, not our websocket->open comm proxy.\\n\",\n       \"    ws_proxy.onopen();\\n\",\n       \"\\n\",\n       \"    fig.parent_element = element;\\n\",\n       \"    fig.cell_info = mpl.find_output_cell(\\\"<div id='\\\" + id + \\\"'></div>\\\");\\n\",\n       \"    if (!fig.cell_info) {\\n\",\n       \"        console.error('Failed to find cell for figure', id, fig);\\n\",\n       \"        return;\\n\",\n       \"    }\\n\",\n       \"    fig.cell_info[0].output_area.element.one(\\n\",\n       \"        'cleared',\\n\",\n       \"        { fig: fig },\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_close = function (fig, msg) {\\n\",\n       \"    var width = fig.canvas.width / fig.ratio;\\n\",\n       \"    fig.cell_info[0].output_area.element.off(\\n\",\n       \"        'cleared',\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    // Update the output cell to use the data from the current canvas.\\n\",\n       \"    fig.push_to_output();\\n\",\n       \"    var dataURL = fig.canvas.toDataURL();\\n\",\n       \"    // Re-enable the keyboard manager in IPython - without this line, in FF,\\n\",\n       \"    // the notebook keyboard shortcuts fail.\\n\",\n       \"    IPython.keyboard_manager.enable();\\n\",\n       \"    fig.parent_element.innerHTML =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"    fig.close_ws(fig, msg);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.close_ws = function (fig, msg) {\\n\",\n       \"    fig.send_message('closing', msg);\\n\",\n       \"    // fig.ws.close()\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\\n\",\n       \"    // Turn the data on the canvas into data in the output cell.\\n\",\n       \"    var width = this.canvas.width / this.ratio;\\n\",\n       \"    var dataURL = this.canvas.toDataURL();\\n\",\n       \"    this.cell_info[1]['text/html'] =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Tell IPython that the notebook contents must change.\\n\",\n       \"    IPython.notebook.set_dirty(true);\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"    var fig = this;\\n\",\n       \"    // Wait a second, then push the new image to the DOM so\\n\",\n       \"    // that it is saved nicely (might be nice to debounce this).\\n\",\n       \"    setTimeout(function () {\\n\",\n       \"        fig.push_to_output();\\n\",\n       \"    }, 1000);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'btn-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'btn-group';\\n\",\n       \"    var button;\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'btn-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        button = fig.buttons[name] = document.createElement('button');\\n\",\n       \"        button.classList = 'btn btn-default';\\n\",\n       \"        button.href = '#';\\n\",\n       \"        button.title = name;\\n\",\n       \"        button.innerHTML = '<i class=\\\"fa ' + image + ' fa-lg\\\"></i>';\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Add the status bar.\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message pull-right';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"\\n\",\n       \"    // Add the close button to the window.\\n\",\n       \"    var buttongrp = document.createElement('div');\\n\",\n       \"    buttongrp.classList = 'btn-group inline pull-right';\\n\",\n       \"    button = document.createElement('button');\\n\",\n       \"    button.classList = 'btn btn-mini btn-primary';\\n\",\n       \"    button.href = '#';\\n\",\n       \"    button.title = 'Stop Interaction';\\n\",\n       \"    button.innerHTML = '<i class=\\\"fa fa-power-off icon-remove icon-large\\\"></i>';\\n\",\n       \"    button.addEventListener('click', function (_evt) {\\n\",\n       \"        fig.handle_close(fig, {});\\n\",\n       \"    });\\n\",\n       \"    button.addEventListener(\\n\",\n       \"        'mouseover',\\n\",\n       \"        on_mouseover_closure('Stop Interaction')\\n\",\n       \"    );\\n\",\n       \"    buttongrp.appendChild(button);\\n\",\n       \"    var titlebar = this.root.querySelector('.ui-dialog-titlebar');\\n\",\n       \"    titlebar.insertBefore(buttongrp, titlebar.firstChild);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._remove_fig_handler = function (event) {\\n\",\n       \"    var fig = event.data.fig;\\n\",\n       \"    fig.close_ws(fig, {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (el) {\\n\",\n       \"    el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (el) {\\n\",\n       \"    // this is important to make the div 'focusable\\n\",\n       \"    el.setAttribute('tabindex', 0);\\n\",\n       \"    // reach out to IPython and tell the keyboard manager to turn it's self\\n\",\n       \"    // off when our div gets focus\\n\",\n       \"\\n\",\n       \"    // location in version 3\\n\",\n       \"    if (IPython.notebook.keyboard_manager) {\\n\",\n       \"        IPython.notebook.keyboard_manager.register_events(el);\\n\",\n       \"    } else {\\n\",\n       \"        // location in version 2\\n\",\n       \"        IPython.keyboard_manager.register_events(el);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (event, _name) {\\n\",\n       \"    var manager = IPython.notebook.keyboard_manager;\\n\",\n       \"    if (!manager) {\\n\",\n       \"        manager = IPython.keyboard_manager;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Check for shift+enter\\n\",\n       \"    if (event.shiftKey && event.which === 13) {\\n\",\n       \"        this.canvas_div.blur();\\n\",\n       \"        // select the cell after this one\\n\",\n       \"        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\\n\",\n       \"        IPython.notebook.select(index + 1);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    fig.ondownload(fig, null);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.find_output_cell = function (html_output) {\\n\",\n       \"    // Return the cell and output element which can be found *uniquely* in the notebook.\\n\",\n       \"    // Note - this is a bit hacky, but it is done because the \\\"notebook_saving.Notebook\\\"\\n\",\n       \"    // IPython event is triggered only after the cells have been serialised, which for\\n\",\n       \"    // our purposes (turning an active figure into a static one), is too late.\\n\",\n       \"    var cells = IPython.notebook.get_cells();\\n\",\n       \"    var ncells = cells.length;\\n\",\n       \"    for (var i = 0; i < ncells; i++) {\\n\",\n       \"        var cell = cells[i];\\n\",\n       \"        if (cell.cell_type === 'code') {\\n\",\n       \"            for (var j = 0; j < cell.output_area.outputs.length; j++) {\\n\",\n       \"                var data = cell.output_area.outputs[j];\\n\",\n       \"                if (data.data) {\\n\",\n       \"                    // IPython >= 3 moved mimebundle to data attribute of output\\n\",\n       \"                    data = data.data;\\n\",\n       \"                }\\n\",\n       \"                if (data['text/html'] === html_output) {\\n\",\n       \"                    return [cell, data, j];\\n\",\n       \"                }\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// Register the function which deals with the matplotlib target/channel.\\n\",\n       \"// The kernel may be null if the page has been refreshed.\\n\",\n       \"if (IPython.notebook.kernel !== null) {\\n\",\n       \"    IPython.notebook.kernel.comm_manager.register_target(\\n\",\n       \"        'matplotlib',\\n\",\n       \"        mpl.mpl_figure_comm\\n\",\n       \"    );\\n\",\n       \"}\\n\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.Javascript object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<img src=\\\"data:image/png;base64,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\\\" width=\\\"640\\\">\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.HTML object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"array([[<AxesSubplot:xlabel='log_cite_count', ylabel='log_cite_count'>,\\n\",\n       \"        <AxesSubplot:xlabel='x_act', ylabel='log_cite_count'>,\\n\",\n       \"        <AxesSubplot:xlabel='x_congress', ylabel='log_cite_count'>,\\n\",\n       \"        <AxesSubplot:xlabel='x_district', ylabel='log_cite_count'>,\\n\",\n       \"        <AxesSubplot:xlabel='x_state', ylabel='log_cite_count'>],\\n\",\n       \"       [<AxesSubplot:xlabel='log_cite_count', ylabel='x_act'>,\\n\",\n       \"        <AxesSubplot:xlabel='x_act', ylabel='x_act'>,\\n\",\n       \"        <AxesSubplot:xlabel='x_congress', ylabel='x_act'>,\\n\",\n       \"        <AxesSubplot:xlabel='x_district', ylabel='x_act'>,\\n\",\n       \"        <AxesSubplot:xlabel='x_state', ylabel='x_act'>],\\n\",\n       \"       [<AxesSubplot:xlabel='log_cite_count', ylabel='x_congress'>,\\n\",\n       \"        <AxesSubplot:xlabel='x_act', ylabel='x_congress'>,\\n\",\n       \"        <AxesSubplot:xlabel='x_congress', ylabel='x_congress'>,\\n\",\n       \"        <AxesSubplot:xlabel='x_district', ylabel='x_congress'>,\\n\",\n       \"        <AxesSubplot:xlabel='x_state', ylabel='x_congress'>],\\n\",\n       \"       [<AxesSubplot:xlabel='log_cite_count', ylabel='x_district'>,\\n\",\n       \"        <AxesSubplot:xlabel='x_act', ylabel='x_district'>,\\n\",\n       \"        <AxesSubplot:xlabel='x_congress', ylabel='x_district'>,\\n\",\n       \"        <AxesSubplot:xlabel='x_district', ylabel='x_district'>,\\n\",\n       \"        <AxesSubplot:xlabel='x_state', ylabel='x_district'>],\\n\",\n       \"       [<AxesSubplot:xlabel='log_cite_count', ylabel='x_state'>,\\n\",\n       \"        <AxesSubplot:xlabel='x_act', ylabel='x_state'>,\\n\",\n       \"        <AxesSubplot:xlabel='x_congress', ylabel='x_state'>,\\n\",\n       \"        <AxesSubplot:xlabel='x_district', ylabel='x_state'>,\\n\",\n       \"        <AxesSubplot:xlabel='x_state', ylabel='x_state'>]], dtype=object)\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"from pandas.plotting import scatter_matrix\\n\",\n    \"scatter_matrix(df2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/javascript\": [\n       \"/* Put everything inside the global mpl namespace */\\n\",\n       \"/* global mpl */\\n\",\n       \"window.mpl = {};\\n\",\n       \"\\n\",\n       \"mpl.get_websocket_type = function () {\\n\",\n       \"    if (typeof WebSocket !== 'undefined') {\\n\",\n       \"        return WebSocket;\\n\",\n       \"    } else if (typeof MozWebSocket !== 'undefined') {\\n\",\n       \"        return MozWebSocket;\\n\",\n       \"    } else {\\n\",\n       \"        alert(\\n\",\n       \"            'Your browser does not have WebSocket support. ' +\\n\",\n       \"                'Please try Chrome, Safari or Firefox ≥ 6. ' +\\n\",\n       \"                'Firefox 4 and 5 are also supported but you ' +\\n\",\n       \"                'have to enable WebSockets in about:config.'\\n\",\n       \"        );\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\\n\",\n       \"    this.id = figure_id;\\n\",\n       \"\\n\",\n       \"    this.ws = websocket;\\n\",\n       \"\\n\",\n       \"    this.supports_binary = this.ws.binaryType !== undefined;\\n\",\n       \"\\n\",\n       \"    if (!this.supports_binary) {\\n\",\n       \"        var warnings = document.getElementById('mpl-warnings');\\n\",\n       \"        if (warnings) {\\n\",\n       \"            warnings.style.display = 'block';\\n\",\n       \"            warnings.textContent =\\n\",\n       \"                'This browser does not support binary websocket messages. ' +\\n\",\n       \"                'Performance may be slow.';\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    this.imageObj = new Image();\\n\",\n       \"\\n\",\n       \"    this.context = undefined;\\n\",\n       \"    this.message = undefined;\\n\",\n       \"    this.canvas = undefined;\\n\",\n       \"    this.rubberband_canvas = undefined;\\n\",\n       \"    this.rubberband_context = undefined;\\n\",\n       \"    this.format_dropdown = undefined;\\n\",\n       \"\\n\",\n       \"    this.image_mode = 'full';\\n\",\n       \"\\n\",\n       \"    this.root = document.createElement('div');\\n\",\n       \"    this.root.setAttribute('style', 'display: inline-block');\\n\",\n       \"    this._root_extra_style(this.root);\\n\",\n       \"\\n\",\n       \"    parent_element.appendChild(this.root);\\n\",\n       \"\\n\",\n       \"    this._init_header(this);\\n\",\n       \"    this._init_canvas(this);\\n\",\n       \"    this._init_toolbar(this);\\n\",\n       \"\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    this.waiting = false;\\n\",\n       \"\\n\",\n       \"    this.ws.onopen = function () {\\n\",\n       \"        fig.send_message('supports_binary', { value: fig.supports_binary });\\n\",\n       \"        fig.send_message('send_image_mode', {});\\n\",\n       \"        if (fig.ratio !== 1) {\\n\",\n       \"            fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\\n\",\n       \"        }\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onload = function () {\\n\",\n       \"        if (fig.image_mode === 'full') {\\n\",\n       \"            // Full images could contain transparency (where diff images\\n\",\n       \"            // almost always do), so we need to clear the canvas so that\\n\",\n       \"            // there is no ghosting.\\n\",\n       \"            fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\\n\",\n       \"        }\\n\",\n       \"        fig.context.drawImage(fig.imageObj, 0, 0);\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onunload = function () {\\n\",\n       \"        fig.ws.close();\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.ws.onmessage = this._make_on_message_function(this);\\n\",\n       \"\\n\",\n       \"    this.ondownload = ondownload;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_header = function () {\\n\",\n       \"    var titlebar = document.createElement('div');\\n\",\n       \"    titlebar.classList =\\n\",\n       \"        'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\\n\",\n       \"    var titletext = document.createElement('div');\\n\",\n       \"    titletext.classList = 'ui-dialog-title';\\n\",\n       \"    titletext.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'width: 100%; text-align: center; padding: 3px;'\\n\",\n       \"    );\\n\",\n       \"    titlebar.appendChild(titletext);\\n\",\n       \"    this.root.appendChild(titlebar);\\n\",\n       \"    this.header = titletext;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_canvas = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var canvas_div = (this.canvas_div = document.createElement('div'));\\n\",\n       \"    canvas_div.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'border: 1px solid #ddd;' +\\n\",\n       \"            'box-sizing: content-box;' +\\n\",\n       \"            'clear: both;' +\\n\",\n       \"            'min-height: 1px;' +\\n\",\n       \"            'min-width: 1px;' +\\n\",\n       \"            'outline: 0;' +\\n\",\n       \"            'overflow: hidden;' +\\n\",\n       \"            'position: relative;' +\\n\",\n       \"            'resize: both;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    function on_keyboard_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.key_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keydown',\\n\",\n       \"        on_keyboard_event_closure('key_press')\\n\",\n       \"    );\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keyup',\\n\",\n       \"        on_keyboard_event_closure('key_release')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    this._canvas_extra_style(canvas_div);\\n\",\n       \"    this.root.appendChild(canvas_div);\\n\",\n       \"\\n\",\n       \"    var canvas = (this.canvas = document.createElement('canvas'));\\n\",\n       \"    canvas.classList.add('mpl-canvas');\\n\",\n       \"    canvas.setAttribute('style', 'box-sizing: content-box;');\\n\",\n       \"\\n\",\n       \"    this.context = canvas.getContext('2d');\\n\",\n       \"\\n\",\n       \"    var backingStore =\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        this.context.webkitBackingStorePixelRatio ||\\n\",\n       \"        this.context.mozBackingStorePixelRatio ||\\n\",\n       \"        this.context.msBackingStorePixelRatio ||\\n\",\n       \"        this.context.oBackingStorePixelRatio ||\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        1;\\n\",\n       \"\\n\",\n       \"    this.ratio = (window.devicePixelRatio || 1) / backingStore;\\n\",\n       \"    if (this.ratio !== 1) {\\n\",\n       \"        fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var rubberband_canvas = (this.rubberband_canvas = document.createElement(\\n\",\n       \"        'canvas'\\n\",\n       \"    ));\\n\",\n       \"    rubberband_canvas.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    var resizeObserver = new ResizeObserver(function (entries) {\\n\",\n       \"        var nentries = entries.length;\\n\",\n       \"        for (var i = 0; i < nentries; i++) {\\n\",\n       \"            var entry = entries[i];\\n\",\n       \"            var width, height;\\n\",\n       \"            if (entry.contentBoxSize) {\\n\",\n       \"                if (entry.contentBoxSize instanceof Array) {\\n\",\n       \"                    // Chrome 84 implements new version of spec.\\n\",\n       \"                    width = entry.contentBoxSize[0].inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize[0].blockSize;\\n\",\n       \"                } else {\\n\",\n       \"                    // Firefox implements old version of spec.\\n\",\n       \"                    width = entry.contentBoxSize.inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize.blockSize;\\n\",\n       \"                }\\n\",\n       \"            } else {\\n\",\n       \"                // Chrome <84 implements even older version of spec.\\n\",\n       \"                width = entry.contentRect.width;\\n\",\n       \"                height = entry.contentRect.height;\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            // Keep the size of the canvas and rubber band canvas in sync with\\n\",\n       \"            // the canvas container.\\n\",\n       \"            if (entry.devicePixelContentBoxSize) {\\n\",\n       \"                // Chrome 84 implements new version of spec.\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'width',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].inlineSize\\n\",\n       \"                );\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'height',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].blockSize\\n\",\n       \"                );\\n\",\n       \"            } else {\\n\",\n       \"                canvas.setAttribute('width', width * fig.ratio);\\n\",\n       \"                canvas.setAttribute('height', height * fig.ratio);\\n\",\n       \"            }\\n\",\n       \"            canvas.setAttribute(\\n\",\n       \"                'style',\\n\",\n       \"                'width: ' + width + 'px; height: ' + height + 'px;'\\n\",\n       \"            );\\n\",\n       \"\\n\",\n       \"            rubberband_canvas.setAttribute('width', width);\\n\",\n       \"            rubberband_canvas.setAttribute('height', height);\\n\",\n       \"\\n\",\n       \"            // And update the size in Python. We ignore the initial 0/0 size\\n\",\n       \"            // that occurs as the element is placed into the DOM, which should\\n\",\n       \"            // otherwise not happen due to the minimum size styling.\\n\",\n       \"            if (width != 0 && height != 0) {\\n\",\n       \"                fig.request_resize(width, height);\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    });\\n\",\n       \"    resizeObserver.observe(canvas_div);\\n\",\n       \"\\n\",\n       \"    function on_mouse_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.mouse_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousedown',\\n\",\n       \"        on_mouse_event_closure('button_press')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseup',\\n\",\n       \"        on_mouse_event_closure('button_release')\\n\",\n       \"    );\\n\",\n       \"    // Throttle sequential mouse events to 1 every 20ms.\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousemove',\\n\",\n       \"        on_mouse_event_closure('motion_notify')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseenter',\\n\",\n       \"        on_mouse_event_closure('figure_enter')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseleave',\\n\",\n       \"        on_mouse_event_closure('figure_leave')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener('wheel', function (event) {\\n\",\n       \"        if (event.deltaY < 0) {\\n\",\n       \"            event.step = 1;\\n\",\n       \"        } else {\\n\",\n       \"            event.step = -1;\\n\",\n       \"        }\\n\",\n       \"        on_mouse_event_closure('scroll')(event);\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    canvas_div.appendChild(canvas);\\n\",\n       \"    canvas_div.appendChild(rubberband_canvas);\\n\",\n       \"\\n\",\n       \"    this.rubberband_context = rubberband_canvas.getContext('2d');\\n\",\n       \"    this.rubberband_context.strokeStyle = '#000000';\\n\",\n       \"\\n\",\n       \"    this._resize_canvas = function (width, height, forward) {\\n\",\n       \"        if (forward) {\\n\",\n       \"            canvas_div.style.width = width + 'px';\\n\",\n       \"            canvas_div.style.height = height + 'px';\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    // Disable right mouse context menu.\\n\",\n       \"    this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\\n\",\n       \"        event.preventDefault();\\n\",\n       \"        return false;\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    function set_focus() {\\n\",\n       \"        canvas.focus();\\n\",\n       \"        canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    window.setTimeout(set_focus, 100);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'mpl-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var button = (fig.buttons[name] = document.createElement('button'));\\n\",\n       \"        button.classList = 'mpl-widget';\\n\",\n       \"        button.setAttribute('role', 'button');\\n\",\n       \"        button.setAttribute('aria-disabled', 'false');\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"\\n\",\n       \"        var icon_img = document.createElement('img');\\n\",\n       \"        icon_img.src = '_images/' + image + '.png';\\n\",\n       \"        icon_img.srcset = '_images/' + image + '_large.png 2x';\\n\",\n       \"        icon_img.alt = tooltip;\\n\",\n       \"        button.appendChild(icon_img);\\n\",\n       \"\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fmt_picker = document.createElement('select');\\n\",\n       \"    fmt_picker.classList = 'mpl-widget';\\n\",\n       \"    toolbar.appendChild(fmt_picker);\\n\",\n       \"    this.format_dropdown = fmt_picker;\\n\",\n       \"\\n\",\n       \"    for (var ind in mpl.extensions) {\\n\",\n       \"        var fmt = mpl.extensions[ind];\\n\",\n       \"        var option = document.createElement('option');\\n\",\n       \"        option.selected = fmt === mpl.default_extension;\\n\",\n       \"        option.innerHTML = fmt;\\n\",\n       \"        fmt_picker.appendChild(option);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\\n\",\n       \"    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\\n\",\n       \"    // which will in turn request a refresh of the image.\\n\",\n       \"    this.send_message('resize', { width: x_pixels, height: y_pixels });\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_message = function (type, properties) {\\n\",\n       \"    properties['type'] = type;\\n\",\n       \"    properties['figure_id'] = this.id;\\n\",\n       \"    this.ws.send(JSON.stringify(properties));\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_draw_message = function () {\\n\",\n       \"    if (!this.waiting) {\\n\",\n       \"        this.waiting = true;\\n\",\n       \"        this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    var format_dropdown = fig.format_dropdown;\\n\",\n       \"    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\\n\",\n       \"    fig.ondownload(fig, format);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_resize = function (fig, msg) {\\n\",\n       \"    var size = msg['size'];\\n\",\n       \"    if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\\n\",\n       \"        fig._resize_canvas(size[0], size[1], msg['forward']);\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\\n\",\n       \"    var x0 = msg['x0'] / fig.ratio;\\n\",\n       \"    var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\\n\",\n       \"    var x1 = msg['x1'] / fig.ratio;\\n\",\n       \"    var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\\n\",\n       \"    x0 = Math.floor(x0) + 0.5;\\n\",\n       \"    y0 = Math.floor(y0) + 0.5;\\n\",\n       \"    x1 = Math.floor(x1) + 0.5;\\n\",\n       \"    y1 = Math.floor(y1) + 0.5;\\n\",\n       \"    var min_x = Math.min(x0, x1);\\n\",\n       \"    var min_y = Math.min(y0, y1);\\n\",\n       \"    var width = Math.abs(x1 - x0);\\n\",\n       \"    var height = Math.abs(y1 - y0);\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.clearRect(\\n\",\n       \"        0,\\n\",\n       \"        0,\\n\",\n       \"        fig.canvas.width / fig.ratio,\\n\",\n       \"        fig.canvas.height / fig.ratio\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\\n\",\n       \"    // Updates the figure title.\\n\",\n       \"    fig.header.textContent = msg['label'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_cursor = function (fig, msg) {\\n\",\n       \"    var cursor = msg['cursor'];\\n\",\n       \"    switch (cursor) {\\n\",\n       \"        case 0:\\n\",\n       \"            cursor = 'pointer';\\n\",\n       \"            break;\\n\",\n       \"        case 1:\\n\",\n       \"            cursor = 'default';\\n\",\n       \"            break;\\n\",\n       \"        case 2:\\n\",\n       \"            cursor = 'crosshair';\\n\",\n       \"            break;\\n\",\n       \"        case 3:\\n\",\n       \"            cursor = 'move';\\n\",\n       \"            break;\\n\",\n       \"    }\\n\",\n       \"    fig.rubberband_canvas.style.cursor = cursor;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_message = function (fig, msg) {\\n\",\n       \"    fig.message.textContent = msg['message'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_draw = function (fig, _msg) {\\n\",\n       \"    // Request the server to send over a new figure.\\n\",\n       \"    fig.send_draw_message();\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\\n\",\n       \"    fig.image_mode = msg['mode'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\\n\",\n       \"    for (var key in msg) {\\n\",\n       \"        if (!(key in fig.buttons)) {\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"        fig.buttons[key].disabled = !msg[key];\\n\",\n       \"        fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\\n\",\n       \"    if (msg['mode'] === 'PAN') {\\n\",\n       \"        fig.buttons['Pan'].classList.add('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    } else if (msg['mode'] === 'ZOOM') {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.add('active');\\n\",\n       \"    } else {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Called whenever the canvas gets updated.\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// A function to construct a web socket function for onmessage handling.\\n\",\n       \"// Called in the figure constructor.\\n\",\n       \"mpl.figure.prototype._make_on_message_function = function (fig) {\\n\",\n       \"    return function socket_on_message(evt) {\\n\",\n       \"        if (evt.data instanceof Blob) {\\n\",\n       \"            /* FIXME: We get \\\"Resource interpreted as Image but\\n\",\n       \"             * transferred with MIME type text/plain:\\\" errors on\\n\",\n       \"             * Chrome.  But how to set the MIME type?  It doesn't seem\\n\",\n       \"             * to be part of the websocket stream */\\n\",\n       \"            evt.data.type = 'image/png';\\n\",\n       \"\\n\",\n       \"            /* Free the memory for the previous frames */\\n\",\n       \"            if (fig.imageObj.src) {\\n\",\n       \"                (window.URL || window.webkitURL).revokeObjectURL(\\n\",\n       \"                    fig.imageObj.src\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\\n\",\n       \"                evt.data\\n\",\n       \"            );\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        } else if (\\n\",\n       \"            typeof evt.data === 'string' &&\\n\",\n       \"            evt.data.slice(0, 21) === 'data:image/png;base64'\\n\",\n       \"        ) {\\n\",\n       \"            fig.imageObj.src = evt.data;\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var msg = JSON.parse(evt.data);\\n\",\n       \"        var msg_type = msg['type'];\\n\",\n       \"\\n\",\n       \"        // Call the  \\\"handle_{type}\\\" callback, which takes\\n\",\n       \"        // the figure and JSON message as its only arguments.\\n\",\n       \"        try {\\n\",\n       \"            var callback = fig['handle_' + msg_type];\\n\",\n       \"        } catch (e) {\\n\",\n       \"            console.log(\\n\",\n       \"                \\\"No handler for the '\\\" + msg_type + \\\"' message type: \\\",\\n\",\n       \"                msg\\n\",\n       \"            );\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        if (callback) {\\n\",\n       \"            try {\\n\",\n       \"                // console.log(\\\"Handling '\\\" + msg_type + \\\"' message: \\\", msg);\\n\",\n       \"                callback(fig, msg);\\n\",\n       \"            } catch (e) {\\n\",\n       \"                console.log(\\n\",\n       \"                    \\\"Exception inside the 'handler_\\\" + msg_type + \\\"' callback:\\\",\\n\",\n       \"                    e,\\n\",\n       \"                    e.stack,\\n\",\n       \"                    msg\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\\n\",\n       \"mpl.findpos = function (e) {\\n\",\n       \"    //this section is from http://www.quirksmode.org/js/events_properties.html\\n\",\n       \"    var targ;\\n\",\n       \"    if (!e) {\\n\",\n       \"        e = window.event;\\n\",\n       \"    }\\n\",\n       \"    if (e.target) {\\n\",\n       \"        targ = e.target;\\n\",\n       \"    } else if (e.srcElement) {\\n\",\n       \"        targ = e.srcElement;\\n\",\n       \"    }\\n\",\n       \"    if (targ.nodeType === 3) {\\n\",\n       \"        // defeat Safari bug\\n\",\n       \"        targ = targ.parentNode;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // pageX,Y are the mouse positions relative to the document\\n\",\n       \"    var boundingRect = targ.getBoundingClientRect();\\n\",\n       \"    var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\\n\",\n       \"    var y = e.pageY - (boundingRect.top + document.body.scrollTop);\\n\",\n       \"\\n\",\n       \"    return { x: x, y: y };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"/*\\n\",\n       \" * return a copy of an object with only non-object keys\\n\",\n       \" * we need this to avoid circular references\\n\",\n       \" * http://stackoverflow.com/a/24161582/3208463\\n\",\n       \" */\\n\",\n       \"function simpleKeys(original) {\\n\",\n       \"    return Object.keys(original).reduce(function (obj, key) {\\n\",\n       \"        if (typeof original[key] !== 'object') {\\n\",\n       \"            obj[key] = original[key];\\n\",\n       \"        }\\n\",\n       \"        return obj;\\n\",\n       \"    }, {});\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.mouse_event = function (event, name) {\\n\",\n       \"    var canvas_pos = mpl.findpos(event);\\n\",\n       \"\\n\",\n       \"    if (name === 'button_press') {\\n\",\n       \"        this.canvas.focus();\\n\",\n       \"        this.canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var x = canvas_pos.x * this.ratio;\\n\",\n       \"    var y = canvas_pos.y * this.ratio;\\n\",\n       \"\\n\",\n       \"    this.send_message(name, {\\n\",\n       \"        x: x,\\n\",\n       \"        y: y,\\n\",\n       \"        button: event.button,\\n\",\n       \"        step: event.step,\\n\",\n       \"        guiEvent: simpleKeys(event),\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    /* This prevents the web browser from automatically changing to\\n\",\n       \"     * the text insertion cursor when the button is pressed.  We want\\n\",\n       \"     * to control all of the cursor setting manually through the\\n\",\n       \"     * 'cursor' event from matplotlib */\\n\",\n       \"    event.preventDefault();\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (_event, _name) {\\n\",\n       \"    // Handle any extra behaviour associated with a key event\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.key_event = function (event, name) {\\n\",\n       \"    // Prevent repeat events\\n\",\n       \"    if (name === 'key_press') {\\n\",\n       \"        if (event.which === this._key) {\\n\",\n       \"            return;\\n\",\n       \"        } else {\\n\",\n       \"            this._key = event.which;\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"    if (name === 'key_release') {\\n\",\n       \"        this._key = null;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var value = '';\\n\",\n       \"    if (event.ctrlKey && event.which !== 17) {\\n\",\n       \"        value += 'ctrl+';\\n\",\n       \"    }\\n\",\n       \"    if (event.altKey && event.which !== 18) {\\n\",\n       \"        value += 'alt+';\\n\",\n       \"    }\\n\",\n       \"    if (event.shiftKey && event.which !== 16) {\\n\",\n       \"        value += 'shift+';\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    value += 'k';\\n\",\n       \"    value += event.which.toString();\\n\",\n       \"\\n\",\n       \"    this._key_event_extra(event, name);\\n\",\n       \"\\n\",\n       \"    this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onclick = function (name) {\\n\",\n       \"    if (name === 'download') {\\n\",\n       \"        this.handle_save(this, null);\\n\",\n       \"    } else {\\n\",\n       \"        this.send_message('toolbar_button', { name: name });\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\\n\",\n       \"    this.message.textContent = tooltip;\\n\",\n       \"};\\n\",\n       \"mpl.toolbar_items = [[\\\"Home\\\", \\\"Reset original view\\\", \\\"fa fa-home icon-home\\\", \\\"home\\\"], [\\\"Back\\\", \\\"Back to previous view\\\", \\\"fa fa-arrow-left icon-arrow-left\\\", \\\"back\\\"], [\\\"Forward\\\", \\\"Forward to next view\\\", \\\"fa fa-arrow-right icon-arrow-right\\\", \\\"forward\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Pan\\\", \\\"Left button pans, Right button zooms\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-arrows icon-move\\\", \\\"pan\\\"], [\\\"Zoom\\\", \\\"Zoom to rectangle\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-square-o icon-check-empty\\\", \\\"zoom\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Download\\\", \\\"Download plot\\\", \\\"fa fa-floppy-o icon-save\\\", \\\"download\\\"]];\\n\",\n       \"\\n\",\n       \"mpl.extensions = [\\\"eps\\\", \\\"jpeg\\\", \\\"pdf\\\", \\\"png\\\", \\\"ps\\\", \\\"raw\\\", \\\"svg\\\", \\\"tif\\\"];\\n\",\n       \"\\n\",\n       \"mpl.default_extension = \\\"png\\\";/* global mpl */\\n\",\n       \"\\n\",\n       \"var comm_websocket_adapter = function (comm) {\\n\",\n       \"    // Create a \\\"websocket\\\"-like object which calls the given IPython comm\\n\",\n       \"    // object with the appropriate methods. Currently this is a non binary\\n\",\n       \"    // socket, so there is still some room for performance tuning.\\n\",\n       \"    var ws = {};\\n\",\n       \"\\n\",\n       \"    ws.close = function () {\\n\",\n       \"        comm.close();\\n\",\n       \"    };\\n\",\n       \"    ws.send = function (m) {\\n\",\n       \"        //console.log('sending', m);\\n\",\n       \"        comm.send(m);\\n\",\n       \"    };\\n\",\n       \"    // Register the callback with on_msg.\\n\",\n       \"    comm.on_msg(function (msg) {\\n\",\n       \"        //console.log('receiving', msg['content']['data'], msg);\\n\",\n       \"        // Pass the mpl event to the overridden (by mpl) onmessage function.\\n\",\n       \"        ws.onmessage(msg['content']['data']);\\n\",\n       \"    });\\n\",\n       \"    return ws;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.mpl_figure_comm = function (comm, msg) {\\n\",\n       \"    // This is the function which gets called when the mpl process\\n\",\n       \"    // starts-up an IPython Comm through the \\\"matplotlib\\\" channel.\\n\",\n       \"\\n\",\n       \"    var id = msg.content.data.id;\\n\",\n       \"    // Get hold of the div created by the display call when the Comm\\n\",\n       \"    // socket was opened in Python.\\n\",\n       \"    var element = document.getElementById(id);\\n\",\n       \"    var ws_proxy = comm_websocket_adapter(comm);\\n\",\n       \"\\n\",\n       \"    function ondownload(figure, _format) {\\n\",\n       \"        window.open(figure.canvas.toDataURL());\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fig = new mpl.figure(id, ws_proxy, ondownload, element);\\n\",\n       \"\\n\",\n       \"    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\\n\",\n       \"    // web socket which is closed, not our websocket->open comm proxy.\\n\",\n       \"    ws_proxy.onopen();\\n\",\n       \"\\n\",\n       \"    fig.parent_element = element;\\n\",\n       \"    fig.cell_info = mpl.find_output_cell(\\\"<div id='\\\" + id + \\\"'></div>\\\");\\n\",\n       \"    if (!fig.cell_info) {\\n\",\n       \"        console.error('Failed to find cell for figure', id, fig);\\n\",\n       \"        return;\\n\",\n       \"    }\\n\",\n       \"    fig.cell_info[0].output_area.element.one(\\n\",\n       \"        'cleared',\\n\",\n       \"        { fig: fig },\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_close = function (fig, msg) {\\n\",\n       \"    var width = fig.canvas.width / fig.ratio;\\n\",\n       \"    fig.cell_info[0].output_area.element.off(\\n\",\n       \"        'cleared',\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    // Update the output cell to use the data from the current canvas.\\n\",\n       \"    fig.push_to_output();\\n\",\n       \"    var dataURL = fig.canvas.toDataURL();\\n\",\n       \"    // Re-enable the keyboard manager in IPython - without this line, in FF,\\n\",\n       \"    // the notebook keyboard shortcuts fail.\\n\",\n       \"    IPython.keyboard_manager.enable();\\n\",\n       \"    fig.parent_element.innerHTML =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"    fig.close_ws(fig, msg);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.close_ws = function (fig, msg) {\\n\",\n       \"    fig.send_message('closing', msg);\\n\",\n       \"    // fig.ws.close()\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\\n\",\n       \"    // Turn the data on the canvas into data in the output cell.\\n\",\n       \"    var width = this.canvas.width / this.ratio;\\n\",\n       \"    var dataURL = this.canvas.toDataURL();\\n\",\n       \"    this.cell_info[1]['text/html'] =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Tell IPython that the notebook contents must change.\\n\",\n       \"    IPython.notebook.set_dirty(true);\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"    var fig = this;\\n\",\n       \"    // Wait a second, then push the new image to the DOM so\\n\",\n       \"    // that it is saved nicely (might be nice to debounce this).\\n\",\n       \"    setTimeout(function () {\\n\",\n       \"        fig.push_to_output();\\n\",\n       \"    }, 1000);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'btn-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'btn-group';\\n\",\n       \"    var button;\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'btn-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        button = fig.buttons[name] = document.createElement('button');\\n\",\n       \"        button.classList = 'btn btn-default';\\n\",\n       \"        button.href = '#';\\n\",\n       \"        button.title = name;\\n\",\n       \"        button.innerHTML = '<i class=\\\"fa ' + image + ' fa-lg\\\"></i>';\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Add the status bar.\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message pull-right';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"\\n\",\n       \"    // Add the close button to the window.\\n\",\n       \"    var buttongrp = document.createElement('div');\\n\",\n       \"    buttongrp.classList = 'btn-group inline pull-right';\\n\",\n       \"    button = document.createElement('button');\\n\",\n       \"    button.classList = 'btn btn-mini btn-primary';\\n\",\n       \"    button.href = '#';\\n\",\n       \"    button.title = 'Stop Interaction';\\n\",\n       \"    button.innerHTML = '<i class=\\\"fa fa-power-off icon-remove icon-large\\\"></i>';\\n\",\n       \"    button.addEventListener('click', function (_evt) {\\n\",\n       \"        fig.handle_close(fig, {});\\n\",\n       \"    });\\n\",\n       \"    button.addEventListener(\\n\",\n       \"        'mouseover',\\n\",\n       \"        on_mouseover_closure('Stop Interaction')\\n\",\n       \"    );\\n\",\n       \"    buttongrp.appendChild(button);\\n\",\n       \"    var titlebar = this.root.querySelector('.ui-dialog-titlebar');\\n\",\n       \"    titlebar.insertBefore(buttongrp, titlebar.firstChild);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._remove_fig_handler = function (event) {\\n\",\n       \"    var fig = event.data.fig;\\n\",\n       \"    fig.close_ws(fig, {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (el) {\\n\",\n       \"    el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (el) {\\n\",\n       \"    // this is important to make the div 'focusable\\n\",\n       \"    el.setAttribute('tabindex', 0);\\n\",\n       \"    // reach out to IPython and tell the keyboard manager to turn it's self\\n\",\n       \"    // off when our div gets focus\\n\",\n       \"\\n\",\n       \"    // location in version 3\\n\",\n       \"    if (IPython.notebook.keyboard_manager) {\\n\",\n       \"        IPython.notebook.keyboard_manager.register_events(el);\\n\",\n       \"    } else {\\n\",\n       \"        // location in version 2\\n\",\n       \"        IPython.keyboard_manager.register_events(el);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (event, _name) {\\n\",\n       \"    var manager = IPython.notebook.keyboard_manager;\\n\",\n       \"    if (!manager) {\\n\",\n       \"        manager = IPython.keyboard_manager;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Check for shift+enter\\n\",\n       \"    if (event.shiftKey && event.which === 13) {\\n\",\n       \"        this.canvas_div.blur();\\n\",\n       \"        // select the cell after this one\\n\",\n       \"        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\\n\",\n       \"        IPython.notebook.select(index + 1);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    fig.ondownload(fig, null);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.find_output_cell = function (html_output) {\\n\",\n       \"    // Return the cell and output element which can be found *uniquely* in the notebook.\\n\",\n       \"    // Note - this is a bit hacky, but it is done because the \\\"notebook_saving.Notebook\\\"\\n\",\n       \"    // IPython event is triggered only after the cells have been serialised, which for\\n\",\n       \"    // our purposes (turning an active figure into a static one), is too late.\\n\",\n       \"    var cells = IPython.notebook.get_cells();\\n\",\n       \"    var ncells = cells.length;\\n\",\n       \"    for (var i = 0; i < ncells; i++) {\\n\",\n       \"        var cell = cells[i];\\n\",\n       \"        if (cell.cell_type === 'code') {\\n\",\n       \"            for (var j = 0; j < cell.output_area.outputs.length; j++) {\\n\",\n       \"                var data = cell.output_area.outputs[j];\\n\",\n       \"                if (data.data) {\\n\",\n       \"                    // IPython >= 3 moved mimebundle to data attribute of output\\n\",\n       \"                    data = data.data;\\n\",\n       \"                }\\n\",\n       \"                if (data['text/html'] === html_output) {\\n\",\n       \"                    return [cell, data, j];\\n\",\n       \"                }\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// Register the function which deals with the matplotlib target/channel.\\n\",\n       \"// The kernel may be null if the page has been refreshed.\\n\",\n       \"if (IPython.notebook.kernel !== null) {\\n\",\n       \"    IPython.notebook.kernel.comm_manager.register_target(\\n\",\n       \"        'matplotlib',\\n\",\n       \"        mpl.mpl_figure_comm\\n\",\n       \"    );\\n\",\n       \"}\\n\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.Javascript object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<img src=\\\"data:image/png;base64,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\\\" width=\\\"640\\\">\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.HTML object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<AxesSubplot:xlabel='x_act', ylabel='log_cite_count'>\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"df2.plot(kind='scatter', x='x_act', y='log_cite_count', alpha = 0.1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Regression\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# create a test set \\n\",\n    \"from sklearn.model_selection import train_test_split\\n\",\n    \"train, test = train_test_split(df2, test_size=0.2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<div>\\n\",\n       \"<style scoped>\\n\",\n       \"    .dataframe tbody tr th:only-of-type {\\n\",\n       \"        vertical-align: middle;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe tbody tr th {\\n\",\n       \"        vertical-align: top;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe thead th {\\n\",\n       \"        text-align: right;\\n\",\n       \"    }\\n\",\n       \"</style>\\n\",\n       \"<table border=\\\"1\\\" class=\\\"dataframe\\\">\\n\",\n       \"  <thead>\\n\",\n       \"    <tr style=\\\"text-align: right;\\\">\\n\",\n       \"      <th></th>\\n\",\n       \"      <th>x_act</th>\\n\",\n       \"      <th>x_congress</th>\\n\",\n       \"      <th>x_district</th>\\n\",\n       \"      <th>x_state</th>\\n\",\n       \"    </tr>\\n\",\n       \"  </thead>\\n\",\n       \"  <tbody>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>596</th>\\n\",\n       \"      <td>0.173913</td>\\n\",\n       \"      <td>0.369565</td>\\n\",\n       \"      <td>0.152174</td>\\n\",\n       \"      <td>0.304348</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>90</th>\\n\",\n       \"      <td>0.022388</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.149254</td>\\n\",\n       \"      <td>0.828358</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>734</th>\\n\",\n       \"      <td>0.774194</td>\\n\",\n       \"      <td>0.096774</td>\\n\",\n       \"      <td>0.096774</td>\\n\",\n       \"      <td>0.032258</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>694</th>\\n\",\n       \"      <td>0.282051</td>\\n\",\n       \"      <td>0.256410</td>\\n\",\n       \"      <td>0.128205</td>\\n\",\n       \"      <td>0.333333</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>517</th>\\n\",\n       \"      <td>0.016949</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.983051</td>\\n\",\n       \"    </tr>\\n\",\n       \"  </tbody>\\n\",\n       \"</table>\\n\",\n       \"</div>\"\n      ],\n      \"text/plain\": [\n       \"        x_act  x_congress  x_district   x_state\\n\",\n       \"596  0.173913    0.369565    0.152174  0.304348\\n\",\n       \"90   0.022388    0.000000    0.149254  0.828358\\n\",\n       \"734  0.774194    0.096774    0.096774  0.032258\\n\",\n       \"694  0.282051    0.256410    0.128205  0.333333\\n\",\n       \"517  0.016949    0.000000    0.000000  0.983051\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"Xtrain = train[features]\\n\",\n    \"Ytrain = train['log_cite_count']\\n\",\n    \"Xtrain.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"596    8.449771\\n\",\n       \"90     8.477620\\n\",\n       \"734    6.648985\\n\",\n       \"694    5.236442\\n\",\n       \"517    3.583519\\n\",\n       \"Name: log_cite_count, dtype: float64\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"Ytrain.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"array([-1.05443811, -0.27079188,  0.87434979,  0.45088019])\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# our first machine learning model\\n\",\n    \"from sklearn.linear_model import LinearRegression\\n\",\n    \"lin_reg = LinearRegression()\\n\",\n    \"\\n\",\n    \"lin_reg.fit(Xtrain, Ytrain)\\n\",\n    \"lin_reg.coef_ \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2.1599649495666817\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# in-sample performance\\n\",\n    \"from sklearn.metrics import mean_squared_error\\n\",\n    \"Ytrain_pred = lin_reg.predict(Xtrain)        \\n\",\n    \"train_mse = mean_squared_error(Ytrain,Ytrain_pred)\\n\",\n    \"train_mse\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2.1030016631048745\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# out-of-sample performance\\n\",\n    \"Xtest = test[features]\\n\",\n    \"Ytest = test['log_cite_count']\\n\",\n    \"Ytest_pred = lin_reg.predict(Xtest)        \\n\",\n    \"test_mse = mean_squared_error(Ytest,Ytest_pred)\\n\",\n    \"test_mse\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/javascript\": [\n       \"/* Put everything inside the global mpl namespace */\\n\",\n       \"/* global mpl */\\n\",\n       \"window.mpl = {};\\n\",\n       \"\\n\",\n       \"mpl.get_websocket_type = function () {\\n\",\n       \"    if (typeof WebSocket !== 'undefined') {\\n\",\n       \"        return WebSocket;\\n\",\n       \"    } else if (typeof MozWebSocket !== 'undefined') {\\n\",\n       \"        return MozWebSocket;\\n\",\n       \"    } else {\\n\",\n       \"        alert(\\n\",\n       \"            'Your browser does not have WebSocket support. ' +\\n\",\n       \"                'Please try Chrome, Safari or Firefox ≥ 6. ' +\\n\",\n       \"                'Firefox 4 and 5 are also supported but you ' +\\n\",\n       \"                'have to enable WebSockets in about:config.'\\n\",\n       \"        );\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\\n\",\n       \"    this.id = figure_id;\\n\",\n       \"\\n\",\n       \"    this.ws = websocket;\\n\",\n       \"\\n\",\n       \"    this.supports_binary = this.ws.binaryType !== undefined;\\n\",\n       \"\\n\",\n       \"    if (!this.supports_binary) {\\n\",\n       \"        var warnings = document.getElementById('mpl-warnings');\\n\",\n       \"        if (warnings) {\\n\",\n       \"            warnings.style.display = 'block';\\n\",\n       \"            warnings.textContent =\\n\",\n       \"                'This browser does not support binary websocket messages. ' +\\n\",\n       \"                'Performance may be slow.';\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    this.imageObj = new Image();\\n\",\n       \"\\n\",\n       \"    this.context = undefined;\\n\",\n       \"    this.message = undefined;\\n\",\n       \"    this.canvas = undefined;\\n\",\n       \"    this.rubberband_canvas = undefined;\\n\",\n       \"    this.rubberband_context = undefined;\\n\",\n       \"    this.format_dropdown = undefined;\\n\",\n       \"\\n\",\n       \"    this.image_mode = 'full';\\n\",\n       \"\\n\",\n       \"    this.root = document.createElement('div');\\n\",\n       \"    this.root.setAttribute('style', 'display: inline-block');\\n\",\n       \"    this._root_extra_style(this.root);\\n\",\n       \"\\n\",\n       \"    parent_element.appendChild(this.root);\\n\",\n       \"\\n\",\n       \"    this._init_header(this);\\n\",\n       \"    this._init_canvas(this);\\n\",\n       \"    this._init_toolbar(this);\\n\",\n       \"\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    this.waiting = false;\\n\",\n       \"\\n\",\n       \"    this.ws.onopen = function () {\\n\",\n       \"        fig.send_message('supports_binary', { value: fig.supports_binary });\\n\",\n       \"        fig.send_message('send_image_mode', {});\\n\",\n       \"        if (fig.ratio !== 1) {\\n\",\n       \"            fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\\n\",\n       \"        }\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onload = function () {\\n\",\n       \"        if (fig.image_mode === 'full') {\\n\",\n       \"            // Full images could contain transparency (where diff images\\n\",\n       \"            // almost always do), so we need to clear the canvas so that\\n\",\n       \"            // there is no ghosting.\\n\",\n       \"            fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\\n\",\n       \"        }\\n\",\n       \"        fig.context.drawImage(fig.imageObj, 0, 0);\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onunload = function () {\\n\",\n       \"        fig.ws.close();\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.ws.onmessage = this._make_on_message_function(this);\\n\",\n       \"\\n\",\n       \"    this.ondownload = ondownload;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_header = function () {\\n\",\n       \"    var titlebar = document.createElement('div');\\n\",\n       \"    titlebar.classList =\\n\",\n       \"        'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\\n\",\n       \"    var titletext = document.createElement('div');\\n\",\n       \"    titletext.classList = 'ui-dialog-title';\\n\",\n       \"    titletext.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'width: 100%; text-align: center; padding: 3px;'\\n\",\n       \"    );\\n\",\n       \"    titlebar.appendChild(titletext);\\n\",\n       \"    this.root.appendChild(titlebar);\\n\",\n       \"    this.header = titletext;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_canvas = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var canvas_div = (this.canvas_div = document.createElement('div'));\\n\",\n       \"    canvas_div.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'border: 1px solid #ddd;' +\\n\",\n       \"            'box-sizing: content-box;' +\\n\",\n       \"            'clear: both;' +\\n\",\n       \"            'min-height: 1px;' +\\n\",\n       \"            'min-width: 1px;' +\\n\",\n       \"            'outline: 0;' +\\n\",\n       \"            'overflow: hidden;' +\\n\",\n       \"            'position: relative;' +\\n\",\n       \"            'resize: both;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    function on_keyboard_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.key_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keydown',\\n\",\n       \"        on_keyboard_event_closure('key_press')\\n\",\n       \"    );\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keyup',\\n\",\n       \"        on_keyboard_event_closure('key_release')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    this._canvas_extra_style(canvas_div);\\n\",\n       \"    this.root.appendChild(canvas_div);\\n\",\n       \"\\n\",\n       \"    var canvas = (this.canvas = document.createElement('canvas'));\\n\",\n       \"    canvas.classList.add('mpl-canvas');\\n\",\n       \"    canvas.setAttribute('style', 'box-sizing: content-box;');\\n\",\n       \"\\n\",\n       \"    this.context = canvas.getContext('2d');\\n\",\n       \"\\n\",\n       \"    var backingStore =\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        this.context.webkitBackingStorePixelRatio ||\\n\",\n       \"        this.context.mozBackingStorePixelRatio ||\\n\",\n       \"        this.context.msBackingStorePixelRatio ||\\n\",\n       \"        this.context.oBackingStorePixelRatio ||\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        1;\\n\",\n       \"\\n\",\n       \"    this.ratio = (window.devicePixelRatio || 1) / backingStore;\\n\",\n       \"    if (this.ratio !== 1) {\\n\",\n       \"        fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var rubberband_canvas = (this.rubberband_canvas = document.createElement(\\n\",\n       \"        'canvas'\\n\",\n       \"    ));\\n\",\n       \"    rubberband_canvas.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    var resizeObserver = new ResizeObserver(function (entries) {\\n\",\n       \"        var nentries = entries.length;\\n\",\n       \"        for (var i = 0; i < nentries; i++) {\\n\",\n       \"            var entry = entries[i];\\n\",\n       \"            var width, height;\\n\",\n       \"            if (entry.contentBoxSize) {\\n\",\n       \"                if (entry.contentBoxSize instanceof Array) {\\n\",\n       \"                    // Chrome 84 implements new version of spec.\\n\",\n       \"                    width = entry.contentBoxSize[0].inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize[0].blockSize;\\n\",\n       \"                } else {\\n\",\n       \"                    // Firefox implements old version of spec.\\n\",\n       \"                    width = entry.contentBoxSize.inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize.blockSize;\\n\",\n       \"                }\\n\",\n       \"            } else {\\n\",\n       \"                // Chrome <84 implements even older version of spec.\\n\",\n       \"                width = entry.contentRect.width;\\n\",\n       \"                height = entry.contentRect.height;\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            // Keep the size of the canvas and rubber band canvas in sync with\\n\",\n       \"            // the canvas container.\\n\",\n       \"            if (entry.devicePixelContentBoxSize) {\\n\",\n       \"                // Chrome 84 implements new version of spec.\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'width',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].inlineSize\\n\",\n       \"                );\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'height',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].blockSize\\n\",\n       \"                );\\n\",\n       \"            } else {\\n\",\n       \"                canvas.setAttribute('width', width * fig.ratio);\\n\",\n       \"                canvas.setAttribute('height', height * fig.ratio);\\n\",\n       \"            }\\n\",\n       \"            canvas.setAttribute(\\n\",\n       \"                'style',\\n\",\n       \"                'width: ' + width + 'px; height: ' + height + 'px;'\\n\",\n       \"            );\\n\",\n       \"\\n\",\n       \"            rubberband_canvas.setAttribute('width', width);\\n\",\n       \"            rubberband_canvas.setAttribute('height', height);\\n\",\n       \"\\n\",\n       \"            // And update the size in Python. We ignore the initial 0/0 size\\n\",\n       \"            // that occurs as the element is placed into the DOM, which should\\n\",\n       \"            // otherwise not happen due to the minimum size styling.\\n\",\n       \"            if (width != 0 && height != 0) {\\n\",\n       \"                fig.request_resize(width, height);\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    });\\n\",\n       \"    resizeObserver.observe(canvas_div);\\n\",\n       \"\\n\",\n       \"    function on_mouse_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.mouse_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousedown',\\n\",\n       \"        on_mouse_event_closure('button_press')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseup',\\n\",\n       \"        on_mouse_event_closure('button_release')\\n\",\n       \"    );\\n\",\n       \"    // Throttle sequential mouse events to 1 every 20ms.\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousemove',\\n\",\n       \"        on_mouse_event_closure('motion_notify')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseenter',\\n\",\n       \"        on_mouse_event_closure('figure_enter')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseleave',\\n\",\n       \"        on_mouse_event_closure('figure_leave')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener('wheel', function (event) {\\n\",\n       \"        if (event.deltaY < 0) {\\n\",\n       \"            event.step = 1;\\n\",\n       \"        } else {\\n\",\n       \"            event.step = -1;\\n\",\n       \"        }\\n\",\n       \"        on_mouse_event_closure('scroll')(event);\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    canvas_div.appendChild(canvas);\\n\",\n       \"    canvas_div.appendChild(rubberband_canvas);\\n\",\n       \"\\n\",\n       \"    this.rubberband_context = rubberband_canvas.getContext('2d');\\n\",\n       \"    this.rubberband_context.strokeStyle = '#000000';\\n\",\n       \"\\n\",\n       \"    this._resize_canvas = function (width, height, forward) {\\n\",\n       \"        if (forward) {\\n\",\n       \"            canvas_div.style.width = width + 'px';\\n\",\n       \"            canvas_div.style.height = height + 'px';\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    // Disable right mouse context menu.\\n\",\n       \"    this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\\n\",\n       \"        event.preventDefault();\\n\",\n       \"        return false;\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    function set_focus() {\\n\",\n       \"        canvas.focus();\\n\",\n       \"        canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    window.setTimeout(set_focus, 100);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'mpl-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var button = (fig.buttons[name] = document.createElement('button'));\\n\",\n       \"        button.classList = 'mpl-widget';\\n\",\n       \"        button.setAttribute('role', 'button');\\n\",\n       \"        button.setAttribute('aria-disabled', 'false');\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"\\n\",\n       \"        var icon_img = document.createElement('img');\\n\",\n       \"        icon_img.src = '_images/' + image + '.png';\\n\",\n       \"        icon_img.srcset = '_images/' + image + '_large.png 2x';\\n\",\n       \"        icon_img.alt = tooltip;\\n\",\n       \"        button.appendChild(icon_img);\\n\",\n       \"\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fmt_picker = document.createElement('select');\\n\",\n       \"    fmt_picker.classList = 'mpl-widget';\\n\",\n       \"    toolbar.appendChild(fmt_picker);\\n\",\n       \"    this.format_dropdown = fmt_picker;\\n\",\n       \"\\n\",\n       \"    for (var ind in mpl.extensions) {\\n\",\n       \"        var fmt = mpl.extensions[ind];\\n\",\n       \"        var option = document.createElement('option');\\n\",\n       \"        option.selected = fmt === mpl.default_extension;\\n\",\n       \"        option.innerHTML = fmt;\\n\",\n       \"        fmt_picker.appendChild(option);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\\n\",\n       \"    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\\n\",\n       \"    // which will in turn request a refresh of the image.\\n\",\n       \"    this.send_message('resize', { width: x_pixels, height: y_pixels });\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_message = function (type, properties) {\\n\",\n       \"    properties['type'] = type;\\n\",\n       \"    properties['figure_id'] = this.id;\\n\",\n       \"    this.ws.send(JSON.stringify(properties));\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_draw_message = function () {\\n\",\n       \"    if (!this.waiting) {\\n\",\n       \"        this.waiting = true;\\n\",\n       \"        this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    var format_dropdown = fig.format_dropdown;\\n\",\n       \"    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\\n\",\n       \"    fig.ondownload(fig, format);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_resize = function (fig, msg) {\\n\",\n       \"    var size = msg['size'];\\n\",\n       \"    if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\\n\",\n       \"        fig._resize_canvas(size[0], size[1], msg['forward']);\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\\n\",\n       \"    var x0 = msg['x0'] / fig.ratio;\\n\",\n       \"    var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\\n\",\n       \"    var x1 = msg['x1'] / fig.ratio;\\n\",\n       \"    var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\\n\",\n       \"    x0 = Math.floor(x0) + 0.5;\\n\",\n       \"    y0 = Math.floor(y0) + 0.5;\\n\",\n       \"    x1 = Math.floor(x1) + 0.5;\\n\",\n       \"    y1 = Math.floor(y1) + 0.5;\\n\",\n       \"    var min_x = Math.min(x0, x1);\\n\",\n       \"    var min_y = Math.min(y0, y1);\\n\",\n       \"    var width = Math.abs(x1 - x0);\\n\",\n       \"    var height = Math.abs(y1 - y0);\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.clearRect(\\n\",\n       \"        0,\\n\",\n       \"        0,\\n\",\n       \"        fig.canvas.width / fig.ratio,\\n\",\n       \"        fig.canvas.height / fig.ratio\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\\n\",\n       \"    // Updates the figure title.\\n\",\n       \"    fig.header.textContent = msg['label'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_cursor = function (fig, msg) {\\n\",\n       \"    var cursor = msg['cursor'];\\n\",\n       \"    switch (cursor) {\\n\",\n       \"        case 0:\\n\",\n       \"            cursor = 'pointer';\\n\",\n       \"            break;\\n\",\n       \"        case 1:\\n\",\n       \"            cursor = 'default';\\n\",\n       \"            break;\\n\",\n       \"        case 2:\\n\",\n       \"            cursor = 'crosshair';\\n\",\n       \"            break;\\n\",\n       \"        case 3:\\n\",\n       \"            cursor = 'move';\\n\",\n       \"            break;\\n\",\n       \"    }\\n\",\n       \"    fig.rubberband_canvas.style.cursor = cursor;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_message = function (fig, msg) {\\n\",\n       \"    fig.message.textContent = msg['message'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_draw = function (fig, _msg) {\\n\",\n       \"    // Request the server to send over a new figure.\\n\",\n       \"    fig.send_draw_message();\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\\n\",\n       \"    fig.image_mode = msg['mode'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\\n\",\n       \"    for (var key in msg) {\\n\",\n       \"        if (!(key in fig.buttons)) {\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"        fig.buttons[key].disabled = !msg[key];\\n\",\n       \"        fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\\n\",\n       \"    if (msg['mode'] === 'PAN') {\\n\",\n       \"        fig.buttons['Pan'].classList.add('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    } else if (msg['mode'] === 'ZOOM') {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.add('active');\\n\",\n       \"    } else {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Called whenever the canvas gets updated.\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// A function to construct a web socket function for onmessage handling.\\n\",\n       \"// Called in the figure constructor.\\n\",\n       \"mpl.figure.prototype._make_on_message_function = function (fig) {\\n\",\n       \"    return function socket_on_message(evt) {\\n\",\n       \"        if (evt.data instanceof Blob) {\\n\",\n       \"            /* FIXME: We get \\\"Resource interpreted as Image but\\n\",\n       \"             * transferred with MIME type text/plain:\\\" errors on\\n\",\n       \"             * Chrome.  But how to set the MIME type?  It doesn't seem\\n\",\n       \"             * to be part of the websocket stream */\\n\",\n       \"            evt.data.type = 'image/png';\\n\",\n       \"\\n\",\n       \"            /* Free the memory for the previous frames */\\n\",\n       \"            if (fig.imageObj.src) {\\n\",\n       \"                (window.URL || window.webkitURL).revokeObjectURL(\\n\",\n       \"                    fig.imageObj.src\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\\n\",\n       \"                evt.data\\n\",\n       \"            );\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        } else if (\\n\",\n       \"            typeof evt.data === 'string' &&\\n\",\n       \"            evt.data.slice(0, 21) === 'data:image/png;base64'\\n\",\n       \"        ) {\\n\",\n       \"            fig.imageObj.src = evt.data;\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var msg = JSON.parse(evt.data);\\n\",\n       \"        var msg_type = msg['type'];\\n\",\n       \"\\n\",\n       \"        // Call the  \\\"handle_{type}\\\" callback, which takes\\n\",\n       \"        // the figure and JSON message as its only arguments.\\n\",\n       \"        try {\\n\",\n       \"            var callback = fig['handle_' + msg_type];\\n\",\n       \"        } catch (e) {\\n\",\n       \"            console.log(\\n\",\n       \"                \\\"No handler for the '\\\" + msg_type + \\\"' message type: \\\",\\n\",\n       \"                msg\\n\",\n       \"            );\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        if (callback) {\\n\",\n       \"            try {\\n\",\n       \"                // console.log(\\\"Handling '\\\" + msg_type + \\\"' message: \\\", msg);\\n\",\n       \"                callback(fig, msg);\\n\",\n       \"            } catch (e) {\\n\",\n       \"                console.log(\\n\",\n       \"                    \\\"Exception inside the 'handler_\\\" + msg_type + \\\"' callback:\\\",\\n\",\n       \"                    e,\\n\",\n       \"                    e.stack,\\n\",\n       \"                    msg\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\\n\",\n       \"mpl.findpos = function (e) {\\n\",\n       \"    //this section is from http://www.quirksmode.org/js/events_properties.html\\n\",\n       \"    var targ;\\n\",\n       \"    if (!e) {\\n\",\n       \"        e = window.event;\\n\",\n       \"    }\\n\",\n       \"    if (e.target) {\\n\",\n       \"        targ = e.target;\\n\",\n       \"    } else if (e.srcElement) {\\n\",\n       \"        targ = e.srcElement;\\n\",\n       \"    }\\n\",\n       \"    if (targ.nodeType === 3) {\\n\",\n       \"        // defeat Safari bug\\n\",\n       \"        targ = targ.parentNode;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // pageX,Y are the mouse positions relative to the document\\n\",\n       \"    var boundingRect = targ.getBoundingClientRect();\\n\",\n       \"    var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\\n\",\n       \"    var y = e.pageY - (boundingRect.top + document.body.scrollTop);\\n\",\n       \"\\n\",\n       \"    return { x: x, y: y };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"/*\\n\",\n       \" * return a copy of an object with only non-object keys\\n\",\n       \" * we need this to avoid circular references\\n\",\n       \" * http://stackoverflow.com/a/24161582/3208463\\n\",\n       \" */\\n\",\n       \"function simpleKeys(original) {\\n\",\n       \"    return Object.keys(original).reduce(function (obj, key) {\\n\",\n       \"        if (typeof original[key] !== 'object') {\\n\",\n       \"            obj[key] = original[key];\\n\",\n       \"        }\\n\",\n       \"        return obj;\\n\",\n       \"    }, {});\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.mouse_event = function (event, name) {\\n\",\n       \"    var canvas_pos = mpl.findpos(event);\\n\",\n       \"\\n\",\n       \"    if (name === 'button_press') {\\n\",\n       \"        this.canvas.focus();\\n\",\n       \"        this.canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var x = canvas_pos.x * this.ratio;\\n\",\n       \"    var y = canvas_pos.y * this.ratio;\\n\",\n       \"\\n\",\n       \"    this.send_message(name, {\\n\",\n       \"        x: x,\\n\",\n       \"        y: y,\\n\",\n       \"        button: event.button,\\n\",\n       \"        step: event.step,\\n\",\n       \"        guiEvent: simpleKeys(event),\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    /* This prevents the web browser from automatically changing to\\n\",\n       \"     * the text insertion cursor when the button is pressed.  We want\\n\",\n       \"     * to control all of the cursor setting manually through the\\n\",\n       \"     * 'cursor' event from matplotlib */\\n\",\n       \"    event.preventDefault();\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (_event, _name) {\\n\",\n       \"    // Handle any extra behaviour associated with a key event\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.key_event = function (event, name) {\\n\",\n       \"    // Prevent repeat events\\n\",\n       \"    if (name === 'key_press') {\\n\",\n       \"        if (event.which === this._key) {\\n\",\n       \"            return;\\n\",\n       \"        } else {\\n\",\n       \"            this._key = event.which;\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"    if (name === 'key_release') {\\n\",\n       \"        this._key = null;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var value = '';\\n\",\n       \"    if (event.ctrlKey && event.which !== 17) {\\n\",\n       \"        value += 'ctrl+';\\n\",\n       \"    }\\n\",\n       \"    if (event.altKey && event.which !== 18) {\\n\",\n       \"        value += 'alt+';\\n\",\n       \"    }\\n\",\n       \"    if (event.shiftKey && event.which !== 16) {\\n\",\n       \"        value += 'shift+';\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    value += 'k';\\n\",\n       \"    value += event.which.toString();\\n\",\n       \"\\n\",\n       \"    this._key_event_extra(event, name);\\n\",\n       \"\\n\",\n       \"    this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onclick = function (name) {\\n\",\n       \"    if (name === 'download') {\\n\",\n       \"        this.handle_save(this, null);\\n\",\n       \"    } else {\\n\",\n       \"        this.send_message('toolbar_button', { name: name });\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\\n\",\n       \"    this.message.textContent = tooltip;\\n\",\n       \"};\\n\",\n       \"mpl.toolbar_items = [[\\\"Home\\\", \\\"Reset original view\\\", \\\"fa fa-home icon-home\\\", \\\"home\\\"], [\\\"Back\\\", \\\"Back to previous view\\\", \\\"fa fa-arrow-left icon-arrow-left\\\", \\\"back\\\"], [\\\"Forward\\\", \\\"Forward to next view\\\", \\\"fa fa-arrow-right icon-arrow-right\\\", \\\"forward\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Pan\\\", \\\"Left button pans, Right button zooms\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-arrows icon-move\\\", \\\"pan\\\"], [\\\"Zoom\\\", \\\"Zoom to rectangle\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-square-o icon-check-empty\\\", \\\"zoom\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Download\\\", \\\"Download plot\\\", \\\"fa fa-floppy-o icon-save\\\", \\\"download\\\"]];\\n\",\n       \"\\n\",\n       \"mpl.extensions = [\\\"eps\\\", \\\"jpeg\\\", \\\"pdf\\\", \\\"png\\\", \\\"ps\\\", \\\"raw\\\", \\\"svg\\\", \\\"tif\\\"];\\n\",\n       \"\\n\",\n       \"mpl.default_extension = \\\"png\\\";/* global mpl */\\n\",\n       \"\\n\",\n       \"var comm_websocket_adapter = function (comm) {\\n\",\n       \"    // Create a \\\"websocket\\\"-like object which calls the given IPython comm\\n\",\n       \"    // object with the appropriate methods. Currently this is a non binary\\n\",\n       \"    // socket, so there is still some room for performance tuning.\\n\",\n       \"    var ws = {};\\n\",\n       \"\\n\",\n       \"    ws.close = function () {\\n\",\n       \"        comm.close();\\n\",\n       \"    };\\n\",\n       \"    ws.send = function (m) {\\n\",\n       \"        //console.log('sending', m);\\n\",\n       \"        comm.send(m);\\n\",\n       \"    };\\n\",\n       \"    // Register the callback with on_msg.\\n\",\n       \"    comm.on_msg(function (msg) {\\n\",\n       \"        //console.log('receiving', msg['content']['data'], msg);\\n\",\n       \"        // Pass the mpl event to the overridden (by mpl) onmessage function.\\n\",\n       \"        ws.onmessage(msg['content']['data']);\\n\",\n       \"    });\\n\",\n       \"    return ws;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.mpl_figure_comm = function (comm, msg) {\\n\",\n       \"    // This is the function which gets called when the mpl process\\n\",\n       \"    // starts-up an IPython Comm through the \\\"matplotlib\\\" channel.\\n\",\n       \"\\n\",\n       \"    var id = msg.content.data.id;\\n\",\n       \"    // Get hold of the div created by the display call when the Comm\\n\",\n       \"    // socket was opened in Python.\\n\",\n       \"    var element = document.getElementById(id);\\n\",\n       \"    var ws_proxy = comm_websocket_adapter(comm);\\n\",\n       \"\\n\",\n       \"    function ondownload(figure, _format) {\\n\",\n       \"        window.open(figure.canvas.toDataURL());\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fig = new mpl.figure(id, ws_proxy, ondownload, element);\\n\",\n       \"\\n\",\n       \"    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\\n\",\n       \"    // web socket which is closed, not our websocket->open comm proxy.\\n\",\n       \"    ws_proxy.onopen();\\n\",\n       \"\\n\",\n       \"    fig.parent_element = element;\\n\",\n       \"    fig.cell_info = mpl.find_output_cell(\\\"<div id='\\\" + id + \\\"'></div>\\\");\\n\",\n       \"    if (!fig.cell_info) {\\n\",\n       \"        console.error('Failed to find cell for figure', id, fig);\\n\",\n       \"        return;\\n\",\n       \"    }\\n\",\n       \"    fig.cell_info[0].output_area.element.one(\\n\",\n       \"        'cleared',\\n\",\n       \"        { fig: fig },\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_close = function (fig, msg) {\\n\",\n       \"    var width = fig.canvas.width / fig.ratio;\\n\",\n       \"    fig.cell_info[0].output_area.element.off(\\n\",\n       \"        'cleared',\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    // Update the output cell to use the data from the current canvas.\\n\",\n       \"    fig.push_to_output();\\n\",\n       \"    var dataURL = fig.canvas.toDataURL();\\n\",\n       \"    // Re-enable the keyboard manager in IPython - without this line, in FF,\\n\",\n       \"    // the notebook keyboard shortcuts fail.\\n\",\n       \"    IPython.keyboard_manager.enable();\\n\",\n       \"    fig.parent_element.innerHTML =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"    fig.close_ws(fig, msg);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.close_ws = function (fig, msg) {\\n\",\n       \"    fig.send_message('closing', msg);\\n\",\n       \"    // fig.ws.close()\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\\n\",\n       \"    // Turn the data on the canvas into data in the output cell.\\n\",\n       \"    var width = this.canvas.width / this.ratio;\\n\",\n       \"    var dataURL = this.canvas.toDataURL();\\n\",\n       \"    this.cell_info[1]['text/html'] =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Tell IPython that the notebook contents must change.\\n\",\n       \"    IPython.notebook.set_dirty(true);\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"    var fig = this;\\n\",\n       \"    // Wait a second, then push the new image to the DOM so\\n\",\n       \"    // that it is saved nicely (might be nice to debounce this).\\n\",\n       \"    setTimeout(function () {\\n\",\n       \"        fig.push_to_output();\\n\",\n       \"    }, 1000);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'btn-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'btn-group';\\n\",\n       \"    var button;\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'btn-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        button = fig.buttons[name] = document.createElement('button');\\n\",\n       \"        button.classList = 'btn btn-default';\\n\",\n       \"        button.href = '#';\\n\",\n       \"        button.title = name;\\n\",\n       \"        button.innerHTML = '<i class=\\\"fa ' + image + ' fa-lg\\\"></i>';\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Add the status bar.\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message pull-right';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"\\n\",\n       \"    // Add the close button to the window.\\n\",\n       \"    var buttongrp = document.createElement('div');\\n\",\n       \"    buttongrp.classList = 'btn-group inline pull-right';\\n\",\n       \"    button = document.createElement('button');\\n\",\n       \"    button.classList = 'btn btn-mini btn-primary';\\n\",\n       \"    button.href = '#';\\n\",\n       \"    button.title = 'Stop Interaction';\\n\",\n       \"    button.innerHTML = '<i class=\\\"fa fa-power-off icon-remove icon-large\\\"></i>';\\n\",\n       \"    button.addEventListener('click', function (_evt) {\\n\",\n       \"        fig.handle_close(fig, {});\\n\",\n       \"    });\\n\",\n       \"    button.addEventListener(\\n\",\n       \"        'mouseover',\\n\",\n       \"        on_mouseover_closure('Stop Interaction')\\n\",\n       \"    );\\n\",\n       \"    buttongrp.appendChild(button);\\n\",\n       \"    var titlebar = this.root.querySelector('.ui-dialog-titlebar');\\n\",\n       \"    titlebar.insertBefore(buttongrp, titlebar.firstChild);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._remove_fig_handler = function (event) {\\n\",\n       \"    var fig = event.data.fig;\\n\",\n       \"    fig.close_ws(fig, {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (el) {\\n\",\n       \"    el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (el) {\\n\",\n       \"    // this is important to make the div 'focusable\\n\",\n       \"    el.setAttribute('tabindex', 0);\\n\",\n       \"    // reach out to IPython and tell the keyboard manager to turn it's self\\n\",\n       \"    // off when our div gets focus\\n\",\n       \"\\n\",\n       \"    // location in version 3\\n\",\n       \"    if (IPython.notebook.keyboard_manager) {\\n\",\n       \"        IPython.notebook.keyboard_manager.register_events(el);\\n\",\n       \"    } else {\\n\",\n       \"        // location in version 2\\n\",\n       \"        IPython.keyboard_manager.register_events(el);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (event, _name) {\\n\",\n       \"    var manager = IPython.notebook.keyboard_manager;\\n\",\n       \"    if (!manager) {\\n\",\n       \"        manager = IPython.keyboard_manager;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Check for shift+enter\\n\",\n       \"    if (event.shiftKey && event.which === 13) {\\n\",\n       \"        this.canvas_div.blur();\\n\",\n       \"        // select the cell after this one\\n\",\n       \"        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\\n\",\n       \"        IPython.notebook.select(index + 1);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    fig.ondownload(fig, null);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.find_output_cell = function (html_output) {\\n\",\n       \"    // Return the cell and output element which can be found *uniquely* in the notebook.\\n\",\n       \"    // Note - this is a bit hacky, but it is done because the \\\"notebook_saving.Notebook\\\"\\n\",\n       \"    // IPython event is triggered only after the cells have been serialised, which for\\n\",\n       \"    // our purposes (turning an active figure into a static one), is too late.\\n\",\n       \"    var cells = IPython.notebook.get_cells();\\n\",\n       \"    var ncells = cells.length;\\n\",\n       \"    for (var i = 0; i < ncells; i++) {\\n\",\n       \"        var cell = cells[i];\\n\",\n       \"        if (cell.cell_type === 'code') {\\n\",\n       \"            for (var j = 0; j < cell.output_area.outputs.length; j++) {\\n\",\n       \"                var data = cell.output_area.outputs[j];\\n\",\n       \"                if (data.data) {\\n\",\n       \"                    // IPython >= 3 moved mimebundle to data attribute of output\\n\",\n       \"                    data = data.data;\\n\",\n       \"                }\\n\",\n       \"                if (data['text/html'] === html_output) {\\n\",\n       \"                    return [cell, data, j];\\n\",\n       \"                }\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// Register the function which deals with the matplotlib target/channel.\\n\",\n       \"// The kernel may be null if the page has been refreshed.\\n\",\n       \"if (IPython.notebook.kernel !== null) {\\n\",\n       \"    IPython.notebook.kernel.comm_manager.register_target(\\n\",\n       \"        'matplotlib',\\n\",\n       \"        mpl.mpl_figure_comm\\n\",\n       \"    );\\n\",\n       \"}\\n\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.Javascript object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<img src=\\\"data:image/png;base64,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\\\" width=\\\"600\\\">\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.HTML object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<seaborn.axisgrid.JointGrid at 0x7f6301666bb0>\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"import seaborn as sns\\n\",\n    \"\\n\",\n    \"p = sns.jointplot(x=Ytest, y=Ytest_pred, kind='reg')\\n\",\n    \"p.set_axis_labels('Log Citations', 'Predicted Log Citations', fontsize=10)\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Pipelines and Cross-Validation\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# missing values\\n\",\n    \"df['authorship_id'].fillna(0,inplace=True)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Scaling\\n\",\n    \"from sklearn.preprocessing import StandardScaler\\n\",\n    \"scaler = StandardScaler()\\n\",\n    \"X = scaler.fit_transform(df2)\\n\",\n    \"df2 = pd.DataFrame(X,columns=df2.columns)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"array([[ 0.4273395 , -0.10042156,  0.26583686, -0.25620003,  0.08875597],\\n\",\n       \"       [-1.69574977,  0.2303693 , -0.38976878, -0.73332927,  0.62993863],\\n\",\n       \"       [ 1.7975002 , -0.97500173, -0.73922735,  1.00407587,  0.33689649],\\n\",\n       \"       ...,\\n\",\n       \"       [ 0.778854  ,  0.31343437,  1.46745168, -0.54274748, -0.70067715],\\n\",\n       \"       [-0.48288351,  0.47521029,  0.43962056,  0.85945227, -1.20157476],\\n\",\n       \"       [ 0.20858247,  0.53243068, -0.86797524, -0.93320774,  0.87744045]])\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"X\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Encoding categorical variables\\n\",\n    \"from sklearn.preprocessing import OneHotEncoder\\n\",\n    \"encoder = OneHotEncoder()\\n\",\n    \"judge = df['authorship_id']\\n\",\n    \"judge_fes = encoder.fit_transform(judge.values.reshape(-1,1))\\n\",\n    \"judge_ids = ['j_'+str(x) for x in range(len(judge.unique()))]\\n\",\n    \"judge_fes = pd.DataFrame(judge_fes.todense(),columns=judge_ids)\\n\",\n    \"df = pd.concat([df,judge_fes],axis=1)\\n\",\n    \"train, test = train_test_split(df, test_size=0.2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Encoding categorical variables\\n\",\n    \"from sklearn.preprocessing import OneHotEncoder\\n\",\n    \"encoder = OneHotEncoder()\\n\",\n    \"judge = df['authorship_id']\\n\",\n    \"judge_fes = encoder.fit_transform(judge.values.reshape(-1,1))\\n\",\n    \"judge_ids = ['j_'+str(x) for x in range(len(judge.unique()))]\\n\",\n    \"judge_fes = pd.DataFrame(judge_fes.todense(),columns=judge_ids)\\n\",\n    \"df = pd.concat([df,judge_fes],axis=1)\\n\",\n    \"train, test = train_test_split(df, test_size=0.2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"0.07158439367084446 0.04427120481337193\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Cross-validation\\n\",\n    \"from sklearn.ensemble import RandomForestRegressor\\n\",\n    \"forest_reg = RandomForestRegressor()\\n\",\n    \"\\n\",\n    \"from sklearn.model_selection import cross_val_score\\n\",\n    \"scores = cross_val_score(forest_reg,\\n\",\n    \"                         df[features],\\n\",\n    \"                         df['x_republican'],\\n\",\n    \"                         cv=3,\\n\",\n    \"                         n_jobs=-1)\\n\",\n    \"\\n\",\n    \"# the default score for random forest reg is negative MSE.\\n\",\n    \"print(np.abs(scores.mean()),scores.std())\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"{'bootstrap': True, 'max_features': 4, 'n_estimators': 30}\\n\",\n      \"0.10601703666326963\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Grid Search\\n\",\n    \"from sklearn.model_selection import GridSearchCV\\n\",\n    \"param_grid = {'n_estimators': [3, 10, 30],\\n\",\n    \"              'max_features': [2, 4],\\n\",\n    \"              'bootstrap': [True, False]}\\n\",\n    \"\\n\",\n    \"grid_search = GridSearchCV(forest_reg, \\n\",\n    \"                           param_grid, \\n\",\n    \"                           cv=3)              \\n\",\n    \"grid_search.fit(df[features],df['x_republican'])\\n\",\n    \"\\n\",\n    \"print(grid_search.best_params_)\\n\",\n    \"print(np.abs(grid_search.best_score_))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"{'n_estimators': 30, 'max_features': 2, 'bootstrap': True}\\n\",\n      \"0.08213114206388883\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"from sklearn.model_selection import RandomizedSearchCV\\n\",\n    \"rand_search = RandomizedSearchCV(forest_reg, param_grid, cv=3)              \\n\",\n    \"rand_search.fit(df[features],df['x_republican'])\\n\",\n    \"\\n\",\n    \"print(rand_search.best_params_)\\n\",\n    \"print(np.abs(rand_search.best_score_))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Saving and loading\\n\",\n    \"from sklearn.externals import joblib\\n\",\n    \"joblib.dump(forest_reg,'forest_reg.pkl') # will overwrite local files\\n\",\n    \"forest_reg = joblib.load('forest_reg.pkl')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from sklearn.pipeline import Pipeline\\n\",\n    \"from sklearn.feature_extraction.text import TfidfTransformer\\n\",\n    \"\\n\",\n    \"pipeline = Pipeline([\\n\",\n    \"    ('vect', CountVectorizer()),\\n\",\n    \"    ('tfidf', TfidfTransformer()),\\n\",\n    \"    ('forest_reg', RandomForestRegressor()),\\n\",\n    \"])\\n\",\n    \"\\n\",\n    \"parameters = {\\n\",\n    \"    'vect__max_df': (0.5, 0.75, 1.0),\\n\",\n    \"    'vect__max_features': (2, 4, 8, 16),\\n\",\n    \"    'forest_reg__n_estimators': [3, 10, 30],\\n\",\n    \"    'forest_reg__max_features': [2, 4],\\n\",\n    \"    'forest_reg__bootstrap': [True, False]}\"\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      \"Performing grid search...\\n\",\n      \"pipeline: ['vect', 'tfidf', 'forest_reg']\\n\",\n      \"parameters:\\n\",\n      \"{'forest_reg__bootstrap': [True, False],\\n\",\n      \" 'forest_reg__max_features': [2, 4],\\n\",\n      \" 'forest_reg__n_estimators': [3, 10, 30],\\n\",\n      \" 'vect__max_df': (0.5, 0.75, 1.0),\\n\",\n      \" 'vect__max_features': (2, 4, 8, 16)}\\n\",\n      \"Fitting 5 folds for each of 144 candidates, totalling 720 fits\\n\",\n      \"done in 554.450s\\n\",\n      \"\\n\",\n      \"Best score: 0.182\\n\",\n      \"Best parameters set:\\n\",\n      \"\\tforest_reg__bootstrap: False\\n\",\n      \"\\tforest_reg__max_features: 2\\n\",\n      \"\\tforest_reg__n_estimators: 30\\n\",\n      \"\\tvect__max_df: 0.75\\n\",\n      \"\\tvect__max_features: 16\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"from pprint import pprint\\n\",\n    \"from time import time\\n\",\n    \"\\n\",\n    \"if __name__ == \\\"__main__\\\":\\n\",\n    \"    # multiprocessing requires the fork to happen in a __main__ protected\\n\",\n    \"    # block\\n\",\n    \"\\n\",\n    \"    # find the best parameters for both the feature extraction and the\\n\",\n    \"    # classifier\\n\",\n    \"    grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1, verbose=1)\\n\",\n    \"\\n\",\n    \"    print(\\\"Performing grid search...\\\")\\n\",\n    \"    print(\\\"pipeline:\\\", [name for name, _ in pipeline.steps])\\n\",\n    \"    print(\\\"parameters:\\\")\\n\",\n    \"    pprint(parameters)\\n\",\n    \"    t0 = time()\\n\",\n    \"    grid_search.fit(df.opinion_text, df.log_cite_count)\\n\",\n    \"    print(\\\"done in %0.3fs\\\" % (time() - t0))\\n\",\n    \"    print()\\n\",\n    \"\\n\",\n    \"    print(\\\"Best score: %0.3f\\\" % grid_search.best_score_)\\n\",\n    \"    print(\\\"Best parameters set:\\\")\\n\",\n    \"    best_parameters = grid_search.best_estimator_.get_params()\\n\",\n    \"    for param_name in sorted(parameters.keys()):\\n\",\n    \"        print(\\\"\\\\t%s: %r\\\" % (param_name, best_parameters[param_name]))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Nested Cross-Validation\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Average difference of 0.008041 with std. dev. of 0.021027.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"import numpy as np\\n\",\n    \"from sklearn.model_selection import KFold\\n\",\n    \"n = 30\\n\",\n    \"\\n\",\n    \"forest_reg = RandomForestRegressor()\\n\",\n    \"non_nested_scores = np.zeros(n)\\n\",\n    \"nested_scores = np.zeros(n)\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"param_grid = {'n_estimators': [3, 10, 30],\\n\",\n    \"              'max_features': [2, 4],\\n\",\n    \"              'bootstrap': [True, False]}\\n\",\n    \"\\n\",\n    \"for i in range(n):\\n\",\n    \"\\n\",\n    \"    # Choose cross-validation techniques for the inner and outer loops,\\n\",\n    \"\\n\",\n    \"    inner_cv = KFold(n_splits=4, shuffle=True, random_state=i)\\n\",\n    \"    outer_cv = KFold(n_splits=4, shuffle=True, random_state=i)\\n\",\n    \"\\n\",\n    \"    # Non_nested parameter search and scoring\\n\",\n    \"    grid_search = GridSearchCV(estimator=forest_reg, param_grid=param_grid, cv=inner_cv)\\n\",\n    \"    grid_search.fit(Xtrain, Ytrain)\\n\",\n    \"    non_nested_scores[i] = grid_search.best_score_\\n\",\n    \"\\n\",\n    \"    # Nested CV with parameter optimization\\n\",\n    \"    nested_score = cross_val_score(grid_search, X=Xtrain, y=Ytrain, cv=outer_cv)\\n\",\n    \"    nested_scores[i] = nested_score.mean()\\n\",\n    \"\\n\",\n    \"score_difference = non_nested_scores - nested_scores\\n\",\n    \"print(\\\"Average difference of {:6f} with std. dev. of {:6f}.\\\"\\n\",\n    \"      .format(score_difference.mean(), score_difference.std()))\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Regularization\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.39751011925115076\"\n      ]\n     },\n     \"execution_count\": 29,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"from sklearn.model_selection import cross_val_score\\n\",\n    \"import numpy as np\\n\",\n    \"from sklearn.linear_model import LinearRegression\\n\",\n    \"\\n\",\n    \"m = 100\\n\",\n    \"x = 6 * np.random.rand(m,1) - 3\\n\",\n    \"y = 0.5 * x ** 2 + x + 2 + np.random.randn(m,1)\\n\",\n    \"y = y.ravel()\\n\",\n    \"\\n\",\n    \"from sklearn.preprocessing import PolynomialFeatures\\n\",\n    \"poly_2 = PolynomialFeatures(degree=2) # also adds interactions\\n\",\n    \"X_poly_2 = poly_2.fit_transform(x)\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"poly_300 = PolynomialFeatures(degree=300) \\n\",\n    \"X_poly_300 = poly_300.fit_transform(x)\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"lin_reg = LinearRegression()\\n\",\n    \"cross_val_score(lin_reg, x, y, cv=3, n_jobs=3).mean()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.7813839684415319\"\n      ]\n     },\n     \"execution_count\": 30,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"cross_val_score(lin_reg, X_poly_2, y, cv=3, n_jobs=3).mean()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"-2.4409029579050945e+25\"\n      ]\n     },\n     \"execution_count\": 31,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"cross_val_score(lin_reg, X_poly_300, y, cv=3, n_jobs=3).mean()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.4372437481422473\"\n      ]\n     },\n     \"execution_count\": 32,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Lasso\\n\",\n    \"from sklearn.linear_model import Lasso\\n\",\n    \"lasso_reg = Lasso(alpha=0.1)\\n\",\n    \"cross_val_score(lasso_reg,x,y).mean()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.43471954056204976\"\n      ]\n     },\n     \"execution_count\": 33,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Ridge\\n\",\n    \"from sklearn.linear_model import Ridge, SGDRegressor\\n\",\n    \"ridge_reg = Ridge(alpha=1)\\n\",\n    \"cross_val_score(ridge_reg,x,y).mean()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(0.1, 0.0001)\"\n      ]\n     },\n     \"execution_count\": 34,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"###\\n\",\n    \"# Elastic Net\\n\",\n    \"###\\n\",\n    \"from sklearn.linear_model import ElasticNetCV\\n\",\n    \"enet_reg = ElasticNetCV(alphas=[.0001, .001, .01,.1,1], \\n\",\n    \"                        l1_ratio=[.0001, .001, .01,.1,.5,.9, .99, 1])\\n\",\n    \"enet_reg.fit(x,y)\\n\",\n    \"enet_reg.alpha_, enet_reg.l1_ratio_\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.4323487671492522\"\n      ]\n     },\n     \"execution_count\": 35,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"cross_val_score(enet_reg,x,y).mean()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"5 non-zero of 5 coefficients.\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.009194244568332843\"\n      ]\n     },\n     \"execution_count\": 37,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"scaler = StandardScaler()\\n\",\n    \"Xscale = scaler.fit_transform(X)\\n\",\n    \"from sklearn.linear_model import ElasticNet\\n\",\n    \"enet_reg = ElasticNet(alpha=.1, l1_ratio=.0001)\\n\",\n    \"enet_reg.fit(Xscale,df['x_republican'])\\n\",\n    \"nonzero = enet_reg.coef_ != 0\\n\",\n    \"print(nonzero.sum(),'non-zero of',len(enet_reg.coef_),'coefficients.')\\n\",\n    \"X_enet = X[:,nonzero]\\n\",\n    \"X_enet\\n\",\n    \"cross_val_score(enet_reg,X_enet,df['x_republican'],n_jobs=-1).mean()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Classification\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 38,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<div>\\n\",\n       \"<style scoped>\\n\",\n       \"    .dataframe tbody tr th:only-of-type {\\n\",\n       \"        vertical-align: middle;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe tbody tr th {\\n\",\n       \"        vertical-align: top;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe thead th {\\n\",\n       \"        text-align: right;\\n\",\n       \"    }\\n\",\n       \"</style>\\n\",\n       \"<table border=\\\"1\\\" class=\\\"dataframe\\\">\\n\",\n       \"  <thead>\\n\",\n       \"    <tr style=\\\"text-align: right;\\\">\\n\",\n       \"      <th></th>\\n\",\n       \"      <th>x_republican</th>\\n\",\n       \"      <th>x_000</th>\\n\",\n       \"      <th>x_10</th>\\n\",\n       \"      <th>x_100</th>\\n\",\n       \"      <th>x_101</th>\\n\",\n       \"      <th>x_102</th>\\n\",\n       \"      <th>x_103</th>\\n\",\n       \"      <th>x_104</th>\\n\",\n       \"      <th>x_104 ct</th>\\n\",\n       \"      <th>x_105</th>\\n\",\n       \"      <th>...</th>\\n\",\n       \"      <th>x_violated</th>\\n\",\n       \"      <th>x_violation</th>\\n\",\n       \"      <th>x_water</th>\\n\",\n       \"      <th>x_way</th>\\n\",\n       \"      <th>x_west</th>\\n\",\n       \"      <th>x_words</th>\\n\",\n       \"      <th>x_work</th>\\n\",\n       \"      <th>x_year</th>\\n\",\n       \"      <th>x_years</th>\\n\",\n       \"      <th>x_york</th>\\n\",\n       \"    </tr>\\n\",\n       \"  </thead>\\n\",\n       \"  <tbody>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>0</th>\\n\",\n       \"      <td>0.0</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.001709</td>\\n\",\n       \"      <td>0.001709</td>\\n\",\n       \"      <td>0.001709</td>\\n\",\n       \"      <td>0.001709</td>\\n\",\n       \"      <td>0.001709</td>\\n\",\n       \"      <td>0.001709</td>\\n\",\n       \"      <td>...</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.003419</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.001709</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.011966</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.017094</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.0</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>1</th>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.002639</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.002639</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.005277</td>\\n\",\n       \"      <td>0.002639</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>...</td>\\n\",\n       \"      <td>0.002639</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.005277</td>\\n\",\n       \"      <td>0.002639</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.0</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>2</th>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.014706</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>...</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.001634</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.001634</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.013072</td>\\n\",\n       \"      <td>0.001634</td>\\n\",\n       \"      <td>0.0</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>3</th>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.003652</td>\\n\",\n       \"      <td>0.001461</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000730</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.006574</td>\\n\",\n       \"      <td>...</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.013879</td>\\n\",\n       \"      <td>0.002922</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000730</td>\\n\",\n       \"      <td>0.002922</td>\\n\",\n       \"      <td>0.0</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>4</th>\\n\",\n       \"      <td>1.0</td>\\n\",\n       \"      <td>0.001003</td>\\n\",\n       \"      <td>0.002006</td>\\n\",\n       \"      <td>0.001003</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.004012</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.001003</td>\\n\",\n       \"      <td>...</td>\\n\",\n       \"      <td>0.002006</td>\\n\",\n       \"      <td>0.002006</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.000000</td>\\n\",\n       \"      <td>0.001003</td>\\n\",\n       \"      <td>0.003009</td>\\n\",\n       \"      <td>0.001003</td>\\n\",\n       \"      <td>0.0</td>\\n\",\n       \"    </tr>\\n\",\n       \"  </tbody>\\n\",\n       \"</table>\\n\",\n       \"<p>5 rows × 501 columns</p>\\n\",\n       \"</div>\"\n      ],\n      \"text/plain\": [\n       \"   x_republican     x_000      x_10     x_100     x_101     x_102     x_103  \\\\\\n\",\n       \"0           0.0  0.000000  0.000000  0.000000  0.001709  0.001709  0.001709   \\n\",\n       \"1           1.0  0.000000  0.002639  0.000000  0.002639  0.000000  0.000000   \\n\",\n       \"2           1.0  0.000000  0.000000  0.000000  0.000000  0.014706  0.000000   \\n\",\n       \"3           1.0  0.000000  0.003652  0.001461  0.000000  0.000000  0.000730   \\n\",\n       \"4           1.0  0.001003  0.002006  0.001003  0.000000  0.000000  0.004012   \\n\",\n       \"\\n\",\n       \"      x_104  x_104 ct     x_105  ...  x_violated  x_violation   x_water  \\\\\\n\",\n       \"0  0.001709  0.001709  0.001709  ...    0.000000     0.003419  0.000000   \\n\",\n       \"1  0.005277  0.002639  0.000000  ...    0.002639     0.000000  0.000000   \\n\",\n       \"2  0.000000  0.000000  0.000000  ...    0.000000     0.001634  0.000000   \\n\",\n       \"3  0.000000  0.000000  0.006574  ...    0.000000     0.000000  0.013879   \\n\",\n       \"4  0.000000  0.000000  0.001003  ...    0.002006     0.002006  0.000000   \\n\",\n       \"\\n\",\n       \"      x_way    x_west   x_words    x_work    x_year   x_years  x_york  \\n\",\n       \"0  0.001709  0.000000  0.011966  0.000000  0.017094  0.000000     0.0  \\n\",\n       \"1  0.000000  0.005277  0.002639  0.000000  0.000000  0.000000     0.0  \\n\",\n       \"2  0.001634  0.000000  0.000000  0.000000  0.013072  0.001634     0.0  \\n\",\n       \"3  0.002922  0.000000  0.000000  0.000000  0.000730  0.002922     0.0  \\n\",\n       \"4  0.000000  0.000000  0.000000  0.001003  0.003009  0.001003     0.0  \\n\",\n       \"\\n\",\n       \"[5 rows x 501 columns]\"\n      ]\n     },\n     \"execution_count\": 38,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Make a small data set\\n\",\n    \"df = pd.read_pickle('sc_cases_cleaned.pkl',compression='gzip')\\n\",\n    \"df=df.reset_index(drop=True)\\n\",\n    \"\\n\",\n    \"from sklearn.feature_extraction.text import CountVectorizer\\n\",\n    \"vectorizer500 = CountVectorizer(min_df=0.01, # at min 1% of docs\\n\",\n    \"                        max_df=.9,  \\n\",\n    \"                        max_features=500,\\n\",\n    \"                        stop_words='english',\\n\",\n    \"                        ngram_range=(1,3))\\n\",\n    \"X500 = vectorizer500.fit_transform(df['opinion_text']).todense()\\n\",\n    \"X500 = X500 / X500.sum(axis=1) # counts to frequencies\\n\",\n    \"vocab = vectorizer500.get_feature_names()\\n\",\n    \"for i, word in enumerate(vectorizer500.get_feature_names()):\\n\",\n    \"    column = X500[:,i]\\n\",\n    \"    df['x_'+word] = column\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"features = [x for x in df.columns if x.startswith('x_') and x!=\\\"x_republican\\\"]\\n\",\n    \"keepcols = ['x_republican'] + features\\n\",\n    \"df1 = df[keepcols]\\n\",\n    \"y = df1['x_republican']\\n\",\n    \"# set up train/test split\\n\",\n    \"from sklearn.model_selection import train_test_split\\n\",\n    \"train, test = train_test_split(df1, test_size=0.2)\\n\",\n    \"features = [x for x in df1.columns if x.startswith('x_') and x!=\\\"x_republican\\\"]\\n\",\n    \"df1.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {\n    \"scrolled\": true\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.7402597402597403\"\n      ]\n     },\n     \"execution_count\": 39,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Binary Classifier\\n\",\n    \"from sklearn.linear_model import SGDClassifier\\n\",\n    \"sgd_clf = SGDClassifier(max_iter=10) \\n\",\n    \"sgd_clf.fit(train[features], train['x_republican'])\\n\",\n    \"sgd_clf.score(test[features],test['x_republican']) # accuracy on held-out data\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 40,\n   \"metadata\": {\n    \"scrolled\": true\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.7734375\"\n      ]\n     },\n     \"execution_count\": 40,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# compare to picking largest category\\n\",\n    \"df1['x_republican'].mean()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from multiprocessing import cpu_count\\n\",\n    \"nthreads = cpu_count() - 1\\n\",\n    \"\\n\",\n    \"# Form cross-validated prdictions for all data points\\n\",\n    \"from sklearn.model_selection import cross_val_predict\\n\",\n    \"df1['x_republican_sgd'] = cross_val_predict(sgd_clf,\\n\",\n    \"                                         df1[features],\\n\",\n    \"                                         df1['x_republican'],\\n\",\n    \"                                         cv=3,\\n\",\n    \"                                         n_jobs=nthreads)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"After applying a classifier to a data set with known labels `0` and `1`:\\n\",\n    \"\\n\",\n    \"<div class=\\\"alert alert-block alert-warning\\\">\\n\",\n    \"\\n\",\n    \"<div style=\\\"font-size: 150%;\\\"><i class=\\\"fa fa-info-circle\\\"></i>&nbsp;Definition</div>\\n\",\n    \"<ul>\\n\",\n    \"\\n\",\n    \"<li><strong>TP (true positives)</strong>: labels which were predicted as <code>1</code> and actually are <code>1</code>. <br/><br/>\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"<li><strong>TN (true negatives)</strong>: labels which were predicted as <code>0</code> and actually are <code>0</code>.<br/><br/>\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"<li><strong>FP (false positives)</strong>: labels which were predicted as <code>1</code> and actually are <code>0</code>.<br/><br/>\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"<li><strong>FN (false negatives)</strong>: labels which were predicted as <code>0</code> and actually are <code>1</code>.<br/><br/>\\n\",\n    \"\\n\",\n    \"</ul>\\n\",\n    \"\\n\",\n    \"To memorize this: \\n\",\n    \"\\n\",\n    \"<ul>\\n\",\n    \"\\n\",\n    \"<li>The second word \\\"positives\\\"/\\\"negatives\\\" refers to the prediction computed by the classifier.\\n\",\n    \"<li>The first word \\\"true\\\"/\\\"false\\\" expresses if the classification was correct or not.\\n\",\n    \"\\n\",\n    \"</ul>\\n\",\n    \"\\n\",\n    \"This is the so called <strong>Confusion Matrix</strong>:\\n\",\n    \"\\n\",\n    \"<table style=\\\"border: 1px; font-family: 'Source Code Pro', monocco, Consolas, monocco, monospace;\\n\",\n    \"              font-size:110%;\\\">\\n\",\n    \"    <tbody >\\n\",\n    \"        <tr>\\n\",\n    \"            <td style=\\\"padding: 10px; background:#f8f8f8;\\\"> </td>\\n\",\n    \"            <td style=\\\"padding: 10px; background:#f8f8f8;\\\">Predicted N</td>\\n\",\n    \"            <td style=\\\"padding: 10px; background:#f8f8f8;\\\">Predicted P</td>\\n\",\n    \"        </tr>\\n\",\n    \"        <tr>\\n\",\n    \"            <td style=\\\"padding: 10px; background:#f8f8f8;\\\">Actual N</td>\\n\",\n    \"            <td style=\\\"padding: 10px; background:#fcfcfc; text-align:center; font-weight: bold\\\">TN         </td>\\n\",\n    \"            <td style=\\\"padding: 10px; background:#fcfcfc; text-align:center; font-weight: bold\\\">FP         </td>\\n\",\n    \"        </tr>\\n\",\n    \"        <tr>\\n\",\n    \"            <td style=\\\"padding: 10px; background:#f8f8f8;\\\">Actual P</td>\\n\",\n    \"            <td style=\\\"padding: 10px; background:#fcfcfc; text-align:center; font-weight: bold\\\">FN         </td>\\n\",\n    \"            <td style=\\\"padding: 10px; background:#fcfcfc; text-align:center; font-weight: bold\\\">TP         </td>\\n\",\n    \"        </tr>\\n\",\n    \"    </tbody>\\n\",\n    \"</table>\\n\",\n    \"\\n\",\n    \"</div>\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"- So the total number of predictions can be expressed as `TP` + `FP` + `FN` + `TN`.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"- The number of correct predictions is `TP` + `TN`.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"- `TP` + `FN` is the number of positive examples in our data set, \\n\",\n    \"\\n\",\n    \"\\n\",\n    \"- `FP` + `TN` is the number of negative examples.\\n\",\n    \"\\n\",\n    \"- **precision** is computed as <code>TP / (TP + FP)</code>.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"- **recall** is computed as <code>TP / (TP + FN)</code>.\\n\",\n    \"\\n\",\n    \"- The **F1 score** is computed as <code>F1 = 2 * (precision * recall) / (precision + recall)</code>.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"<div class=\\\"alert alert-block alert-warning\\\">\\n\",\n    \"<div style=\\\"font-size: 150%;\\\"><i class=\\\"fa fa-info-circle\\\"></i>&nbsp;Definition</div>\\n\",\n    \"\\n\",\n    \"This allows us to define <strong>accuracy</strong> as (<code>TP</code> + <code>TN</code>) / (<code>TP</code> + <code>FP</code> + <code>FN</code> + <code>TN</code>).\\n\",\n    \"\\n\",\n    \"</div>\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 47,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/javascript\": [\n       \"/* Put everything inside the global mpl namespace */\\n\",\n       \"/* global mpl */\\n\",\n       \"window.mpl = {};\\n\",\n       \"\\n\",\n       \"mpl.get_websocket_type = function () {\\n\",\n       \"    if (typeof WebSocket !== 'undefined') {\\n\",\n       \"        return WebSocket;\\n\",\n       \"    } else if (typeof MozWebSocket !== 'undefined') {\\n\",\n       \"        return MozWebSocket;\\n\",\n       \"    } else {\\n\",\n       \"        alert(\\n\",\n       \"            'Your browser does not have WebSocket support. ' +\\n\",\n       \"                'Please try Chrome, Safari or Firefox ≥ 6. ' +\\n\",\n       \"                'Firefox 4 and 5 are also supported but you ' +\\n\",\n       \"                'have to enable WebSockets in about:config.'\\n\",\n       \"        );\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\\n\",\n       \"    this.id = figure_id;\\n\",\n       \"\\n\",\n       \"    this.ws = websocket;\\n\",\n       \"\\n\",\n       \"    this.supports_binary = this.ws.binaryType !== undefined;\\n\",\n       \"\\n\",\n       \"    if (!this.supports_binary) {\\n\",\n       \"        var warnings = document.getElementById('mpl-warnings');\\n\",\n       \"        if (warnings) {\\n\",\n       \"            warnings.style.display = 'block';\\n\",\n       \"            warnings.textContent =\\n\",\n       \"                'This browser does not support binary websocket messages. ' +\\n\",\n       \"                'Performance may be slow.';\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    this.imageObj = new Image();\\n\",\n       \"\\n\",\n       \"    this.context = undefined;\\n\",\n       \"    this.message = undefined;\\n\",\n       \"    this.canvas = undefined;\\n\",\n       \"    this.rubberband_canvas = undefined;\\n\",\n       \"    this.rubberband_context = undefined;\\n\",\n       \"    this.format_dropdown = undefined;\\n\",\n       \"\\n\",\n       \"    this.image_mode = 'full';\\n\",\n       \"\\n\",\n       \"    this.root = document.createElement('div');\\n\",\n       \"    this.root.setAttribute('style', 'display: inline-block');\\n\",\n       \"    this._root_extra_style(this.root);\\n\",\n       \"\\n\",\n       \"    parent_element.appendChild(this.root);\\n\",\n       \"\\n\",\n       \"    this._init_header(this);\\n\",\n       \"    this._init_canvas(this);\\n\",\n       \"    this._init_toolbar(this);\\n\",\n       \"\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    this.waiting = false;\\n\",\n       \"\\n\",\n       \"    this.ws.onopen = function () {\\n\",\n       \"        fig.send_message('supports_binary', { value: fig.supports_binary });\\n\",\n       \"        fig.send_message('send_image_mode', {});\\n\",\n       \"        if (fig.ratio !== 1) {\\n\",\n       \"            fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\\n\",\n       \"        }\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onload = function () {\\n\",\n       \"        if (fig.image_mode === 'full') {\\n\",\n       \"            // Full images could contain transparency (where diff images\\n\",\n       \"            // almost always do), so we need to clear the canvas so that\\n\",\n       \"            // there is no ghosting.\\n\",\n       \"            fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\\n\",\n       \"        }\\n\",\n       \"        fig.context.drawImage(fig.imageObj, 0, 0);\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onunload = function () {\\n\",\n       \"        fig.ws.close();\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.ws.onmessage = this._make_on_message_function(this);\\n\",\n       \"\\n\",\n       \"    this.ondownload = ondownload;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_header = function () {\\n\",\n       \"    var titlebar = document.createElement('div');\\n\",\n       \"    titlebar.classList =\\n\",\n       \"        'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\\n\",\n       \"    var titletext = document.createElement('div');\\n\",\n       \"    titletext.classList = 'ui-dialog-title';\\n\",\n       \"    titletext.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'width: 100%; text-align: center; padding: 3px;'\\n\",\n       \"    );\\n\",\n       \"    titlebar.appendChild(titletext);\\n\",\n       \"    this.root.appendChild(titlebar);\\n\",\n       \"    this.header = titletext;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_canvas = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var canvas_div = (this.canvas_div = document.createElement('div'));\\n\",\n       \"    canvas_div.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'border: 1px solid #ddd;' +\\n\",\n       \"            'box-sizing: content-box;' +\\n\",\n       \"            'clear: both;' +\\n\",\n       \"            'min-height: 1px;' +\\n\",\n       \"            'min-width: 1px;' +\\n\",\n       \"            'outline: 0;' +\\n\",\n       \"            'overflow: hidden;' +\\n\",\n       \"            'position: relative;' +\\n\",\n       \"            'resize: both;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    function on_keyboard_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.key_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keydown',\\n\",\n       \"        on_keyboard_event_closure('key_press')\\n\",\n       \"    );\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keyup',\\n\",\n       \"        on_keyboard_event_closure('key_release')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    this._canvas_extra_style(canvas_div);\\n\",\n       \"    this.root.appendChild(canvas_div);\\n\",\n       \"\\n\",\n       \"    var canvas = (this.canvas = document.createElement('canvas'));\\n\",\n       \"    canvas.classList.add('mpl-canvas');\\n\",\n       \"    canvas.setAttribute('style', 'box-sizing: content-box;');\\n\",\n       \"\\n\",\n       \"    this.context = canvas.getContext('2d');\\n\",\n       \"\\n\",\n       \"    var backingStore =\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        this.context.webkitBackingStorePixelRatio ||\\n\",\n       \"        this.context.mozBackingStorePixelRatio ||\\n\",\n       \"        this.context.msBackingStorePixelRatio ||\\n\",\n       \"        this.context.oBackingStorePixelRatio ||\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        1;\\n\",\n       \"\\n\",\n       \"    this.ratio = (window.devicePixelRatio || 1) / backingStore;\\n\",\n       \"    if (this.ratio !== 1) {\\n\",\n       \"        fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var rubberband_canvas = (this.rubberband_canvas = document.createElement(\\n\",\n       \"        'canvas'\\n\",\n       \"    ));\\n\",\n       \"    rubberband_canvas.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    var resizeObserver = new ResizeObserver(function (entries) {\\n\",\n       \"        var nentries = entries.length;\\n\",\n       \"        for (var i = 0; i < nentries; i++) {\\n\",\n       \"            var entry = entries[i];\\n\",\n       \"            var width, height;\\n\",\n       \"            if (entry.contentBoxSize) {\\n\",\n       \"                if (entry.contentBoxSize instanceof Array) {\\n\",\n       \"                    // Chrome 84 implements new version of spec.\\n\",\n       \"                    width = entry.contentBoxSize[0].inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize[0].blockSize;\\n\",\n       \"                } else {\\n\",\n       \"                    // Firefox implements old version of spec.\\n\",\n       \"                    width = entry.contentBoxSize.inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize.blockSize;\\n\",\n       \"                }\\n\",\n       \"            } else {\\n\",\n       \"                // Chrome <84 implements even older version of spec.\\n\",\n       \"                width = entry.contentRect.width;\\n\",\n       \"                height = entry.contentRect.height;\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            // Keep the size of the canvas and rubber band canvas in sync with\\n\",\n       \"            // the canvas container.\\n\",\n       \"            if (entry.devicePixelContentBoxSize) {\\n\",\n       \"                // Chrome 84 implements new version of spec.\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'width',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].inlineSize\\n\",\n       \"                );\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'height',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].blockSize\\n\",\n       \"                );\\n\",\n       \"            } else {\\n\",\n       \"                canvas.setAttribute('width', width * fig.ratio);\\n\",\n       \"                canvas.setAttribute('height', height * fig.ratio);\\n\",\n       \"            }\\n\",\n       \"            canvas.setAttribute(\\n\",\n       \"                'style',\\n\",\n       \"                'width: ' + width + 'px; height: ' + height + 'px;'\\n\",\n       \"            );\\n\",\n       \"\\n\",\n       \"            rubberband_canvas.setAttribute('width', width);\\n\",\n       \"            rubberband_canvas.setAttribute('height', height);\\n\",\n       \"\\n\",\n       \"            // And update the size in Python. We ignore the initial 0/0 size\\n\",\n       \"            // that occurs as the element is placed into the DOM, which should\\n\",\n       \"            // otherwise not happen due to the minimum size styling.\\n\",\n       \"            if (width != 0 && height != 0) {\\n\",\n       \"                fig.request_resize(width, height);\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    });\\n\",\n       \"    resizeObserver.observe(canvas_div);\\n\",\n       \"\\n\",\n       \"    function on_mouse_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.mouse_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousedown',\\n\",\n       \"        on_mouse_event_closure('button_press')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseup',\\n\",\n       \"        on_mouse_event_closure('button_release')\\n\",\n       \"    );\\n\",\n       \"    // Throttle sequential mouse events to 1 every 20ms.\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousemove',\\n\",\n       \"        on_mouse_event_closure('motion_notify')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseenter',\\n\",\n       \"        on_mouse_event_closure('figure_enter')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseleave',\\n\",\n       \"        on_mouse_event_closure('figure_leave')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener('wheel', function (event) {\\n\",\n       \"        if (event.deltaY < 0) {\\n\",\n       \"            event.step = 1;\\n\",\n       \"        } else {\\n\",\n       \"            event.step = -1;\\n\",\n       \"        }\\n\",\n       \"        on_mouse_event_closure('scroll')(event);\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    canvas_div.appendChild(canvas);\\n\",\n       \"    canvas_div.appendChild(rubberband_canvas);\\n\",\n       \"\\n\",\n       \"    this.rubberband_context = rubberband_canvas.getContext('2d');\\n\",\n       \"    this.rubberband_context.strokeStyle = '#000000';\\n\",\n       \"\\n\",\n       \"    this._resize_canvas = function (width, height, forward) {\\n\",\n       \"        if (forward) {\\n\",\n       \"            canvas_div.style.width = width + 'px';\\n\",\n       \"            canvas_div.style.height = height + 'px';\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    // Disable right mouse context menu.\\n\",\n       \"    this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\\n\",\n       \"        event.preventDefault();\\n\",\n       \"        return false;\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    function set_focus() {\\n\",\n       \"        canvas.focus();\\n\",\n       \"        canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    window.setTimeout(set_focus, 100);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'mpl-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var button = (fig.buttons[name] = document.createElement('button'));\\n\",\n       \"        button.classList = 'mpl-widget';\\n\",\n       \"        button.setAttribute('role', 'button');\\n\",\n       \"        button.setAttribute('aria-disabled', 'false');\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"\\n\",\n       \"        var icon_img = document.createElement('img');\\n\",\n       \"        icon_img.src = '_images/' + image + '.png';\\n\",\n       \"        icon_img.srcset = '_images/' + image + '_large.png 2x';\\n\",\n       \"        icon_img.alt = tooltip;\\n\",\n       \"        button.appendChild(icon_img);\\n\",\n       \"\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fmt_picker = document.createElement('select');\\n\",\n       \"    fmt_picker.classList = 'mpl-widget';\\n\",\n       \"    toolbar.appendChild(fmt_picker);\\n\",\n       \"    this.format_dropdown = fmt_picker;\\n\",\n       \"\\n\",\n       \"    for (var ind in mpl.extensions) {\\n\",\n       \"        var fmt = mpl.extensions[ind];\\n\",\n       \"        var option = document.createElement('option');\\n\",\n       \"        option.selected = fmt === mpl.default_extension;\\n\",\n       \"        option.innerHTML = fmt;\\n\",\n       \"        fmt_picker.appendChild(option);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\\n\",\n       \"    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\\n\",\n       \"    // which will in turn request a refresh of the image.\\n\",\n       \"    this.send_message('resize', { width: x_pixels, height: y_pixels });\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_message = function (type, properties) {\\n\",\n       \"    properties['type'] = type;\\n\",\n       \"    properties['figure_id'] = this.id;\\n\",\n       \"    this.ws.send(JSON.stringify(properties));\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_draw_message = function () {\\n\",\n       \"    if (!this.waiting) {\\n\",\n       \"        this.waiting = true;\\n\",\n       \"        this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    var format_dropdown = fig.format_dropdown;\\n\",\n       \"    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\\n\",\n       \"    fig.ondownload(fig, format);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_resize = function (fig, msg) {\\n\",\n       \"    var size = msg['size'];\\n\",\n       \"    if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\\n\",\n       \"        fig._resize_canvas(size[0], size[1], msg['forward']);\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\\n\",\n       \"    var x0 = msg['x0'] / fig.ratio;\\n\",\n       \"    var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\\n\",\n       \"    var x1 = msg['x1'] / fig.ratio;\\n\",\n       \"    var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\\n\",\n       \"    x0 = Math.floor(x0) + 0.5;\\n\",\n       \"    y0 = Math.floor(y0) + 0.5;\\n\",\n       \"    x1 = Math.floor(x1) + 0.5;\\n\",\n       \"    y1 = Math.floor(y1) + 0.5;\\n\",\n       \"    var min_x = Math.min(x0, x1);\\n\",\n       \"    var min_y = Math.min(y0, y1);\\n\",\n       \"    var width = Math.abs(x1 - x0);\\n\",\n       \"    var height = Math.abs(y1 - y0);\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.clearRect(\\n\",\n       \"        0,\\n\",\n       \"        0,\\n\",\n       \"        fig.canvas.width / fig.ratio,\\n\",\n       \"        fig.canvas.height / fig.ratio\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\\n\",\n       \"    // Updates the figure title.\\n\",\n       \"    fig.header.textContent = msg['label'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_cursor = function (fig, msg) {\\n\",\n       \"    var cursor = msg['cursor'];\\n\",\n       \"    switch (cursor) {\\n\",\n       \"        case 0:\\n\",\n       \"            cursor = 'pointer';\\n\",\n       \"            break;\\n\",\n       \"        case 1:\\n\",\n       \"            cursor = 'default';\\n\",\n       \"            break;\\n\",\n       \"        case 2:\\n\",\n       \"            cursor = 'crosshair';\\n\",\n       \"            break;\\n\",\n       \"        case 3:\\n\",\n       \"            cursor = 'move';\\n\",\n       \"            break;\\n\",\n       \"    }\\n\",\n       \"    fig.rubberband_canvas.style.cursor = cursor;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_message = function (fig, msg) {\\n\",\n       \"    fig.message.textContent = msg['message'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_draw = function (fig, _msg) {\\n\",\n       \"    // Request the server to send over a new figure.\\n\",\n       \"    fig.send_draw_message();\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\\n\",\n       \"    fig.image_mode = msg['mode'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\\n\",\n       \"    for (var key in msg) {\\n\",\n       \"        if (!(key in fig.buttons)) {\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"        fig.buttons[key].disabled = !msg[key];\\n\",\n       \"        fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\\n\",\n       \"    if (msg['mode'] === 'PAN') {\\n\",\n       \"        fig.buttons['Pan'].classList.add('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    } else if (msg['mode'] === 'ZOOM') {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.add('active');\\n\",\n       \"    } else {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Called whenever the canvas gets updated.\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// A function to construct a web socket function for onmessage handling.\\n\",\n       \"// Called in the figure constructor.\\n\",\n       \"mpl.figure.prototype._make_on_message_function = function (fig) {\\n\",\n       \"    return function socket_on_message(evt) {\\n\",\n       \"        if (evt.data instanceof Blob) {\\n\",\n       \"            /* FIXME: We get \\\"Resource interpreted as Image but\\n\",\n       \"             * transferred with MIME type text/plain:\\\" errors on\\n\",\n       \"             * Chrome.  But how to set the MIME type?  It doesn't seem\\n\",\n       \"             * to be part of the websocket stream */\\n\",\n       \"            evt.data.type = 'image/png';\\n\",\n       \"\\n\",\n       \"            /* Free the memory for the previous frames */\\n\",\n       \"            if (fig.imageObj.src) {\\n\",\n       \"                (window.URL || window.webkitURL).revokeObjectURL(\\n\",\n       \"                    fig.imageObj.src\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\\n\",\n       \"                evt.data\\n\",\n       \"            );\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        } else if (\\n\",\n       \"            typeof evt.data === 'string' &&\\n\",\n       \"            evt.data.slice(0, 21) === 'data:image/png;base64'\\n\",\n       \"        ) {\\n\",\n       \"            fig.imageObj.src = evt.data;\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var msg = JSON.parse(evt.data);\\n\",\n       \"        var msg_type = msg['type'];\\n\",\n       \"\\n\",\n       \"        // Call the  \\\"handle_{type}\\\" callback, which takes\\n\",\n       \"        // the figure and JSON message as its only arguments.\\n\",\n       \"        try {\\n\",\n       \"            var callback = fig['handle_' + msg_type];\\n\",\n       \"        } catch (e) {\\n\",\n       \"            console.log(\\n\",\n       \"                \\\"No handler for the '\\\" + msg_type + \\\"' message type: \\\",\\n\",\n       \"                msg\\n\",\n       \"            );\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        if (callback) {\\n\",\n       \"            try {\\n\",\n       \"                // console.log(\\\"Handling '\\\" + msg_type + \\\"' message: \\\", msg);\\n\",\n       \"                callback(fig, msg);\\n\",\n       \"            } catch (e) {\\n\",\n       \"                console.log(\\n\",\n       \"                    \\\"Exception inside the 'handler_\\\" + msg_type + \\\"' callback:\\\",\\n\",\n       \"                    e,\\n\",\n       \"                    e.stack,\\n\",\n       \"                    msg\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\\n\",\n       \"mpl.findpos = function (e) {\\n\",\n       \"    //this section is from http://www.quirksmode.org/js/events_properties.html\\n\",\n       \"    var targ;\\n\",\n       \"    if (!e) {\\n\",\n       \"        e = window.event;\\n\",\n       \"    }\\n\",\n       \"    if (e.target) {\\n\",\n       \"        targ = e.target;\\n\",\n       \"    } else if (e.srcElement) {\\n\",\n       \"        targ = e.srcElement;\\n\",\n       \"    }\\n\",\n       \"    if (targ.nodeType === 3) {\\n\",\n       \"        // defeat Safari bug\\n\",\n       \"        targ = targ.parentNode;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // pageX,Y are the mouse positions relative to the document\\n\",\n       \"    var boundingRect = targ.getBoundingClientRect();\\n\",\n       \"    var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\\n\",\n       \"    var y = e.pageY - (boundingRect.top + document.body.scrollTop);\\n\",\n       \"\\n\",\n       \"    return { x: x, y: y };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"/*\\n\",\n       \" * return a copy of an object with only non-object keys\\n\",\n       \" * we need this to avoid circular references\\n\",\n       \" * http://stackoverflow.com/a/24161582/3208463\\n\",\n       \" */\\n\",\n       \"function simpleKeys(original) {\\n\",\n       \"    return Object.keys(original).reduce(function (obj, key) {\\n\",\n       \"        if (typeof original[key] !== 'object') {\\n\",\n       \"            obj[key] = original[key];\\n\",\n       \"        }\\n\",\n       \"        return obj;\\n\",\n       \"    }, {});\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.mouse_event = function (event, name) {\\n\",\n       \"    var canvas_pos = mpl.findpos(event);\\n\",\n       \"\\n\",\n       \"    if (name === 'button_press') {\\n\",\n       \"        this.canvas.focus();\\n\",\n       \"        this.canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var x = canvas_pos.x * this.ratio;\\n\",\n       \"    var y = canvas_pos.y * this.ratio;\\n\",\n       \"\\n\",\n       \"    this.send_message(name, {\\n\",\n       \"        x: x,\\n\",\n       \"        y: y,\\n\",\n       \"        button: event.button,\\n\",\n       \"        step: event.step,\\n\",\n       \"        guiEvent: simpleKeys(event),\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    /* This prevents the web browser from automatically changing to\\n\",\n       \"     * the text insertion cursor when the button is pressed.  We want\\n\",\n       \"     * to control all of the cursor setting manually through the\\n\",\n       \"     * 'cursor' event from matplotlib */\\n\",\n       \"    event.preventDefault();\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (_event, _name) {\\n\",\n       \"    // Handle any extra behaviour associated with a key event\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.key_event = function (event, name) {\\n\",\n       \"    // Prevent repeat events\\n\",\n       \"    if (name === 'key_press') {\\n\",\n       \"        if (event.which === this._key) {\\n\",\n       \"            return;\\n\",\n       \"        } else {\\n\",\n       \"            this._key = event.which;\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"    if (name === 'key_release') {\\n\",\n       \"        this._key = null;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var value = '';\\n\",\n       \"    if (event.ctrlKey && event.which !== 17) {\\n\",\n       \"        value += 'ctrl+';\\n\",\n       \"    }\\n\",\n       \"    if (event.altKey && event.which !== 18) {\\n\",\n       \"        value += 'alt+';\\n\",\n       \"    }\\n\",\n       \"    if (event.shiftKey && event.which !== 16) {\\n\",\n       \"        value += 'shift+';\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    value += 'k';\\n\",\n       \"    value += event.which.toString();\\n\",\n       \"\\n\",\n       \"    this._key_event_extra(event, name);\\n\",\n       \"\\n\",\n       \"    this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onclick = function (name) {\\n\",\n       \"    if (name === 'download') {\\n\",\n       \"        this.handle_save(this, null);\\n\",\n       \"    } else {\\n\",\n       \"        this.send_message('toolbar_button', { name: name });\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\\n\",\n       \"    this.message.textContent = tooltip;\\n\",\n       \"};\\n\",\n       \"mpl.toolbar_items = [[\\\"Home\\\", \\\"Reset original view\\\", \\\"fa fa-home icon-home\\\", \\\"home\\\"], [\\\"Back\\\", \\\"Back to previous view\\\", \\\"fa fa-arrow-left icon-arrow-left\\\", \\\"back\\\"], [\\\"Forward\\\", \\\"Forward to next view\\\", \\\"fa fa-arrow-right icon-arrow-right\\\", \\\"forward\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Pan\\\", \\\"Left button pans, Right button zooms\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-arrows icon-move\\\", \\\"pan\\\"], [\\\"Zoom\\\", \\\"Zoom to rectangle\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-square-o icon-check-empty\\\", \\\"zoom\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Download\\\", \\\"Download plot\\\", \\\"fa fa-floppy-o icon-save\\\", \\\"download\\\"]];\\n\",\n       \"\\n\",\n       \"mpl.extensions = [\\\"eps\\\", \\\"jpeg\\\", \\\"pdf\\\", \\\"png\\\", \\\"ps\\\", \\\"raw\\\", \\\"svg\\\", \\\"tif\\\"];\\n\",\n       \"\\n\",\n       \"mpl.default_extension = \\\"png\\\";/* global mpl */\\n\",\n       \"\\n\",\n       \"var comm_websocket_adapter = function (comm) {\\n\",\n       \"    // Create a \\\"websocket\\\"-like object which calls the given IPython comm\\n\",\n       \"    // object with the appropriate methods. Currently this is a non binary\\n\",\n       \"    // socket, so there is still some room for performance tuning.\\n\",\n       \"    var ws = {};\\n\",\n       \"\\n\",\n       \"    ws.close = function () {\\n\",\n       \"        comm.close();\\n\",\n       \"    };\\n\",\n       \"    ws.send = function (m) {\\n\",\n       \"        //console.log('sending', m);\\n\",\n       \"        comm.send(m);\\n\",\n       \"    };\\n\",\n       \"    // Register the callback with on_msg.\\n\",\n       \"    comm.on_msg(function (msg) {\\n\",\n       \"        //console.log('receiving', msg['content']['data'], msg);\\n\",\n       \"        // Pass the mpl event to the overridden (by mpl) onmessage function.\\n\",\n       \"        ws.onmessage(msg['content']['data']);\\n\",\n       \"    });\\n\",\n       \"    return ws;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.mpl_figure_comm = function (comm, msg) {\\n\",\n       \"    // This is the function which gets called when the mpl process\\n\",\n       \"    // starts-up an IPython Comm through the \\\"matplotlib\\\" channel.\\n\",\n       \"\\n\",\n       \"    var id = msg.content.data.id;\\n\",\n       \"    // Get hold of the div created by the display call when the Comm\\n\",\n       \"    // socket was opened in Python.\\n\",\n       \"    var element = document.getElementById(id);\\n\",\n       \"    var ws_proxy = comm_websocket_adapter(comm);\\n\",\n       \"\\n\",\n       \"    function ondownload(figure, _format) {\\n\",\n       \"        window.open(figure.canvas.toDataURL());\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fig = new mpl.figure(id, ws_proxy, ondownload, element);\\n\",\n       \"\\n\",\n       \"    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\\n\",\n       \"    // web socket which is closed, not our websocket->open comm proxy.\\n\",\n       \"    ws_proxy.onopen();\\n\",\n       \"\\n\",\n       \"    fig.parent_element = element;\\n\",\n       \"    fig.cell_info = mpl.find_output_cell(\\\"<div id='\\\" + id + \\\"'></div>\\\");\\n\",\n       \"    if (!fig.cell_info) {\\n\",\n       \"        console.error('Failed to find cell for figure', id, fig);\\n\",\n       \"        return;\\n\",\n       \"    }\\n\",\n       \"    fig.cell_info[0].output_area.element.one(\\n\",\n       \"        'cleared',\\n\",\n       \"        { fig: fig },\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_close = function (fig, msg) {\\n\",\n       \"    var width = fig.canvas.width / fig.ratio;\\n\",\n       \"    fig.cell_info[0].output_area.element.off(\\n\",\n       \"        'cleared',\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    // Update the output cell to use the data from the current canvas.\\n\",\n       \"    fig.push_to_output();\\n\",\n       \"    var dataURL = fig.canvas.toDataURL();\\n\",\n       \"    // Re-enable the keyboard manager in IPython - without this line, in FF,\\n\",\n       \"    // the notebook keyboard shortcuts fail.\\n\",\n       \"    IPython.keyboard_manager.enable();\\n\",\n       \"    fig.parent_element.innerHTML =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"    fig.close_ws(fig, msg);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.close_ws = function (fig, msg) {\\n\",\n       \"    fig.send_message('closing', msg);\\n\",\n       \"    // fig.ws.close()\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\\n\",\n       \"    // Turn the data on the canvas into data in the output cell.\\n\",\n       \"    var width = this.canvas.width / this.ratio;\\n\",\n       \"    var dataURL = this.canvas.toDataURL();\\n\",\n       \"    this.cell_info[1]['text/html'] =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Tell IPython that the notebook contents must change.\\n\",\n       \"    IPython.notebook.set_dirty(true);\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"    var fig = this;\\n\",\n       \"    // Wait a second, then push the new image to the DOM so\\n\",\n       \"    // that it is saved nicely (might be nice to debounce this).\\n\",\n       \"    setTimeout(function () {\\n\",\n       \"        fig.push_to_output();\\n\",\n       \"    }, 1000);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'btn-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'btn-group';\\n\",\n       \"    var button;\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'btn-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        button = fig.buttons[name] = document.createElement('button');\\n\",\n       \"        button.classList = 'btn btn-default';\\n\",\n       \"        button.href = '#';\\n\",\n       \"        button.title = name;\\n\",\n       \"        button.innerHTML = '<i class=\\\"fa ' + image + ' fa-lg\\\"></i>';\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Add the status bar.\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message pull-right';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"\\n\",\n       \"    // Add the close button to the window.\\n\",\n       \"    var buttongrp = document.createElement('div');\\n\",\n       \"    buttongrp.classList = 'btn-group inline pull-right';\\n\",\n       \"    button = document.createElement('button');\\n\",\n       \"    button.classList = 'btn btn-mini btn-primary';\\n\",\n       \"    button.href = '#';\\n\",\n       \"    button.title = 'Stop Interaction';\\n\",\n       \"    button.innerHTML = '<i class=\\\"fa fa-power-off icon-remove icon-large\\\"></i>';\\n\",\n       \"    button.addEventListener('click', function (_evt) {\\n\",\n       \"        fig.handle_close(fig, {});\\n\",\n       \"    });\\n\",\n       \"    button.addEventListener(\\n\",\n       \"        'mouseover',\\n\",\n       \"        on_mouseover_closure('Stop Interaction')\\n\",\n       \"    );\\n\",\n       \"    buttongrp.appendChild(button);\\n\",\n       \"    var titlebar = this.root.querySelector('.ui-dialog-titlebar');\\n\",\n       \"    titlebar.insertBefore(buttongrp, titlebar.firstChild);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._remove_fig_handler = function (event) {\\n\",\n       \"    var fig = event.data.fig;\\n\",\n       \"    fig.close_ws(fig, {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (el) {\\n\",\n       \"    el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (el) {\\n\",\n       \"    // this is important to make the div 'focusable\\n\",\n       \"    el.setAttribute('tabindex', 0);\\n\",\n       \"    // reach out to IPython and tell the keyboard manager to turn it's self\\n\",\n       \"    // off when our div gets focus\\n\",\n       \"\\n\",\n       \"    // location in version 3\\n\",\n       \"    if (IPython.notebook.keyboard_manager) {\\n\",\n       \"        IPython.notebook.keyboard_manager.register_events(el);\\n\",\n       \"    } else {\\n\",\n       \"        // location in version 2\\n\",\n       \"        IPython.keyboard_manager.register_events(el);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (event, _name) {\\n\",\n       \"    var manager = IPython.notebook.keyboard_manager;\\n\",\n       \"    if (!manager) {\\n\",\n       \"        manager = IPython.keyboard_manager;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Check for shift+enter\\n\",\n       \"    if (event.shiftKey && event.which === 13) {\\n\",\n       \"        this.canvas_div.blur();\\n\",\n       \"        // select the cell after this one\\n\",\n       \"        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\\n\",\n       \"        IPython.notebook.select(index + 1);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    fig.ondownload(fig, null);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.find_output_cell = function (html_output) {\\n\",\n       \"    // Return the cell and output element which can be found *uniquely* in the notebook.\\n\",\n       \"    // Note - this is a bit hacky, but it is done because the \\\"notebook_saving.Notebook\\\"\\n\",\n       \"    // IPython event is triggered only after the cells have been serialised, which for\\n\",\n       \"    // our purposes (turning an active figure into a static one), is too late.\\n\",\n       \"    var cells = IPython.notebook.get_cells();\\n\",\n       \"    var ncells = cells.length;\\n\",\n       \"    for (var i = 0; i < ncells; i++) {\\n\",\n       \"        var cell = cells[i];\\n\",\n       \"        if (cell.cell_type === 'code') {\\n\",\n       \"            for (var j = 0; j < cell.output_area.outputs.length; j++) {\\n\",\n       \"                var data = cell.output_area.outputs[j];\\n\",\n       \"                if (data.data) {\\n\",\n       \"                    // IPython >= 3 moved mimebundle to data attribute of output\\n\",\n       \"                    data = data.data;\\n\",\n       \"                }\\n\",\n       \"                if (data['text/html'] === html_output) {\\n\",\n       \"                    return [cell, data, j];\\n\",\n       \"                }\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// Register the function which deals with the matplotlib target/channel.\\n\",\n       \"// The kernel may be null if the page has been refreshed.\\n\",\n       \"if (IPython.notebook.kernel !== null) {\\n\",\n       \"    IPython.notebook.kernel.comm_manager.register_target(\\n\",\n       \"        'matplotlib',\\n\",\n       \"        mpl.mpl_figure_comm\\n\",\n       \"    );\\n\",\n       \"}\\n\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.Javascript object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<img src=\\\"data:image/png;base64,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\\\" width=\\\"640\\\">\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.HTML object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<sklearn.metrics._plot.confusion_matrix.ConfusionMatrixDisplay at 0x7f62f9010670>\"\n      ]\n     },\n     \"execution_count\": 47,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Construct confusion matrix\\n\",\n    \"from sklearn.metrics import confusion_matrix, plot_confusion_matrix\\n\",\n    \"#confusion_matrix(df1['x_republican'], df1['x_republican_sgd'])\\n\",\n    \"plot_confusion_matrix(sgd_clf, test[features],test['x_republican'])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 43,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Precision: 0.7734375\\n\",\n      \"Recall: 1.0\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Precision and Recall\\n\",\n    \"from sklearn.metrics import precision_score, recall_score\\n\",\n    \"print('Precision:',precision_score(df1['x_republican'], df1['x_republican_sgd']))\\n\",\n    \"print('Recall:',recall_score(df1['x_republican'], df1['x_republican_sgd']))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 44,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.8722466960352423\"\n      ]\n     },\n     \"execution_count\": 44,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#F1 score\\n\",\n    \"from sklearn.metrics import f1_score\\n\",\n    \"f1_score(df1['x_republican'],df1['x_republican_sgd'])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Precision/Recall Trade Off\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 48,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/javascript\": [\n       \"/* Put everything inside the global mpl namespace */\\n\",\n       \"/* global mpl */\\n\",\n       \"window.mpl = {};\\n\",\n       \"\\n\",\n       \"mpl.get_websocket_type = function () {\\n\",\n       \"    if (typeof WebSocket !== 'undefined') {\\n\",\n       \"        return WebSocket;\\n\",\n       \"    } else if (typeof MozWebSocket !== 'undefined') {\\n\",\n       \"        return MozWebSocket;\\n\",\n       \"    } else {\\n\",\n       \"        alert(\\n\",\n       \"            'Your browser does not have WebSocket support. ' +\\n\",\n       \"                'Please try Chrome, Safari or Firefox ≥ 6. ' +\\n\",\n       \"                'Firefox 4 and 5 are also supported but you ' +\\n\",\n       \"                'have to enable WebSockets in about:config.'\\n\",\n       \"        );\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\\n\",\n       \"    this.id = figure_id;\\n\",\n       \"\\n\",\n       \"    this.ws = websocket;\\n\",\n       \"\\n\",\n       \"    this.supports_binary = this.ws.binaryType !== undefined;\\n\",\n       \"\\n\",\n       \"    if (!this.supports_binary) {\\n\",\n       \"        var warnings = document.getElementById('mpl-warnings');\\n\",\n       \"        if (warnings) {\\n\",\n       \"            warnings.style.display = 'block';\\n\",\n       \"            warnings.textContent =\\n\",\n       \"                'This browser does not support binary websocket messages. ' +\\n\",\n       \"                'Performance may be slow.';\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    this.imageObj = new Image();\\n\",\n       \"\\n\",\n       \"    this.context = undefined;\\n\",\n       \"    this.message = undefined;\\n\",\n       \"    this.canvas = undefined;\\n\",\n       \"    this.rubberband_canvas = undefined;\\n\",\n       \"    this.rubberband_context = undefined;\\n\",\n       \"    this.format_dropdown = undefined;\\n\",\n       \"\\n\",\n       \"    this.image_mode = 'full';\\n\",\n       \"\\n\",\n       \"    this.root = document.createElement('div');\\n\",\n       \"    this.root.setAttribute('style', 'display: inline-block');\\n\",\n       \"    this._root_extra_style(this.root);\\n\",\n       \"\\n\",\n       \"    parent_element.appendChild(this.root);\\n\",\n       \"\\n\",\n       \"    this._init_header(this);\\n\",\n       \"    this._init_canvas(this);\\n\",\n       \"    this._init_toolbar(this);\\n\",\n       \"\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    this.waiting = false;\\n\",\n       \"\\n\",\n       \"    this.ws.onopen = function () {\\n\",\n       \"        fig.send_message('supports_binary', { value: fig.supports_binary });\\n\",\n       \"        fig.send_message('send_image_mode', {});\\n\",\n       \"        if (fig.ratio !== 1) {\\n\",\n       \"            fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\\n\",\n       \"        }\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onload = function () {\\n\",\n       \"        if (fig.image_mode === 'full') {\\n\",\n       \"            // Full images could contain transparency (where diff images\\n\",\n       \"            // almost always do), so we need to clear the canvas so that\\n\",\n       \"            // there is no ghosting.\\n\",\n       \"            fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\\n\",\n       \"        }\\n\",\n       \"        fig.context.drawImage(fig.imageObj, 0, 0);\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onunload = function () {\\n\",\n       \"        fig.ws.close();\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.ws.onmessage = this._make_on_message_function(this);\\n\",\n       \"\\n\",\n       \"    this.ondownload = ondownload;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_header = function () {\\n\",\n       \"    var titlebar = document.createElement('div');\\n\",\n       \"    titlebar.classList =\\n\",\n       \"        'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\\n\",\n       \"    var titletext = document.createElement('div');\\n\",\n       \"    titletext.classList = 'ui-dialog-title';\\n\",\n       \"    titletext.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'width: 100%; text-align: center; padding: 3px;'\\n\",\n       \"    );\\n\",\n       \"    titlebar.appendChild(titletext);\\n\",\n       \"    this.root.appendChild(titlebar);\\n\",\n       \"    this.header = titletext;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_canvas = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var canvas_div = (this.canvas_div = document.createElement('div'));\\n\",\n       \"    canvas_div.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'border: 1px solid #ddd;' +\\n\",\n       \"            'box-sizing: content-box;' +\\n\",\n       \"            'clear: both;' +\\n\",\n       \"            'min-height: 1px;' +\\n\",\n       \"            'min-width: 1px;' +\\n\",\n       \"            'outline: 0;' +\\n\",\n       \"            'overflow: hidden;' +\\n\",\n       \"            'position: relative;' +\\n\",\n       \"            'resize: both;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    function on_keyboard_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.key_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keydown',\\n\",\n       \"        on_keyboard_event_closure('key_press')\\n\",\n       \"    );\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keyup',\\n\",\n       \"        on_keyboard_event_closure('key_release')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    this._canvas_extra_style(canvas_div);\\n\",\n       \"    this.root.appendChild(canvas_div);\\n\",\n       \"\\n\",\n       \"    var canvas = (this.canvas = document.createElement('canvas'));\\n\",\n       \"    canvas.classList.add('mpl-canvas');\\n\",\n       \"    canvas.setAttribute('style', 'box-sizing: content-box;');\\n\",\n       \"\\n\",\n       \"    this.context = canvas.getContext('2d');\\n\",\n       \"\\n\",\n       \"    var backingStore =\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        this.context.webkitBackingStorePixelRatio ||\\n\",\n       \"        this.context.mozBackingStorePixelRatio ||\\n\",\n       \"        this.context.msBackingStorePixelRatio ||\\n\",\n       \"        this.context.oBackingStorePixelRatio ||\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        1;\\n\",\n       \"\\n\",\n       \"    this.ratio = (window.devicePixelRatio || 1) / backingStore;\\n\",\n       \"    if (this.ratio !== 1) {\\n\",\n       \"        fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var rubberband_canvas = (this.rubberband_canvas = document.createElement(\\n\",\n       \"        'canvas'\\n\",\n       \"    ));\\n\",\n       \"    rubberband_canvas.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    var resizeObserver = new ResizeObserver(function (entries) {\\n\",\n       \"        var nentries = entries.length;\\n\",\n       \"        for (var i = 0; i < nentries; i++) {\\n\",\n       \"            var entry = entries[i];\\n\",\n       \"            var width, height;\\n\",\n       \"            if (entry.contentBoxSize) {\\n\",\n       \"                if (entry.contentBoxSize instanceof Array) {\\n\",\n       \"                    // Chrome 84 implements new version of spec.\\n\",\n       \"                    width = entry.contentBoxSize[0].inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize[0].blockSize;\\n\",\n       \"                } else {\\n\",\n       \"                    // Firefox implements old version of spec.\\n\",\n       \"                    width = entry.contentBoxSize.inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize.blockSize;\\n\",\n       \"                }\\n\",\n       \"            } else {\\n\",\n       \"                // Chrome <84 implements even older version of spec.\\n\",\n       \"                width = entry.contentRect.width;\\n\",\n       \"                height = entry.contentRect.height;\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            // Keep the size of the canvas and rubber band canvas in sync with\\n\",\n       \"            // the canvas container.\\n\",\n       \"            if (entry.devicePixelContentBoxSize) {\\n\",\n       \"                // Chrome 84 implements new version of spec.\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'width',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].inlineSize\\n\",\n       \"                );\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'height',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].blockSize\\n\",\n       \"                );\\n\",\n       \"            } else {\\n\",\n       \"                canvas.setAttribute('width', width * fig.ratio);\\n\",\n       \"                canvas.setAttribute('height', height * fig.ratio);\\n\",\n       \"            }\\n\",\n       \"            canvas.setAttribute(\\n\",\n       \"                'style',\\n\",\n       \"                'width: ' + width + 'px; height: ' + height + 'px;'\\n\",\n       \"            );\\n\",\n       \"\\n\",\n       \"            rubberband_canvas.setAttribute('width', width);\\n\",\n       \"            rubberband_canvas.setAttribute('height', height);\\n\",\n       \"\\n\",\n       \"            // And update the size in Python. We ignore the initial 0/0 size\\n\",\n       \"            // that occurs as the element is placed into the DOM, which should\\n\",\n       \"            // otherwise not happen due to the minimum size styling.\\n\",\n       \"            if (width != 0 && height != 0) {\\n\",\n       \"                fig.request_resize(width, height);\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    });\\n\",\n       \"    resizeObserver.observe(canvas_div);\\n\",\n       \"\\n\",\n       \"    function on_mouse_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.mouse_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousedown',\\n\",\n       \"        on_mouse_event_closure('button_press')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseup',\\n\",\n       \"        on_mouse_event_closure('button_release')\\n\",\n       \"    );\\n\",\n       \"    // Throttle sequential mouse events to 1 every 20ms.\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousemove',\\n\",\n       \"        on_mouse_event_closure('motion_notify')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseenter',\\n\",\n       \"        on_mouse_event_closure('figure_enter')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseleave',\\n\",\n       \"        on_mouse_event_closure('figure_leave')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener('wheel', function (event) {\\n\",\n       \"        if (event.deltaY < 0) {\\n\",\n       \"            event.step = 1;\\n\",\n       \"        } else {\\n\",\n       \"            event.step = -1;\\n\",\n       \"        }\\n\",\n       \"        on_mouse_event_closure('scroll')(event);\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    canvas_div.appendChild(canvas);\\n\",\n       \"    canvas_div.appendChild(rubberband_canvas);\\n\",\n       \"\\n\",\n       \"    this.rubberband_context = rubberband_canvas.getContext('2d');\\n\",\n       \"    this.rubberband_context.strokeStyle = '#000000';\\n\",\n       \"\\n\",\n       \"    this._resize_canvas = function (width, height, forward) {\\n\",\n       \"        if (forward) {\\n\",\n       \"            canvas_div.style.width = width + 'px';\\n\",\n       \"            canvas_div.style.height = height + 'px';\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    // Disable right mouse context menu.\\n\",\n       \"    this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\\n\",\n       \"        event.preventDefault();\\n\",\n       \"        return false;\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    function set_focus() {\\n\",\n       \"        canvas.focus();\\n\",\n       \"        canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    window.setTimeout(set_focus, 100);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'mpl-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var button = (fig.buttons[name] = document.createElement('button'));\\n\",\n       \"        button.classList = 'mpl-widget';\\n\",\n       \"        button.setAttribute('role', 'button');\\n\",\n       \"        button.setAttribute('aria-disabled', 'false');\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"\\n\",\n       \"        var icon_img = document.createElement('img');\\n\",\n       \"        icon_img.src = '_images/' + image + '.png';\\n\",\n       \"        icon_img.srcset = '_images/' + image + '_large.png 2x';\\n\",\n       \"        icon_img.alt = tooltip;\\n\",\n       \"        button.appendChild(icon_img);\\n\",\n       \"\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fmt_picker = document.createElement('select');\\n\",\n       \"    fmt_picker.classList = 'mpl-widget';\\n\",\n       \"    toolbar.appendChild(fmt_picker);\\n\",\n       \"    this.format_dropdown = fmt_picker;\\n\",\n       \"\\n\",\n       \"    for (var ind in mpl.extensions) {\\n\",\n       \"        var fmt = mpl.extensions[ind];\\n\",\n       \"        var option = document.createElement('option');\\n\",\n       \"        option.selected = fmt === mpl.default_extension;\\n\",\n       \"        option.innerHTML = fmt;\\n\",\n       \"        fmt_picker.appendChild(option);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\\n\",\n       \"    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\\n\",\n       \"    // which will in turn request a refresh of the image.\\n\",\n       \"    this.send_message('resize', { width: x_pixels, height: y_pixels });\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_message = function (type, properties) {\\n\",\n       \"    properties['type'] = type;\\n\",\n       \"    properties['figure_id'] = this.id;\\n\",\n       \"    this.ws.send(JSON.stringify(properties));\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_draw_message = function () {\\n\",\n       \"    if (!this.waiting) {\\n\",\n       \"        this.waiting = true;\\n\",\n       \"        this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    var format_dropdown = fig.format_dropdown;\\n\",\n       \"    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\\n\",\n       \"    fig.ondownload(fig, format);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_resize = function (fig, msg) {\\n\",\n       \"    var size = msg['size'];\\n\",\n       \"    if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\\n\",\n       \"        fig._resize_canvas(size[0], size[1], msg['forward']);\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\\n\",\n       \"    var x0 = msg['x0'] / fig.ratio;\\n\",\n       \"    var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\\n\",\n       \"    var x1 = msg['x1'] / fig.ratio;\\n\",\n       \"    var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\\n\",\n       \"    x0 = Math.floor(x0) + 0.5;\\n\",\n       \"    y0 = Math.floor(y0) + 0.5;\\n\",\n       \"    x1 = Math.floor(x1) + 0.5;\\n\",\n       \"    y1 = Math.floor(y1) + 0.5;\\n\",\n       \"    var min_x = Math.min(x0, x1);\\n\",\n       \"    var min_y = Math.min(y0, y1);\\n\",\n       \"    var width = Math.abs(x1 - x0);\\n\",\n       \"    var height = Math.abs(y1 - y0);\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.clearRect(\\n\",\n       \"        0,\\n\",\n       \"        0,\\n\",\n       \"        fig.canvas.width / fig.ratio,\\n\",\n       \"        fig.canvas.height / fig.ratio\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\\n\",\n       \"    // Updates the figure title.\\n\",\n       \"    fig.header.textContent = msg['label'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_cursor = function (fig, msg) {\\n\",\n       \"    var cursor = msg['cursor'];\\n\",\n       \"    switch (cursor) {\\n\",\n       \"        case 0:\\n\",\n       \"            cursor = 'pointer';\\n\",\n       \"            break;\\n\",\n       \"        case 1:\\n\",\n       \"            cursor = 'default';\\n\",\n       \"            break;\\n\",\n       \"        case 2:\\n\",\n       \"            cursor = 'crosshair';\\n\",\n       \"            break;\\n\",\n       \"        case 3:\\n\",\n       \"            cursor = 'move';\\n\",\n       \"            break;\\n\",\n       \"    }\\n\",\n       \"    fig.rubberband_canvas.style.cursor = cursor;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_message = function (fig, msg) {\\n\",\n       \"    fig.message.textContent = msg['message'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_draw = function (fig, _msg) {\\n\",\n       \"    // Request the server to send over a new figure.\\n\",\n       \"    fig.send_draw_message();\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\\n\",\n       \"    fig.image_mode = msg['mode'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\\n\",\n       \"    for (var key in msg) {\\n\",\n       \"        if (!(key in fig.buttons)) {\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"        fig.buttons[key].disabled = !msg[key];\\n\",\n       \"        fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\\n\",\n       \"    if (msg['mode'] === 'PAN') {\\n\",\n       \"        fig.buttons['Pan'].classList.add('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    } else if (msg['mode'] === 'ZOOM') {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.add('active');\\n\",\n       \"    } else {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Called whenever the canvas gets updated.\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// A function to construct a web socket function for onmessage handling.\\n\",\n       \"// Called in the figure constructor.\\n\",\n       \"mpl.figure.prototype._make_on_message_function = function (fig) {\\n\",\n       \"    return function socket_on_message(evt) {\\n\",\n       \"        if (evt.data instanceof Blob) {\\n\",\n       \"            /* FIXME: We get \\\"Resource interpreted as Image but\\n\",\n       \"             * transferred with MIME type text/plain:\\\" errors on\\n\",\n       \"             * Chrome.  But how to set the MIME type?  It doesn't seem\\n\",\n       \"             * to be part of the websocket stream */\\n\",\n       \"            evt.data.type = 'image/png';\\n\",\n       \"\\n\",\n       \"            /* Free the memory for the previous frames */\\n\",\n       \"            if (fig.imageObj.src) {\\n\",\n       \"                (window.URL || window.webkitURL).revokeObjectURL(\\n\",\n       \"                    fig.imageObj.src\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\\n\",\n       \"                evt.data\\n\",\n       \"            );\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        } else if (\\n\",\n       \"            typeof evt.data === 'string' &&\\n\",\n       \"            evt.data.slice(0, 21) === 'data:image/png;base64'\\n\",\n       \"        ) {\\n\",\n       \"            fig.imageObj.src = evt.data;\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var msg = JSON.parse(evt.data);\\n\",\n       \"        var msg_type = msg['type'];\\n\",\n       \"\\n\",\n       \"        // Call the  \\\"handle_{type}\\\" callback, which takes\\n\",\n       \"        // the figure and JSON message as its only arguments.\\n\",\n       \"        try {\\n\",\n       \"            var callback = fig['handle_' + msg_type];\\n\",\n       \"        } catch (e) {\\n\",\n       \"            console.log(\\n\",\n       \"                \\\"No handler for the '\\\" + msg_type + \\\"' message type: \\\",\\n\",\n       \"                msg\\n\",\n       \"            );\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        if (callback) {\\n\",\n       \"            try {\\n\",\n       \"                // console.log(\\\"Handling '\\\" + msg_type + \\\"' message: \\\", msg);\\n\",\n       \"                callback(fig, msg);\\n\",\n       \"            } catch (e) {\\n\",\n       \"                console.log(\\n\",\n       \"                    \\\"Exception inside the 'handler_\\\" + msg_type + \\\"' callback:\\\",\\n\",\n       \"                    e,\\n\",\n       \"                    e.stack,\\n\",\n       \"                    msg\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\\n\",\n       \"mpl.findpos = function (e) {\\n\",\n       \"    //this section is from http://www.quirksmode.org/js/events_properties.html\\n\",\n       \"    var targ;\\n\",\n       \"    if (!e) {\\n\",\n       \"        e = window.event;\\n\",\n       \"    }\\n\",\n       \"    if (e.target) {\\n\",\n       \"        targ = e.target;\\n\",\n       \"    } else if (e.srcElement) {\\n\",\n       \"        targ = e.srcElement;\\n\",\n       \"    }\\n\",\n       \"    if (targ.nodeType === 3) {\\n\",\n       \"        // defeat Safari bug\\n\",\n       \"        targ = targ.parentNode;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // pageX,Y are the mouse positions relative to the document\\n\",\n       \"    var boundingRect = targ.getBoundingClientRect();\\n\",\n       \"    var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\\n\",\n       \"    var y = e.pageY - (boundingRect.top + document.body.scrollTop);\\n\",\n       \"\\n\",\n       \"    return { x: x, y: y };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"/*\\n\",\n       \" * return a copy of an object with only non-object keys\\n\",\n       \" * we need this to avoid circular references\\n\",\n       \" * http://stackoverflow.com/a/24161582/3208463\\n\",\n       \" */\\n\",\n       \"function simpleKeys(original) {\\n\",\n       \"    return Object.keys(original).reduce(function (obj, key) {\\n\",\n       \"        if (typeof original[key] !== 'object') {\\n\",\n       \"            obj[key] = original[key];\\n\",\n       \"        }\\n\",\n       \"        return obj;\\n\",\n       \"    }, {});\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.mouse_event = function (event, name) {\\n\",\n       \"    var canvas_pos = mpl.findpos(event);\\n\",\n       \"\\n\",\n       \"    if (name === 'button_press') {\\n\",\n       \"        this.canvas.focus();\\n\",\n       \"        this.canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var x = canvas_pos.x * this.ratio;\\n\",\n       \"    var y = canvas_pos.y * this.ratio;\\n\",\n       \"\\n\",\n       \"    this.send_message(name, {\\n\",\n       \"        x: x,\\n\",\n       \"        y: y,\\n\",\n       \"        button: event.button,\\n\",\n       \"        step: event.step,\\n\",\n       \"        guiEvent: simpleKeys(event),\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    /* This prevents the web browser from automatically changing to\\n\",\n       \"     * the text insertion cursor when the button is pressed.  We want\\n\",\n       \"     * to control all of the cursor setting manually through the\\n\",\n       \"     * 'cursor' event from matplotlib */\\n\",\n       \"    event.preventDefault();\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (_event, _name) {\\n\",\n       \"    // Handle any extra behaviour associated with a key event\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.key_event = function (event, name) {\\n\",\n       \"    // Prevent repeat events\\n\",\n       \"    if (name === 'key_press') {\\n\",\n       \"        if (event.which === this._key) {\\n\",\n       \"            return;\\n\",\n       \"        } else {\\n\",\n       \"            this._key = event.which;\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"    if (name === 'key_release') {\\n\",\n       \"        this._key = null;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var value = '';\\n\",\n       \"    if (event.ctrlKey && event.which !== 17) {\\n\",\n       \"        value += 'ctrl+';\\n\",\n       \"    }\\n\",\n       \"    if (event.altKey && event.which !== 18) {\\n\",\n       \"        value += 'alt+';\\n\",\n       \"    }\\n\",\n       \"    if (event.shiftKey && event.which !== 16) {\\n\",\n       \"        value += 'shift+';\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    value += 'k';\\n\",\n       \"    value += event.which.toString();\\n\",\n       \"\\n\",\n       \"    this._key_event_extra(event, name);\\n\",\n       \"\\n\",\n       \"    this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onclick = function (name) {\\n\",\n       \"    if (name === 'download') {\\n\",\n       \"        this.handle_save(this, null);\\n\",\n       \"    } else {\\n\",\n       \"        this.send_message('toolbar_button', { name: name });\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\\n\",\n       \"    this.message.textContent = tooltip;\\n\",\n       \"};\\n\",\n       \"mpl.toolbar_items = [[\\\"Home\\\", \\\"Reset original view\\\", \\\"fa fa-home icon-home\\\", \\\"home\\\"], [\\\"Back\\\", \\\"Back to previous view\\\", \\\"fa fa-arrow-left icon-arrow-left\\\", \\\"back\\\"], [\\\"Forward\\\", \\\"Forward to next view\\\", \\\"fa fa-arrow-right icon-arrow-right\\\", \\\"forward\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Pan\\\", \\\"Left button pans, Right button zooms\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-arrows icon-move\\\", \\\"pan\\\"], [\\\"Zoom\\\", \\\"Zoom to rectangle\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-square-o icon-check-empty\\\", \\\"zoom\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Download\\\", \\\"Download plot\\\", \\\"fa fa-floppy-o icon-save\\\", \\\"download\\\"]];\\n\",\n       \"\\n\",\n       \"mpl.extensions = [\\\"eps\\\", \\\"jpeg\\\", \\\"pdf\\\", \\\"png\\\", \\\"ps\\\", \\\"raw\\\", \\\"svg\\\", \\\"tif\\\"];\\n\",\n       \"\\n\",\n       \"mpl.default_extension = \\\"png\\\";/* global mpl */\\n\",\n       \"\\n\",\n       \"var comm_websocket_adapter = function (comm) {\\n\",\n       \"    // Create a \\\"websocket\\\"-like object which calls the given IPython comm\\n\",\n       \"    // object with the appropriate methods. Currently this is a non binary\\n\",\n       \"    // socket, so there is still some room for performance tuning.\\n\",\n       \"    var ws = {};\\n\",\n       \"\\n\",\n       \"    ws.close = function () {\\n\",\n       \"        comm.close();\\n\",\n       \"    };\\n\",\n       \"    ws.send = function (m) {\\n\",\n       \"        //console.log('sending', m);\\n\",\n       \"        comm.send(m);\\n\",\n       \"    };\\n\",\n       \"    // Register the callback with on_msg.\\n\",\n       \"    comm.on_msg(function (msg) {\\n\",\n       \"        //console.log('receiving', msg['content']['data'], msg);\\n\",\n       \"        // Pass the mpl event to the overridden (by mpl) onmessage function.\\n\",\n       \"        ws.onmessage(msg['content']['data']);\\n\",\n       \"    });\\n\",\n       \"    return ws;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.mpl_figure_comm = function (comm, msg) {\\n\",\n       \"    // This is the function which gets called when the mpl process\\n\",\n       \"    // starts-up an IPython Comm through the \\\"matplotlib\\\" channel.\\n\",\n       \"\\n\",\n       \"    var id = msg.content.data.id;\\n\",\n       \"    // Get hold of the div created by the display call when the Comm\\n\",\n       \"    // socket was opened in Python.\\n\",\n       \"    var element = document.getElementById(id);\\n\",\n       \"    var ws_proxy = comm_websocket_adapter(comm);\\n\",\n       \"\\n\",\n       \"    function ondownload(figure, _format) {\\n\",\n       \"        window.open(figure.canvas.toDataURL());\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fig = new mpl.figure(id, ws_proxy, ondownload, element);\\n\",\n       \"\\n\",\n       \"    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\\n\",\n       \"    // web socket which is closed, not our websocket->open comm proxy.\\n\",\n       \"    ws_proxy.onopen();\\n\",\n       \"\\n\",\n       \"    fig.parent_element = element;\\n\",\n       \"    fig.cell_info = mpl.find_output_cell(\\\"<div id='\\\" + id + \\\"'></div>\\\");\\n\",\n       \"    if (!fig.cell_info) {\\n\",\n       \"        console.error('Failed to find cell for figure', id, fig);\\n\",\n       \"        return;\\n\",\n       \"    }\\n\",\n       \"    fig.cell_info[0].output_area.element.one(\\n\",\n       \"        'cleared',\\n\",\n       \"        { fig: fig },\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_close = function (fig, msg) {\\n\",\n       \"    var width = fig.canvas.width / fig.ratio;\\n\",\n       \"    fig.cell_info[0].output_area.element.off(\\n\",\n       \"        'cleared',\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    // Update the output cell to use the data from the current canvas.\\n\",\n       \"    fig.push_to_output();\\n\",\n       \"    var dataURL = fig.canvas.toDataURL();\\n\",\n       \"    // Re-enable the keyboard manager in IPython - without this line, in FF,\\n\",\n       \"    // the notebook keyboard shortcuts fail.\\n\",\n       \"    IPython.keyboard_manager.enable();\\n\",\n       \"    fig.parent_element.innerHTML =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"    fig.close_ws(fig, msg);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.close_ws = function (fig, msg) {\\n\",\n       \"    fig.send_message('closing', msg);\\n\",\n       \"    // fig.ws.close()\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\\n\",\n       \"    // Turn the data on the canvas into data in the output cell.\\n\",\n       \"    var width = this.canvas.width / this.ratio;\\n\",\n       \"    var dataURL = this.canvas.toDataURL();\\n\",\n       \"    this.cell_info[1]['text/html'] =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Tell IPython that the notebook contents must change.\\n\",\n       \"    IPython.notebook.set_dirty(true);\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"    var fig = this;\\n\",\n       \"    // Wait a second, then push the new image to the DOM so\\n\",\n       \"    // that it is saved nicely (might be nice to debounce this).\\n\",\n       \"    setTimeout(function () {\\n\",\n       \"        fig.push_to_output();\\n\",\n       \"    }, 1000);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'btn-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'btn-group';\\n\",\n       \"    var button;\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'btn-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        button = fig.buttons[name] = document.createElement('button');\\n\",\n       \"        button.classList = 'btn btn-default';\\n\",\n       \"        button.href = '#';\\n\",\n       \"        button.title = name;\\n\",\n       \"        button.innerHTML = '<i class=\\\"fa ' + image + ' fa-lg\\\"></i>';\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Add the status bar.\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message pull-right';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"\\n\",\n       \"    // Add the close button to the window.\\n\",\n       \"    var buttongrp = document.createElement('div');\\n\",\n       \"    buttongrp.classList = 'btn-group inline pull-right';\\n\",\n       \"    button = document.createElement('button');\\n\",\n       \"    button.classList = 'btn btn-mini btn-primary';\\n\",\n       \"    button.href = '#';\\n\",\n       \"    button.title = 'Stop Interaction';\\n\",\n       \"    button.innerHTML = '<i class=\\\"fa fa-power-off icon-remove icon-large\\\"></i>';\\n\",\n       \"    button.addEventListener('click', function (_evt) {\\n\",\n       \"        fig.handle_close(fig, {});\\n\",\n       \"    });\\n\",\n       \"    button.addEventListener(\\n\",\n       \"        'mouseover',\\n\",\n       \"        on_mouseover_closure('Stop Interaction')\\n\",\n       \"    );\\n\",\n       \"    buttongrp.appendChild(button);\\n\",\n       \"    var titlebar = this.root.querySelector('.ui-dialog-titlebar');\\n\",\n       \"    titlebar.insertBefore(buttongrp, titlebar.firstChild);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._remove_fig_handler = function (event) {\\n\",\n       \"    var fig = event.data.fig;\\n\",\n       \"    fig.close_ws(fig, {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (el) {\\n\",\n       \"    el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (el) {\\n\",\n       \"    // this is important to make the div 'focusable\\n\",\n       \"    el.setAttribute('tabindex', 0);\\n\",\n       \"    // reach out to IPython and tell the keyboard manager to turn it's self\\n\",\n       \"    // off when our div gets focus\\n\",\n       \"\\n\",\n       \"    // location in version 3\\n\",\n       \"    if (IPython.notebook.keyboard_manager) {\\n\",\n       \"        IPython.notebook.keyboard_manager.register_events(el);\\n\",\n       \"    } else {\\n\",\n       \"        // location in version 2\\n\",\n       \"        IPython.keyboard_manager.register_events(el);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (event, _name) {\\n\",\n       \"    var manager = IPython.notebook.keyboard_manager;\\n\",\n       \"    if (!manager) {\\n\",\n       \"        manager = IPython.keyboard_manager;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Check for shift+enter\\n\",\n       \"    if (event.shiftKey && event.which === 13) {\\n\",\n       \"        this.canvas_div.blur();\\n\",\n       \"        // select the cell after this one\\n\",\n       \"        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\\n\",\n       \"        IPython.notebook.select(index + 1);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    fig.ondownload(fig, null);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.find_output_cell = function (html_output) {\\n\",\n       \"    // Return the cell and output element which can be found *uniquely* in the notebook.\\n\",\n       \"    // Note - this is a bit hacky, but it is done because the \\\"notebook_saving.Notebook\\\"\\n\",\n       \"    // IPython event is triggered only after the cells have been serialised, which for\\n\",\n       \"    // our purposes (turning an active figure into a static one), is too late.\\n\",\n       \"    var cells = IPython.notebook.get_cells();\\n\",\n       \"    var ncells = cells.length;\\n\",\n       \"    for (var i = 0; i < ncells; i++) {\\n\",\n       \"        var cell = cells[i];\\n\",\n       \"        if (cell.cell_type === 'code') {\\n\",\n       \"            for (var j = 0; j < cell.output_area.outputs.length; j++) {\\n\",\n       \"                var data = cell.output_area.outputs[j];\\n\",\n       \"                if (data.data) {\\n\",\n       \"                    // IPython >= 3 moved mimebundle to data attribute of output\\n\",\n       \"                    data = data.data;\\n\",\n       \"                }\\n\",\n       \"                if (data['text/html'] === html_output) {\\n\",\n       \"                    return [cell, data, j];\\n\",\n       \"                }\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// Register the function which deals with the matplotlib target/channel.\\n\",\n       \"// The kernel may be null if the page has been refreshed.\\n\",\n       \"if (IPython.notebook.kernel !== null) {\\n\",\n       \"    IPython.notebook.kernel.comm_manager.register_target(\\n\",\n       \"        'matplotlib',\\n\",\n       \"        mpl.mpl_figure_comm\\n\",\n       \"    );\\n\",\n       \"}\\n\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.Javascript object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<img src=\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4Xu3df8ydZX0/8KuV8LNrEUbLagvWDhFGHB2WASMooqNFJCBu65JJaYaakjaDoaJEoFXXFroQZRsUtgj8U3AQCjIoGIeloZBF+aHFSrP6C1gLkkE7kFAp9Jv7fNdn0Bb73P3c55zrPtfrScziuD/3uc7reh+vt+d5znHE1q1btyY/BAgQIECAAAECxQiMUACL2WtPlAABAgQIECDQEVAABYEAAQIECBAgUJiAAljYhnu6BAgQIECAAAEFUAYIECBAgAABAoUJKICFbbinS4AAAQIECBBQAGWAAAECBAgQIFCYgAJY2IZ7ugQIECBAgAABBVAGCBAgQIAAAQKFCSiAhW24p0uAAAECBAgQUABlgAABAgQIECBQmIACWNiGe7oECBAgQIAAAQVQBggQIECAAAEChQkogIVtuKdLgAABAgQIEFAAZYAAAQIECBAgUJiAAljYhnu6BAgQIECAAAEFUAYIECBAgAABAoUJKICFbbinS4AAAQIECBBQAGWAAAECBAgQIFCYgAJY2IZ7ugQIECBAgAABBVAGCBAgQIAAAQKFCSiAhW24p0uAAAECBAgQUABlgAABAgQIECBQmIACWNiGe7oECBAgQIAAAQVQBggQIECAAAEChQkogIVtuKdLgAABAgQIEFAAZYAAAQIECBAgUJiAAljYhnu6BAgQIECAAAEFUAYIECBAgAABAoUJKICFbbinS4AAAQIECBBQAGWAAAECBAgQIFCYgAJY2IZ7ugQIECBAgAABBVAGCBAgQIAAAQKFCSiAhW24p0uAAAECBAgQUABlgAABAgQIECBQmIACWNiGe7oECBAgQIAAAQVQBggQIECAAAEChQkogIVtuKdLgAABAgQIEFAAZYAAAQIECBAgUJiAAljYhnu6BAgQIECAAAEFUAYIECBAgAABAoUJKICFbbinS4AAAQIECBBQAGWAAAECBAgQIFCYgAJY2IZ7ugQIECBAgAABBVAGCBAgQIAAAQKFCSiAhW24p0uAAAECBAgQUABlgAABAgQIECBQmIACWNiGe7oECBAgQIAAAQVQBggQIECAAAEChQkogIVtuKdLgAABAgQIEFAAZYAAAQIECBAgUJiAAljYhnu6BAgQIECAAAEFUAYIECBAgAABAoUJ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81sBDL0IBCjEZzggoAAG8IwSIFC8gPNbAQy9CAQoxGc4IKAABvCMEiBQvIDzWwEMvQgEKMRnOCCgAAbwjBIgULyA81sBDL0IBCjEZzggoAAG8IwSIFC8gPNbAQy9CAQoxGc4IKAABvCMEiBQvIDzWwEMvQgEKMRnOCCgAAbwjBIgULyA81sBDL0IBCjEZzggoAAG8IwSIFC8gPNbAQy9CAQoxGc4IKAABvCMEiBQvIDzWwEMvQgEKMRnOCCgAAbwjBIgULyA81sBDL0IBCjEZzggoAAG8IwSIFC8gPNbAQy9CAQoxGc4IKAABvCMEiBQvIDzWwEMvQgEKMRnOCCgAAbwjBIgULyA81sBDL0IBCjEZzggoAAG8IwSIFC8gPNbAQy9CAQoxGc4IKAABvCMEiBQvIDzWwEMvQgEKMRnOCCgAAbwjBIgULyA81sBDL0IBCjEZzggoAAG8IwSIFC8gPNbAQy9CAQoxGc4IKAABvCMEiBQvIDzWwEMvQgEKMRnOCCgAAbwjBIgULyA81sBDL0IBCjEZzggoAAG8IwSIFC8gPNbAQy9CAQoxGc4IKAABvCMEiBQvIDzWwEMvQgEKMRnOCCgAAbwjBIgULyA81sBDL0IBCjEZzggoAAG8IwSIFC8gPNbAQy9CAQoxGc4IKAABvCMEiBQvIDzWwEMvQgEKMRnOCCgAAbwjBIgULyA81sBDL0IBCjEZzggoAAG8IwSIFC8gPNbAQy9CAQoxGc4IKAABvCMEiBQvIDzWwEMvQgEKMRnOCCgAAbwjBIgULyA81sBDL0IBCjEZzggoAAG8IwSIFC8gPNbAQy9CAQoxGc4IKAABvCMEiBQvIDzWwEMvQgEKMRnOCCgAAbwjBIgULyA81sBDL0IBCjEZzggoAAG8IwSIFC8gPNbAQy9CAQoxGc4IKAABvCMEiBQvIDzWwEMvQgEKMRnOCCgAAbwjBIgULyA81sBDL0IBCjEZzggoAAG8IwSIFC8gPNbAQy9CAQoxGc4IKAABvCMEiBQvIDzWwEMvQgEKMRnOCCgAAbwjBIgULyA81sBDL0IBCjEZzggoAAG8IwSIFC8gPNbAQy9CAQoxGc4IKAABvCMEiBQvIDzWwEMvQgEKMRnOCCgAAbwjBIgULyA81sBDL0IBCjEZzggoAAG8IwSIFC8gPNbAQy9CAQoxGc4IKAABvCMEiBQvIDzWwEMvQgEKMRnOCDQxgIYeLp9G/3Foo/17bE9MAEC3RNwfiuAoXQJUIjPcEBAAQzg1RhVAGtguZRAiwSc3y0tgAsXLky33357evLJJ9M+++yTTjjhhHTFFVekww8/fCh+r776arrooovSLbfckjZv3pxOPfXUdM0116Rx48YNXfPUU0+l2bNnp+9973tp1KhRaebMmam69x577DGsGAvQsJhc1AUBBbALqDu5pQLYG2ePQqDXAs7vlhbAadOmpRkzZqSpU6emLVu2pEsuuSQ98cQTac2aNWm//fbr5KgqdnfffXe68cYb05gxY9KcOXPSyJEj06pVqzr//PXXX09HH310Ovjgg9PixYvThg0b0jnnnJM+/elPpwULFgwriwI0LCYXdUFAAewCqgLYG1SPQiADAed3Swvg9tl5/vnn09ixY9MDDzyQTjrppLRp06Z00EEHpaVLl6ZPfvKTncurdwuPOOKI9PDDD6fjjjsuLV++PJ1++ulp/fr1Q+8KLlmyJF188cWput+ee+65y4gK0C6JXNAlAQWwS7Db3dY7gL1x9igEei3g/B6QArhu3bp02GGHpdWrV6ejjjoq3X///emUU05JL774Ytp///2HcnXooYemCy64IF144YXpsssuS9/+9rfT448/PvTPf/7zn6f3vOc96dFHH01TpkzZZR4FaJdELuiSgALYJVgFsDewHoVAnwWc3wNQAN944410xhlnpI0bN6YHH3ywE6nqnb9Zs2Z1/vbvzT/HHntsOvnkkzt/L/iZz3wm/fKXv0z33Xff0CWvvPJK51fI99xzT5o+ffoO8azu9+Z7VgGaOHFi5x3H0aNH9znOHr4kAQWwN7vtHcDeOHsUAr0WUAAHoABWf+tX/Tq3Kn8TJkzoagGcN29emj9//g45VQB7/dL1eApgbzKgAPbG2aMQ6LWAAtjyAlh9sOPOO+9MK1euTJMmTRrKT7d+BewdwF6/RD3e2wkogL3JhgLYG2ePQqDXAgpgSwvg1q1b09y5c9OyZcvSihUrOn//9+afbR8Cufnmm9PZZ5/d+Udr165N73vf+3b4EEj16d/qAyTVz/XXX58+//nPp1/96ldpr7322mUeBWiXRC7okoAC2CXY7W6rAPbG2aMQ6LWA87ulBfD888/v/J1f9e7fm7/7r/q6l+p7Aauf6lfD1d/yVV8DU/19XlUYq5+HHnqo83+3fQ3M+PHj05VXXpmeffbZ9KlPfSqdd955vgam169Ej1dbQAGsTbZbAwrgbrEZIpC9gALY0gI4YsSInYbrhhtuSOeee27nn237IujqXcA3fxF09b1/236qD4FURbF6F7H68Ef1RdCLFi3yRdDZv3QtUAHsTQYUwN44exQCvRZQAFtaAHsdlLd7PAHKZSfKW4cC2Js9VwB74+xRCPRawPmtAIYyJ0AhPsMBAQUwgFdjVAGsgeVSAi0ScH4rgKG4ClCIz3BAQAEM4NUYVQBrYLmUQIsEnN8KYCiuAhTiMxwQUAADeDVGFcAaWC4l0CIB57cCGIqrAIX4DAcEFMAAXo1RBbAGlksJtEjA+a0AhuIqQCE+wwEBBTCAV2NUAayB5VICLRJwfiuAobgKUIjPcEBAAQzg1RhVAGtguZRAiwSc3wpgKK4CFOIzHBBQAAN4NUYVwBpYLiXQIgHntwIYiqsAhfgMBwQUwABejVEFsAaWSwm0SMD5rQCG4ipAIT7DAQEFMIBXY1QBrIHlUgItEnB+K4ChuApQiM9wQEABDODVGFUAa2C5lECLBJzfCmAorgIU4jMcEFAAA3g1RhXAGlguJdAiAee3AhiKqwCF+AwHBBTAAF6NUQWwBpZLCbRIwPmtAIbiKkAhPsMBAQUwgFdjVAGsgeVSAi0ScH4rgKG4ClCIz3BAQAEM4NUYVQBrYLmUQIsEnN8KYCiuAhTiMxwQUAADeDVGFcAaWC4l0CIB57cCGIqrAIX4DAcEFMAAXo1RBbAGlksJtEjA+a0AhuIqQCE+wwEBBTCAV2NUAayB5VICLRJwfiuAobgKUIjPcEBAAQzg1RhVAGtguZRAiwSc3wpgKK4CFOIzHBBQAAN4NUYVwBpYLiXQIgHntwIYiqsAhfgMBwQUwABejVEFsAaWSwm0SMD5rQCG4ipAIT7DAQEFMIBXY1QBrIHlUgItEnB+K4ChuApQiM9wQEABDODVGFUAa2C5lECLBJzfCmAorgIU4jMcEFAAA3g1RhXAGlguJdAiAee3AhiKqwCF+AwHBBTAAF6NUQWwBpZLCbRIwPmtAIbiKkAhPsMBAQUwgFdjVAGsgeVSAi0ScH4rgKG4ClCIz3BAQAEM4NUYVQBrYLmUQIsEnN8KYCiuAhTiMxwQUAADeDVGFcAaWC4l0CIB57cCGIqrAIX4DAcEFMAAXo1RBbAGlksJtEjA+a0AhuIqQCE+wwEBBTCAV2NUAayB5VICLRJwfiuAobgKUIjPcEBAAQzg1RhVAGtguZRAiwSc3wpgKK4CFOIzHBBQAAN4NUYVwBpYLiXQIgHntwIYiqsAhfgMBwQUwABejVEFsAaWSwm0SMD5rQCG4ipAIT7DAQEFMIBXY1QBrIHlUgItEnB+K4ChuApQiM9wQEABDODVGFUAa2C5lECLBJzfCmAorgIU4jMcEFAAA3g1RhXAGlguJdAiAee3AhiKqwCF+AwHBBTAAF6NUQWwBpZLCbRIwPmtAIbiKkAhPsMBAQUwgFdjVAGsgeVSAi0ScH4rgKG4ClCIz3BAQAEM4NUYVQBrYLmUQIsEnN8KYCiuAhTiMxwQUAADeDVGFcAaWC4l0CIB57cCGIqrAIX4DAcEFMAAXo1RBbAGlksJtEjA+a0AhuIqQCE+wwEBBTCAV2NUAayB5VICLRJwfiuAobgKUIjPcEBAAQzg1RhVAGtguZRAiwSc3wpgKK4CFOIzHBBQAAN4NUYVwBpYLiXQIgHntwIYiqsAhfgMBwQUwABejVEFsAaWSwm0SMD5rQCG4ipAIT7DAQEFMIBXY1QBrIHlUgItEnB+K4ChuApQiM9wQEABDODVGFUAa2C5lECLBJzfCmAorgIU4jMcEFAAA3g1RhXAGlguJdAiAee3AhiKqwCF+AwHBBTAAF6NUQWwBpZLCbRIwPmtAIbiKkAhPsMBAQUwgFdjVAGsgeVSAi0ScH4rgKG4ClCIz3BAQAEM4NUYVQBrYLmUQIsEnN8KYCiuAhTiMxwQUAADeDVGFcAaWC4l0CIB57cCGIqrAIX4DAcEFMAAXo1RBbAGlksJtEjA+a0AhuIqQCE+wwEBBTCAV2NUAayB5VICLRJwfiuAobgKUIjPcEBAAQzg1RhVAGtguZRAiwSc3wpgKK4CFOIzHBBQAAN4NUYVwBpYLiXQIgHntwIYiqsAhfgMBwQUwABejVEFsAaWSwm0SMD5rQCG4ipAIT7DAQEFMIBXY1QBrIHlUgItEnB+K4ChuApQiM9wQEABDODVGFUAa2C5lECLBJzfCmAorgIU4jMcEFAAA3g1RhXAGlguJdAiAed3SwvgypUr0+LFi9MjjzySNmzYkJYtW5bOPPPMoeide+656aabbnpLFE899dR07733Dv3/XnjhhTR37tx01113pZEjR6azzz47feMb30ijRo0adoQFaNhULmxYQAFsGPRtbqcA9sbZoxDotYDzu6UFcPny5WnVqlXpmGOOSZ/4xCd2WgCfe+65dMMNNwxlaq+99krvfOc7h/799OnTO+XxuuuuS6+99lqaNWtWmjp1alq6dOmwcyhAw6ZyYcMCCmDDoApgb0A9CoFMBJzfLS2Ab87PiBEjdloAN27cmO64446dRu0nP/lJOvLII9P3v//99IEPfKBzTfXu4GmnnZaeeeaZNH78+GFFVICGxeSiLggogF1A3cktvQPYG2ePQqDXAs7vAS6AVfnbc889O+/6ffjDH05f+9rX0oEHHtjJ2De/+c100UUXpRdffHEoc1u2bEl77713uvXWW9NZZ501rCwK0LCYXNQFAQWwC6gKYG9QPQqBDASc3wNaAG+55Za07777pkmTJqWf/vSn6ZJLLun8bd/DDz+c3vGOd6QFCxZ0/kZw7dq1b4nh2LFj0/z589Ps2bN3Gs/Nmzen6l/bfqoATZw4MW3atCmNHj06g0hbQikCCmBvdto7gL1x9igEei2gAA5oAdw+SD/72c/S5MmT03e/+910yimn7HYBnDdvXqcgbv+jAPb6pevxFMDeZEAB7I2zRyHQawEFsJACWAXroIMO6vwa+LOf/exu/wrYO4C9fol6vLcTUAB7kw0FsDfOHoVArwUUwEIKYPXBjkMOOaTzoZAzzjgjbfsQyA9+8IPOJ4mrn+985ztp2rRpPgTS61ehx9stAQVwt9hqDymAtckMEGiFgALY0gL48ssvp3Xr1nVCNmXKlHTVVVelk08+OR1wwAGdf1W/pq2+1+/ggw/u/A3gF77whfTSSy+l1atXp+rrYKqf6mtgqq+KWbJkydDXwFSfCPY1MK147Ra/SAWwNxFQAHvj7FEI9FpAAWxpAVyxYkWn8G3/M3PmzHTttdd2vhT6scceS9VXwVRf6fKnf/qn6atf/WoaN27c0Ej1RdBz5sx5yxdBX3311b4IutevQo+3WwIK4G6x1R5SAGuTGSDQCgEFsKUFMJd0CVAuO1HeOhTA3uy5AtgbZ49CoNcCzm8FMJQ5AQrxGQ4IKIABvBqjCmANLJcSaJGA81sBDMVVgEJ8hgMCCmAAr8aoAlgDy6UEWiTg/FYAQ3EVoBCf4YCAAhjAqzGqANbAcimBFgk4vxXAUFwFKMRnOCCgAAbwaowqgDWwXEqgRQLObwUwFFcBCvEZDggogAG8GqMKYA0slxJokYDzWwEMxVWAQnyGAwIKYACvxqgCWAPLpQRaJOD8VgBDcRWgEJ/hgIACGMCrMaoA1sByKYEWCTi/FcBQXAUoxGc4IKAABvBqjCqANbBcSqBFAs5vBTAUVwEK8RkOCCiAAbwaowpgDSyXEmiRgPNbAQzFVYBCfIYDAgpgAK/GqAJYA8ulBFok4PxWAENxFaAQn+GAgAIYwKsxqgDWwHIpgRYJOL8VwFBcBSjEZzggoAAG8GqMKoA1sFxKoEUCzm8FMBRXAQrxGQ4IKIABvBqjCmANLJcSaJGA81sBDMVVgEJ8hgMCCmAAr8aoAlgDy6UEWiTg/FYAQ3EVoBCf4YCAAhjAqzGqANbAcimBFgk4vxXAUFwFKMRnOCCgAAbwaowqgDWwXEqgRQLObwUwFFcBCvFlM6xMZbMV2S1EAcxuSyyIQCMCzm8FMBQkAQrxZTOsAGazFdktRAHMbkssiEAjAs5vBTAUJAEK8WUzrABmsxXZLUQBzG5LLIhAIwLObwUwFCQBCvFlM6wAZrMV2S1EAcxuSyyIQCMCzm8FMBQkAQrxZTOsAGazFdktRAHMbkssiEAjAs5vBTAUJAEK8WUzrABmsxXZLUQBzG5LLIhAIwLObwUwFCQBCvFlM6wAZrMV2S1EAcxuSyyIQCMCzm8FMBQkAQrxZTOsAGazFdktRAHMbkssiEAjAs5vBTAUJAEK8WUzrABmsxXZLUQBzG5LLIhAIwLObwUwFCQBCvFlM6wAZrMV2S1EAcxuSyyIQCMCzm8FMBQkAQrxZTOsAGazFdktRAHMbkssiEAjAs5vBTAUJAEK8WUzrABmsxXZLUQBzG5LLIhAIwLObwUwFCQBCvFlM6wAZrMV2S1EAcxuSyyIQCMCzm8FMBQkAQrxZTOsAGazFdktRAHMbkssiEAjAs5vBTAUJAEK8WUzrABmsxXZLUQBzG5LLIhAIwLObwUwFCQBCvFlM6wAZrMV2S1EAcxuSyyIQCMCzm8FMBQkAQrxZTOsAGazFdktRAHMbkssiEAjAs5vBTAUJAEK8WUzrABmsxXZLUQBzG5LLIhAIwLObwUwFCQBCvFlM6wAZrMV2S1EAcxuSyyIQCMCzm8FMBQkAQrxZTOsAGazFdktRAHMbkssiEAjAs5vBTAUJAEK8WUzrABmsxXZLUQBzG5LLIhAIwLObwUwFCQBCvFlM6wAZrMV2S1EAcxuSyyIQCMCzm8FMBQkAQrxZTOsAGazFdktRAHMbkssiEAjAs5vBTAUJAEK8WUzrABmsxXZLUQBzG5LLIhAIwLObwUwFCQBCvFlM6wAZrMV2f2AHo0AAB3/SURBVC1EAcxuSyyIQCMCzm8FMBQkAQrxZTOsAGazFdktRAHMbkssiEAjAs5vBTAUJAEK8WUzrABmsxXZLUQBzG5LLIhAIwLObwUwFCQBCvFlM6wAZrMV2S1EAcxuSyyIQCMCzm8FMBQkAQrxZTOsAGazFdktRAHMbkssiEAjAs5vBTAUJAEK8WUzrABmsxXZLUQBzG5LLIhAIwLObwUwFCQBCvFlM6wAZrMV2S1EAcxuSyyIQCMCzm8FMBQkAQrxZTOsAGazFdktRAHMbkssiEAjAs5vBTAUJAEK8WUzrABmsxXZLUQBzG5LLIhAIwLObwUwFCQBCvFlM6wAZrMV2S1EAcxuSyyIQCMCzm8FMBQkAQrxZTOsAGazFdktRAHMbkssiEAjAs5vBTAUJAEK8WUzrABmsxXZLUQBzG5LLIhAIwLObwUwFCQBCvFlM6wAZrMV2S1EAcxuSyyIQCMCzm8FMBQkAQrxZTOsAGazFdktRAHMbkssiEAjAs5vBTAUJAEK8WUzrABmsxXZLUQBzG5LLIhAIwLObwUwFCQBCvFlM6wAZrMV2S1EAcxuSyyIQCMCzm8FMBQkAQrxZTOsAGazFdktRAHMbkssiEAjAs5vBTAUJAEK8WUzrABmsxXZLUQBzG5LLIhAIwLObwUwFCQBCvFlM6wAZrMV2S1EAcxuSyyIQCMCzu+WFsCVK1emxYsXp0ceeSRt2LAhLVu2LJ155plDodi6dWu6/PLL0z//8z+njRs3pj/5kz9J1157bTrssMOGrnnhhRfS3Llz01133ZVGjhyZzj777PSNb3wjjRo1atjhEqBhU2V9oQKY9fb0dXEKYF/5PTiBrgk4v1taAJcvX55WrVqVjjnmmPSJT3xihwJ4xRVXpIULF6abbropTZo0KV166aVp9erVac2aNWnvvffuBGr69Omd8njdddel1157Lc2aNStNnTo1LV26dNiBE6BhU2V9oQKY9fb0dXEKYF/5PTiBrgk4v1taAN+ciBEjRrylAFbv/o0fPz5ddNFF6XOf+1zn0k2bNqVx48alG2+8Mc2YMSP95Cc/SUceeWT6/ve/nz7wgQ90rrn33nvTaaedlp555pnO/HB+BGg4SvlfowDmv0f9WqEC2C95j0uguwLO7wEsgD/72c/S5MmT02OPPZaOPvrooQR98IMf7Pz76te83/zmNzsF8cUXXxz651u2bOm8O3jrrbems846a6fJ27x5c6r+te2nCtDEiRM7BXP06NHdTau7d01AAewabetvrAC2fgs9AQI7FVAAB7AAPvTQQ52/+Vu/fn36vd/7vaGN//M///NUvVv4rW99Ky1YsKDz6+G1a9e+JRhjx45N8+fPT7Nnz95pYObNm9f559v/KIDt/k8YBbDd+9fN1SuA3dR1bwL9E1AAFcBaBdA7gP17sXbzkRXAbuq2+94KYLv3z+oJvJ2AAjiABbCbvwLePkgCNBj/4aIADsY+duNZKIDdUHVPAv0XcH4PYAHc9iGQ6gMg1d/5VT/VRle/3t3+QyA/+MEPOp8krn6+853vpGnTpvkQSP9flz1fgQLYc/LWPKAC2JqtslACtQQUwJYWwJdffjmtW7eus9lTpkxJV111VTr55JPTAQcckA455JBUfQ3MokWL3vI1MD/60Y92+BqY5557Li1ZsmToa2CqTwT7Gphar6GBuFgBHIht7MqTUAC7wuqmBPouoAC2tACuWLGiU/i2/5k5c2bnXb5tXwR9/fXXd74I+sQTT0zXXHNNeu973zs0Un0R9Jw5c97yRdBXX321L4Lu+8uy9wtQAHtv3pZHVADbslPWSaCegALY0gJYb5u7d7UAdc+2l3dWAHup3a7HUgDbtV9WS2C4As5vBXC4WdnpdQIU4stmWAHMZisspAEBpbUBRLcYeAHntwIYCrkAhfiyGVYAs9kKC2lAQAFsANEtBl7A+a0AhkIuQCG+bIYVwGy2wkIaEFAAG0B0i4EXcH4rgKGQC1CIL5thBTCbrbCQBgQUwAYQ3WLgBZzfCmAo5AIU4stmWAHMZisspAEBBbABRLcYeAHntwIYCrkAhfiyGVYAs9kKC2lAQAFsANEtBl7A+a0AhkIuQCG+bIYVwGy2wkIaEFAAG0B0i4EXcH4rgKGQC1CIL5thBTCbrbCQBgQUwAYQ3WLgBZzfCmAo5AIU4stmWAHMZisspAEBBbABRLcYeAHntwIYCrkAhfiyGVYAs9kKC2lAQAFsANEtBl7A+a0AhkIuQCG+bIYVwGy2wkIaEFAAG0B0i4EXcH4rgKGQC1CIL5thBTCbrbCQBgQUwAYQ3WLgBZzfCmAo5AIU4stmWAHMZisspAEBBbABRLcYeAHntwIYCrkAhfiyGVYAs9kKC2lAQAFsANEtBl7A+a0AhkIuQCG+bIYVwGy2wkIaEFAAG0B0i4EXcH4rgKGQC1CIL5thBTCbrbCQBgQUwAYQ3WLgBZzfCmAo5AIU4stmWAHMZisspAEBBbABRLcYeAHntwIYCrkAhfiyGVYAs9kKC2lAQAFsANEtBl7A+a0AhkIuQCG+bIYVwGy2wkIaEFAAG0B0i4EXcH4rgKGQC1CIL5thBTCbrbCQBgQUwAYQ3WLgBZzfCmAo5AIU4stmWAHMZisspAEBBbABRLcYeAHntwIYCrkAhfiyGVYAs9kKC2lAQAFsANEtBl7A+a0AhkIuQCG+bIYVwGy2wkIaEFAAG0B0i4EXcH4rgKGQC1CIL5thBTCbrbCQBgQUwAYQ3WLgBZzfCmAo5AIU4stmWAHMZisspAEBBbABRLcYeAHntwIYCrkAhfiyGVYAs9kKC2lAQAFsANEtBl7A+a0AhkIuQCG+bIYVwGy2wkIaEFAAG0B0i4EXcH4rgKGQC1CIL5thBTCbrbCQBgQUwAYQ3WLgBZzfCmAo5AIU4stmWAHMZisspAEBBbABRLcYeAHntwIYCrkAhfiyGVYAs9kKC2lAQAFsANEtBl7A+a0AhkIuQCG+bIYVwGy2wkIaEFAAG0B0i4EXcH4rgKGQC1CIL5thBTCbrbCQBgQUwAYQ3WLgBZzfCmAo5AIU4stmWAHMZisspAEBBbABRLcYeAHntwIYCrkAhfiyGVYAs9kKC2lAQAFsANEtBl7A+a0AhkIuQCG+bIYVwGy2wkIaEFAAG0B0i4EXcH4rgKGQC1CIL5thBTCbrbCQBgQUwAYQ3WLgBZzfCmAo5AIU4stmWAHMZisspAEBBbABRLcYeAHntwIYCrkAhfiyGVYAs9kKC2lAQAFsANEtBl7A+a0AhkIuQCG+bIYVwGy2wkIaEFAAG0B0i4EXcH4rgKGQC1CIL5thBTCbrbCQBgQUwAYQ3WLgBZzfCmAo5AIU4stmWAHMZisspAEBBbABRLcYeAHntwIYCrkAhfiyGVYAs9kKC2lAQAFsANEtBl7A+a0AhkIuQCG+bIYVwGy2wkIaEFAAG0B0i4EXcH4rgKGQC1CIL5thBTCbrbCQBgQUwAYQ3WLgBZzfCmAo5AIU4stmWAHMZisspAEBBbABRLcYeAHntwIYCrkAhfiyGVYAs9kKC2lAQAFsANEtBl7A+a0AhkIuQCG+bIYVwGy2wkIaEFAAG0B0i4EXcH4rgKGQC1CIL5thBTCbrbCQBgQUwAYQ3WLgBZzfCmAo5AIU4stmWAHMZisspAEBBbABRLcYeAHntwIYCrkAhfiyGVYAs9kKC2lAQAFsANEtBl7A+a0AhkIuQCG+bIYVwGy2wkIaEFAAG0B0i4EXcH4rgKGQC1CIL5thBTCbrbCQBgQUwAYQ3WLgBZzfCmAo5AIU4stmWAHMZisspAEBBbABRLcYeAHntwIYCrkAhfiyGVYAs9kKC2lAQAFsANEtBl7A+a0AhkIuQCG+bIYVwGy2wkIaEFAAG0B0i4EXcH4rgKGQC1CIL5thBTCbrbCQBgQUwAYQ3WLgBZzfCmAo5AIU4stmWAHMZisspAEBBbABRLcYeAHntwIYCrkAhfiyGVYAs9kKC2lAQAFsANEtBl7A+T3ABXDevHlp/vz5bwnx4Ycfnp588snO/+/VV19NF110UbrlllvS5s2b06mnnpquueaaNG7cuGEHX4CGTZX1hQpg1ttjcTUFFMCaYC4vUsD5PeAF8Lbbbkvf/e53h8K9xx57pN/93d/t/PvZs2enu+++O914441pzJgxac6cOWnkyJFp1apVw34xCNCwqbK+UAHMenssrqaAAlgTzOVFCji/B7wA3nHHHenxxx/fIdybNm1KBx10UFq6dGn65Cc/2fnn1TuDRxxxRHr44YfTcccdN6wXhAANiyn7ixTA7LfIAmsIKIA1sFxarIDze8AL4OLFizvv7u29997p+OOPTwsXLkyHHHJIuv/++9Mpp5ySXnzxxbT//vsPvQAOPfTQdMEFF6QLL7xwWC8KARoWU/YXKYDZb5EF1hBQAGtgubRYAef3ABfA5cuXp5dffjlVf/e3YcOGzt8D/td//Vd64okn0l133ZVmzZrV+du/N/8ce+yx6eSTT05XXHHFTl8U1fVvnqkCNHHixFS9ozh69OhiX0htf+IKYNt30PrfLKAAygOBXQsogANcALff/o0bN6bqHb6rrroq7bPPPrtVAHf2wZLqcRTAXb/Ycr5CAcx5d6ytroACWFfM9SUKKIAFFcAq4FOnTk0f+chH0kc/+tHd+hWwdwAH8z8mFMDB3NdSn5UCWOrOe951BBTAggpg9evg6u//qnfxZs6c2fkQyM0335zOPvvsTmbWrl2b3ve+9/kQSJ1X0IBcqwAOyEZ6Gh0BBVAQCOxaQAEc4AL4uc99Ln384x/v/Np3/fr16fLLL+98InjNmjWd8ld9Dcw999zT+RqY6u/35s6d20nMQw89tOvk/O8VAjRsqqwvVACz3h6LqymgANYEc3mRAs7vAS6AM2bMSCtXrkz//d//3Sl8J554Yvq7v/u7NHny5E7Yt30RdPUu4Ju/CPrggw8e9otBgIZNlfWFCmDW22NxNQUUwJpgLi9SwPk9wAWwF4kWoF4od/8xFMDuG3uE3gkogL2z9kjtFXB+K4Ch9ApQiC+bYQUwm62wkAYEFMAGEN1i4AWc3wpgKOQCFOLLZlgBzGYrLKQBAQWwAUS3GHgB57cCGAq5AIX4shlWALPZCgtpQEABbADRLQZewPmtAIZCLkAhvmyGFcBstsJCGhBQABtAdIuBF3B+K4ChkAtQiC+bYQUwm62wkAYEFMAGEN1i4AWc3wpgKOQCFOLLZlgBzGYrLKQBAQWwAUS3GHgB57cCGAq5AIX4shlWALPZCgtpQEABbADRLQZewPmtAIZCLkAhvmyGFcBstsJCGhBQABtAdIuBF3B+K4ChkAtQiC+bYQUwm62wkAYEFMAGEN1i4AWc3wpgKOQCFOLLZlgBzGYrLKQBAQWwAUS3GHgB57cCGAq5AIX4shlWALPZCgtpQEABbADRLQZewPmtAIZCLkAhvmyGFcBstsJCGhBQABtAdIuBF3B+K4ChkAtQiC+bYQUwm62wkAYEFMAGEN1i4AWc3wpgKOQCFOLLZlgBzGYrLKQBAQWwAUS3GHgB57cCGAq5AIX4shlWALPZCgtpQEABbADRLQZewPmtAIZCLkAhvmyGFcBstsJCGhBQABtAdIuBF3B+K4ChkAtQiC+bYQUwm62wkAYEFMAGEN1i4AWc3wpgKOQCFOLLZlgBzGYrLKRQAaW10I3v49N2fiuAofgJUIgvm2EFMJutsJBCBRTAQje+j0/b+a0AhuInQDvyKVOhSBkmUKSAAljktvf1STu/FcBQAAVIAQwFyDABAh0BBVAQei3g/FYAQ5kTIAUwFCDDBAgogDLQFwHntwIYCp4AKYChABkmQEABlIG+CDi/FcBQ8ARIAQwFyDABAgqgDPRFwPmtAIaCJ0AKYChAhgkQUABloC8Czm8FMBQ8AVIAQwEyTICAAigDfRFwfiuAoeAJkAIYCpBhAgQUQBnoi4DzWwEMBU+AFMBQgAwTIKAAykBfBJzfCmAoeAKkAIYCZJgAAQVQBvoi4PxWAEPBEyAFMBQgwwQIKIAy0BcB57cCGAqeACmAoQAZJkBAAZSBvgg4vxXAUPAESAEMBcgwAQIKoAz0RcD5rQCGgidACmAoQIYJEFAAZaAvAs5vBTAUPAFSAEMBMkyAgAIoA30RcH4rgKHgCZACGAqQYQIEFEAZ6IuA81sBDAVPgBTAUIAMEyCgAMpAXwSc3wpgKHgCpACGAmSYAAEFUAb6IuD8VgBDwRMgBTAUIMMECCiAMtAXAee3AhgKngApgKEAGSZAQAGUgb4IOL8VwFDwBEgBDAXIMAECCqAM9EXA+a0AhoInQApgKECGCRBQAGWgLwLObwUwFDwBUgBDATJMgIACKAN9EXB+K4Ch4AmQAhgKkGECBBRAGeiLgPNbAQwFT4AUwFCADBMgoADKQF8EnN8KYCh4AqQAhgJkmAABBVAG+iLg/FYAQ8ETIAUwFCDDBAgogDLQFwHntwIYCp4AKYChABkmQEABlIG+CDi/FcBQ8ARIAQwFyDABAgqgDPRFwPmtAIaCJ0AKYChAhgkQUABloC8Czm8FMBQ8AVIAQwEyTICAAigDfRFwfiuAoeAJkAIYCpBhAgQUQBnoi4DzWwEMBU+AFMBQgAwTINBagV8s+lhr127hKTm/FcDQ60CAFMBQgAwTINBaAQWwtVvXWbjzWwEMJViAFMBQgAwTINBaAQWwtVunAP7v1o3YunXr1nZvY/9WrwAqgP1Ln0cmQKCfAgpgP/Xjj+389g5gKEUCpACGAmSYAIHWCiiArd067wB6BzAeXgVQAYynyB0IEGijgALYxl37vzU7v70DGEqwACmAoQAZJkCgtQIKYGu3zjuA3gGMh7fbBfDdX7w7vkh3IECAAIHGBRTAxkl7esNun989fTK7+WDFfwjkn/7pn9LixYvTs88+m/7wD/8w/cM//EM69thjh8XZ7QApgMPaBhcRIECg5wIKYM/JG33Abp/fjS62SzcrugB+61vfSuecc05asmRJ+uM//uP09a9/Pd16661p7dq1aezYsbsk73aAFMBdboELCBAg0BeBNhbANp4p3XLu9vndl1DWfNCiC2BV+qZOnZr+8R//scP2xhtvpIkTJ6a5c+emL37xi7uk7HaA2vhi3SWaCwgQIDAAAt0qJt2kaeOZ0i3nbp/f3dzHpu5dbAH8zW9+k/bdd9902223pTPPPHPIc+bMmWnjxo3pzjvv3MF48+bNqfrXtp9NmzalQw45JD399NNp9OjRTe3J0H2Ouvy+xu/phgQIECBAoC0CT8w/tStLrQpg9YZPdd6PGTOmK4+R+02LLYDr169P73rXu9JDDz2Ujj/++KF9+sIXvpAeeOCB9B//8R877N28efPS/Pnzc99T6yNAgAABAgSGIVC9gTNhwoRhXDl4lyiANQrg9u8AVr8yfuGFF9KBBx6YRowYMXjp6NIz2vbfvLr1zmmXll3kbe1VO7bdPrVjn6pV2qs89qr6H0F76aWX0vjx49PIkSPzWFSPV1FsAdydXwH3eG8G9uH87UV7ttZetWOv7FM79mlbAax+5Vj9CVE3/nSoPRJW2m+BYgtgBV99CKT6ypfqq1+qn+odvepv+ubMmTOsD4H0e/Pa+vgOq/bsnL1qx17Zp3bskwLYnn0qYaVFF8Dqa2CqD31cd911nSJYfQ3Mv/7rv6Ynn3wyjRs3roT978tzdFj1hX23HtRe7RZbz4fsU8/Jd/sB7dVu0xlsWKDoAlhZVl8Bs+2LoI8++uh09dVXd94Z9NM9gepvKRcuXJi+9KUvpb322qt7D+TOYQF7FSbsyQ3sU0+YG3kQe9UIo5s0IFB8AWzA0C0IECBAgAABAq0SUABbtV0WS4AAAQIECBCICyiAcUN3IECAAAECBAi0SkABbNV2WSwBAgQIECBAIC6gAMYN3YEAAQIECBAg0CoBBbBV25X/YqtP995+++2dr9LZZ5990gknnJCuuOKKdPjhh//Wxd96663p0ksvTb/4xS/SYYcd1pk57bTT8n/CLV7h7uzVjTfemGbNmvWWZ119kvvVV19tsUTeS7/22mtT9a/qtVH9/MEf/EG67LLL0vTp09924V5P/dnTunvl9dSfffKo/19AAZSERgWmTZuWZsyYkaZOnZq2bNmSLrnkkvTEE0+kNWvWpP3222+nj1X97zGfdNJJna+GOf3009PSpUs7BfDRRx9NRx11VKPrc7P/E9idvaoOrL/5m79Ja9euHbpR9T+D6Hszu5esu+66K73jHe/o/Bej6n++6qabbup8ddVjjz3WKYPb/3g9dW8vdnXnunvl9bQrUf+8mwIKYDd13Ts9//zzaezYsemBBx7olLyd/fzFX/xF+vWvf53+7d/+begfH3fccan6XsYlS5ZQ7JHAcPaqOrAuuOCCtHHjxh6tysPsTOCAAw7olMC//uu/3uEfez3llZnftldeT3ntVWmrUQBL2/EeP99169Z13rlYvXr1276bV/3P7/3t3/5tp1hs+7n88svTHXfckX74wx/2eMXlPtxw9qo6sM4777z0rne9q/M/nfhHf/RHacGCBTt9J6pcye4989dffz1Vv96t/heMqncAjzzyyB0ezOupe/517jycvfJ6qiPq2qYFFMCmRd1vSKAqCGeccUbn3aIHH3zwbWX23HPPzq+1/vIv/3LommuuuSbNnz8/Pffcc0R7IDDcvXr44YfTf/7nf6b3v//9nf8x+7//+79PK1euTD/+8Y/ThAkTerDSMh+i+i9Qxx9/fOdvLUeNGtX5M4m3+xtZr6f+ZqTOXnk99XevSn90BbD0BHTx+c+ePTstX768U/5+WzlwYHVxE4Z56+Hu1fa3e+2119IRRxzRKe9f/epXh/loLqsr8Jvf/CY99dRTndJ92223pX/5l3/p/FnFzt4B9Hqqq9vs9XX2yuupWXt3qyegANbzcvUwBebMmZPuvPPOzrtDkyZN+q1TfmU1TNQuXVZnr3a2hD/7sz9Le+yxR7r55pu7tEK33V7gIx/5SJo8eXK67rrrdsDxesorL79tr7ye8tqr0lajAJa2411+vtWnFOfOnZuWLVuWVqxY0fn7v139VH+0/sorr6TqE3Tbfqqvj6l+zehDILvS2/1/vjt7tf2jVX/nVH0Stfp15FVXXbX7izFZS+DDH/5wqope9Tdk2/94PdWi7PrFv22vvJ66zu8BfouAAigejQqcf/75nb9Pqt79e/N3/40ZM6bzvYDVzznnnNP5EEH1tS/VT/W1FR/84AfTokWL0sc+9rF0yy23dD5Y4GtgGt2aHW62O3v1la98JVWf0P793//9zt92Vp9ErT6s88gjj+z015HdfQZl3P1LX/pS5zv/qsL30ksvDX1N0n333Zc++tGPej1lFIO6e+X1lNHmFbgUBbDATe/mU66+E25nPzfccEM699xzO//oQx/6UHr3u9/9lncvqk82fvnLXx76Iugrr7zSF0F3c6OqLwHdjb268MILO1/0/eyzz6Z3vvOd6Zhjjklf+9rX0pQpU7q82nJvX33Vy7//+7+nDRs2pOq/SFXvjF988cWd8uf1lFcu6u6V11Ne+1faahTA0nbc8yVAgAABAgSKF1AAi48AAAIECBAgQKA0AQWwtB33fAkQIECAAIHiBRTA4iMAgAABAgQIEChNQAEsbcc9XwIECBAgQKB4AQWw+AgAIECAAAECBEoTUABL23HPlwABAgQIECheQAEsPgIACBAgQIAAgdIEFMDSdtzzJUCAAAECBIoXUACLjwAAAgQIECBAoDQBBbC0Hfd8CRAgQIAAgeIFFMDiIwCAAAECBAgQKE1AASxtxz1fAgQIECBAoHgBBbD4CAAgQIAAAQIEShNQAEvbcc+XAAECBAgQKF5AASw+AgAIECBAgACB0gQUwNJ23PMlQIAAAQIEihdQAIuPAAACBAgQIECgNAEFsLQd93wJECBAgACB4gUUwOIjAIAAAQIECBAoTUABLG3HPV8CBAgQIECgeAEFsPgIACBAgAABAgRKE1AAS9txz5cAAQIECBAoXkABLD4CAAgQIECAAIHSBBTA0nbc8yVAgAABAgSKF1AAi48AAAIECBAgQKA0AQWwtB33fAkQIECAAIHiBRTA4iMAgAABAgQIEChNQAEsbcc9XwIECBAgQKB4AQWw+AgAIECAAAECBEoTUABL23HPlwABAgQIECheQAEsPgIACBAgQIAAgdIE/h/9bp2MKM5hqAAAAABJRU5ErkJggg==\\\" width=\\\"640\\\">\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.HTML object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(array([  4.,  32., 134., 253., 205.,  95.,  33.,   9.,   1.,   2.]),\\n\",\n       \" array([1.7415352 , 1.95265053, 2.16376586, 2.3748812 , 2.58599653,\\n\",\n       \"        2.79711186, 3.0082272 , 3.21934253, 3.43045786, 3.6415732 ,\\n\",\n       \"        3.85268853]),\\n\",\n       \" <BarContainer object of 10 artists>)\"\n      ]\n     },\n     \"execution_count\": 48,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# scores used by SGDClassifier\\n\",\n    \"import matplotlib.pyplot as plt\\n\",\n    \"\\n\",\n    \"y_scores = sgd_clf.decision_function(df[features])\\n\",\n    \"plt.hist(y_scores) # histogram of scores\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 49,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1.0\"\n      ]\n     },\n     \"execution_count\": 49,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# prediction using default threshold ... \\n\",\n    \"threshold = 0\\n\",\n    \"(y_scores > threshold).mean()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 50,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1.0\"\n      ]\n     },\n     \"execution_count\": 50,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# ... gives default model prediction\\n\",\n    \"ypred = sgd_clf.predict(df[features])\\n\",\n    \"ypred.mean()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 51,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1.0\"\n      ]\n     },\n     \"execution_count\": 51,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# increasing threshold means more zeros are predicted\\n\",\n    \"threshold = 1\\n\",\n    \"(y_scores > threshold).mean()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 52,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/javascript\": [\n       \"/* Put everything inside the global mpl namespace */\\n\",\n       \"/* global mpl */\\n\",\n       \"window.mpl = {};\\n\",\n       \"\\n\",\n       \"mpl.get_websocket_type = function () {\\n\",\n       \"    if (typeof WebSocket !== 'undefined') {\\n\",\n       \"        return WebSocket;\\n\",\n       \"    } else if (typeof MozWebSocket !== 'undefined') {\\n\",\n       \"        return MozWebSocket;\\n\",\n       \"    } else {\\n\",\n       \"        alert(\\n\",\n       \"            'Your browser does not have WebSocket support. ' +\\n\",\n       \"                'Please try Chrome, Safari or Firefox ≥ 6. ' +\\n\",\n       \"                'Firefox 4 and 5 are also supported but you ' +\\n\",\n       \"                'have to enable WebSockets in about:config.'\\n\",\n       \"        );\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\\n\",\n       \"    this.id = figure_id;\\n\",\n       \"\\n\",\n       \"    this.ws = websocket;\\n\",\n       \"\\n\",\n       \"    this.supports_binary = this.ws.binaryType !== undefined;\\n\",\n       \"\\n\",\n       \"    if (!this.supports_binary) {\\n\",\n       \"        var warnings = document.getElementById('mpl-warnings');\\n\",\n       \"        if (warnings) {\\n\",\n       \"            warnings.style.display = 'block';\\n\",\n       \"            warnings.textContent =\\n\",\n       \"                'This browser does not support binary websocket messages. ' +\\n\",\n       \"                'Performance may be slow.';\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    this.imageObj = new Image();\\n\",\n       \"\\n\",\n       \"    this.context = undefined;\\n\",\n       \"    this.message = undefined;\\n\",\n       \"    this.canvas = undefined;\\n\",\n       \"    this.rubberband_canvas = undefined;\\n\",\n       \"    this.rubberband_context = undefined;\\n\",\n       \"    this.format_dropdown = undefined;\\n\",\n       \"\\n\",\n       \"    this.image_mode = 'full';\\n\",\n       \"\\n\",\n       \"    this.root = document.createElement('div');\\n\",\n       \"    this.root.setAttribute('style', 'display: inline-block');\\n\",\n       \"    this._root_extra_style(this.root);\\n\",\n       \"\\n\",\n       \"    parent_element.appendChild(this.root);\\n\",\n       \"\\n\",\n       \"    this._init_header(this);\\n\",\n       \"    this._init_canvas(this);\\n\",\n       \"    this._init_toolbar(this);\\n\",\n       \"\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    this.waiting = false;\\n\",\n       \"\\n\",\n       \"    this.ws.onopen = function () {\\n\",\n       \"        fig.send_message('supports_binary', { value: fig.supports_binary });\\n\",\n       \"        fig.send_message('send_image_mode', {});\\n\",\n       \"        if (fig.ratio !== 1) {\\n\",\n       \"            fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\\n\",\n       \"        }\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onload = function () {\\n\",\n       \"        if (fig.image_mode === 'full') {\\n\",\n       \"            // Full images could contain transparency (where diff images\\n\",\n       \"            // almost always do), so we need to clear the canvas so that\\n\",\n       \"            // there is no ghosting.\\n\",\n       \"            fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\\n\",\n       \"        }\\n\",\n       \"        fig.context.drawImage(fig.imageObj, 0, 0);\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onunload = function () {\\n\",\n       \"        fig.ws.close();\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.ws.onmessage = this._make_on_message_function(this);\\n\",\n       \"\\n\",\n       \"    this.ondownload = ondownload;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_header = function () {\\n\",\n       \"    var titlebar = document.createElement('div');\\n\",\n       \"    titlebar.classList =\\n\",\n       \"        'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\\n\",\n       \"    var titletext = document.createElement('div');\\n\",\n       \"    titletext.classList = 'ui-dialog-title';\\n\",\n       \"    titletext.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'width: 100%; text-align: center; padding: 3px;'\\n\",\n       \"    );\\n\",\n       \"    titlebar.appendChild(titletext);\\n\",\n       \"    this.root.appendChild(titlebar);\\n\",\n       \"    this.header = titletext;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_canvas = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var canvas_div = (this.canvas_div = document.createElement('div'));\\n\",\n       \"    canvas_div.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'border: 1px solid #ddd;' +\\n\",\n       \"            'box-sizing: content-box;' +\\n\",\n       \"            'clear: both;' +\\n\",\n       \"            'min-height: 1px;' +\\n\",\n       \"            'min-width: 1px;' +\\n\",\n       \"            'outline: 0;' +\\n\",\n       \"            'overflow: hidden;' +\\n\",\n       \"            'position: relative;' +\\n\",\n       \"            'resize: both;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    function on_keyboard_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.key_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keydown',\\n\",\n       \"        on_keyboard_event_closure('key_press')\\n\",\n       \"    );\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keyup',\\n\",\n       \"        on_keyboard_event_closure('key_release')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    this._canvas_extra_style(canvas_div);\\n\",\n       \"    this.root.appendChild(canvas_div);\\n\",\n       \"\\n\",\n       \"    var canvas = (this.canvas = document.createElement('canvas'));\\n\",\n       \"    canvas.classList.add('mpl-canvas');\\n\",\n       \"    canvas.setAttribute('style', 'box-sizing: content-box;');\\n\",\n       \"\\n\",\n       \"    this.context = canvas.getContext('2d');\\n\",\n       \"\\n\",\n       \"    var backingStore =\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        this.context.webkitBackingStorePixelRatio ||\\n\",\n       \"        this.context.mozBackingStorePixelRatio ||\\n\",\n       \"        this.context.msBackingStorePixelRatio ||\\n\",\n       \"        this.context.oBackingStorePixelRatio ||\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        1;\\n\",\n       \"\\n\",\n       \"    this.ratio = (window.devicePixelRatio || 1) / backingStore;\\n\",\n       \"    if (this.ratio !== 1) {\\n\",\n       \"        fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var rubberband_canvas = (this.rubberband_canvas = document.createElement(\\n\",\n       \"        'canvas'\\n\",\n       \"    ));\\n\",\n       \"    rubberband_canvas.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    var resizeObserver = new ResizeObserver(function (entries) {\\n\",\n       \"        var nentries = entries.length;\\n\",\n       \"        for (var i = 0; i < nentries; i++) {\\n\",\n       \"            var entry = entries[i];\\n\",\n       \"            var width, height;\\n\",\n       \"            if (entry.contentBoxSize) {\\n\",\n       \"                if (entry.contentBoxSize instanceof Array) {\\n\",\n       \"                    // Chrome 84 implements new version of spec.\\n\",\n       \"                    width = entry.contentBoxSize[0].inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize[0].blockSize;\\n\",\n       \"                } else {\\n\",\n       \"                    // Firefox implements old version of spec.\\n\",\n       \"                    width = entry.contentBoxSize.inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize.blockSize;\\n\",\n       \"                }\\n\",\n       \"            } else {\\n\",\n       \"                // Chrome <84 implements even older version of spec.\\n\",\n       \"                width = entry.contentRect.width;\\n\",\n       \"                height = entry.contentRect.height;\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            // Keep the size of the canvas and rubber band canvas in sync with\\n\",\n       \"            // the canvas container.\\n\",\n       \"            if (entry.devicePixelContentBoxSize) {\\n\",\n       \"                // Chrome 84 implements new version of spec.\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'width',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].inlineSize\\n\",\n       \"                );\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'height',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].blockSize\\n\",\n       \"                );\\n\",\n       \"            } else {\\n\",\n       \"                canvas.setAttribute('width', width * fig.ratio);\\n\",\n       \"                canvas.setAttribute('height', height * fig.ratio);\\n\",\n       \"            }\\n\",\n       \"            canvas.setAttribute(\\n\",\n       \"                'style',\\n\",\n       \"                'width: ' + width + 'px; height: ' + height + 'px;'\\n\",\n       \"            );\\n\",\n       \"\\n\",\n       \"            rubberband_canvas.setAttribute('width', width);\\n\",\n       \"            rubberband_canvas.setAttribute('height', height);\\n\",\n       \"\\n\",\n       \"            // And update the size in Python. We ignore the initial 0/0 size\\n\",\n       \"            // that occurs as the element is placed into the DOM, which should\\n\",\n       \"            // otherwise not happen due to the minimum size styling.\\n\",\n       \"            if (width != 0 && height != 0) {\\n\",\n       \"                fig.request_resize(width, height);\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    });\\n\",\n       \"    resizeObserver.observe(canvas_div);\\n\",\n       \"\\n\",\n       \"    function on_mouse_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.mouse_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousedown',\\n\",\n       \"        on_mouse_event_closure('button_press')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseup',\\n\",\n       \"        on_mouse_event_closure('button_release')\\n\",\n       \"    );\\n\",\n       \"    // Throttle sequential mouse events to 1 every 20ms.\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousemove',\\n\",\n       \"        on_mouse_event_closure('motion_notify')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseenter',\\n\",\n       \"        on_mouse_event_closure('figure_enter')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseleave',\\n\",\n       \"        on_mouse_event_closure('figure_leave')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener('wheel', function (event) {\\n\",\n       \"        if (event.deltaY < 0) {\\n\",\n       \"            event.step = 1;\\n\",\n       \"        } else {\\n\",\n       \"            event.step = -1;\\n\",\n       \"        }\\n\",\n       \"        on_mouse_event_closure('scroll')(event);\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    canvas_div.appendChild(canvas);\\n\",\n       \"    canvas_div.appendChild(rubberband_canvas);\\n\",\n       \"\\n\",\n       \"    this.rubberband_context = rubberband_canvas.getContext('2d');\\n\",\n       \"    this.rubberband_context.strokeStyle = '#000000';\\n\",\n       \"\\n\",\n       \"    this._resize_canvas = function (width, height, forward) {\\n\",\n       \"        if (forward) {\\n\",\n       \"            canvas_div.style.width = width + 'px';\\n\",\n       \"            canvas_div.style.height = height + 'px';\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    // Disable right mouse context menu.\\n\",\n       \"    this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\\n\",\n       \"        event.preventDefault();\\n\",\n       \"        return false;\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    function set_focus() {\\n\",\n       \"        canvas.focus();\\n\",\n       \"        canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    window.setTimeout(set_focus, 100);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'mpl-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var button = (fig.buttons[name] = document.createElement('button'));\\n\",\n       \"        button.classList = 'mpl-widget';\\n\",\n       \"        button.setAttribute('role', 'button');\\n\",\n       \"        button.setAttribute('aria-disabled', 'false');\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"\\n\",\n       \"        var icon_img = document.createElement('img');\\n\",\n       \"        icon_img.src = '_images/' + image + '.png';\\n\",\n       \"        icon_img.srcset = '_images/' + image + '_large.png 2x';\\n\",\n       \"        icon_img.alt = tooltip;\\n\",\n       \"        button.appendChild(icon_img);\\n\",\n       \"\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fmt_picker = document.createElement('select');\\n\",\n       \"    fmt_picker.classList = 'mpl-widget';\\n\",\n       \"    toolbar.appendChild(fmt_picker);\\n\",\n       \"    this.format_dropdown = fmt_picker;\\n\",\n       \"\\n\",\n       \"    for (var ind in mpl.extensions) {\\n\",\n       \"        var fmt = mpl.extensions[ind];\\n\",\n       \"        var option = document.createElement('option');\\n\",\n       \"        option.selected = fmt === mpl.default_extension;\\n\",\n       \"        option.innerHTML = fmt;\\n\",\n       \"        fmt_picker.appendChild(option);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\\n\",\n       \"    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\\n\",\n       \"    // which will in turn request a refresh of the image.\\n\",\n       \"    this.send_message('resize', { width: x_pixels, height: y_pixels });\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_message = function (type, properties) {\\n\",\n       \"    properties['type'] = type;\\n\",\n       \"    properties['figure_id'] = this.id;\\n\",\n       \"    this.ws.send(JSON.stringify(properties));\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_draw_message = function () {\\n\",\n       \"    if (!this.waiting) {\\n\",\n       \"        this.waiting = true;\\n\",\n       \"        this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    var format_dropdown = fig.format_dropdown;\\n\",\n       \"    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\\n\",\n       \"    fig.ondownload(fig, format);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_resize = function (fig, msg) {\\n\",\n       \"    var size = msg['size'];\\n\",\n       \"    if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\\n\",\n       \"        fig._resize_canvas(size[0], size[1], msg['forward']);\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\\n\",\n       \"    var x0 = msg['x0'] / fig.ratio;\\n\",\n       \"    var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\\n\",\n       \"    var x1 = msg['x1'] / fig.ratio;\\n\",\n       \"    var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\\n\",\n       \"    x0 = Math.floor(x0) + 0.5;\\n\",\n       \"    y0 = Math.floor(y0) + 0.5;\\n\",\n       \"    x1 = Math.floor(x1) + 0.5;\\n\",\n       \"    y1 = Math.floor(y1) + 0.5;\\n\",\n       \"    var min_x = Math.min(x0, x1);\\n\",\n       \"    var min_y = Math.min(y0, y1);\\n\",\n       \"    var width = Math.abs(x1 - x0);\\n\",\n       \"    var height = Math.abs(y1 - y0);\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.clearRect(\\n\",\n       \"        0,\\n\",\n       \"        0,\\n\",\n       \"        fig.canvas.width / fig.ratio,\\n\",\n       \"        fig.canvas.height / fig.ratio\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\\n\",\n       \"    // Updates the figure title.\\n\",\n       \"    fig.header.textContent = msg['label'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_cursor = function (fig, msg) {\\n\",\n       \"    var cursor = msg['cursor'];\\n\",\n       \"    switch (cursor) {\\n\",\n       \"        case 0:\\n\",\n       \"            cursor = 'pointer';\\n\",\n       \"            break;\\n\",\n       \"        case 1:\\n\",\n       \"            cursor = 'default';\\n\",\n       \"            break;\\n\",\n       \"        case 2:\\n\",\n       \"            cursor = 'crosshair';\\n\",\n       \"            break;\\n\",\n       \"        case 3:\\n\",\n       \"            cursor = 'move';\\n\",\n       \"            break;\\n\",\n       \"    }\\n\",\n       \"    fig.rubberband_canvas.style.cursor = cursor;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_message = function (fig, msg) {\\n\",\n       \"    fig.message.textContent = msg['message'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_draw = function (fig, _msg) {\\n\",\n       \"    // Request the server to send over a new figure.\\n\",\n       \"    fig.send_draw_message();\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\\n\",\n       \"    fig.image_mode = msg['mode'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\\n\",\n       \"    for (var key in msg) {\\n\",\n       \"        if (!(key in fig.buttons)) {\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"        fig.buttons[key].disabled = !msg[key];\\n\",\n       \"        fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\\n\",\n       \"    if (msg['mode'] === 'PAN') {\\n\",\n       \"        fig.buttons['Pan'].classList.add('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    } else if (msg['mode'] === 'ZOOM') {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.add('active');\\n\",\n       \"    } else {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Called whenever the canvas gets updated.\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// A function to construct a web socket function for onmessage handling.\\n\",\n       \"// Called in the figure constructor.\\n\",\n       \"mpl.figure.prototype._make_on_message_function = function (fig) {\\n\",\n       \"    return function socket_on_message(evt) {\\n\",\n       \"        if (evt.data instanceof Blob) {\\n\",\n       \"            /* FIXME: We get \\\"Resource interpreted as Image but\\n\",\n       \"             * transferred with MIME type text/plain:\\\" errors on\\n\",\n       \"             * Chrome.  But how to set the MIME type?  It doesn't seem\\n\",\n       \"             * to be part of the websocket stream */\\n\",\n       \"            evt.data.type = 'image/png';\\n\",\n       \"\\n\",\n       \"            /* Free the memory for the previous frames */\\n\",\n       \"            if (fig.imageObj.src) {\\n\",\n       \"                (window.URL || window.webkitURL).revokeObjectURL(\\n\",\n       \"                    fig.imageObj.src\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\\n\",\n       \"                evt.data\\n\",\n       \"            );\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        } else if (\\n\",\n       \"            typeof evt.data === 'string' &&\\n\",\n       \"            evt.data.slice(0, 21) === 'data:image/png;base64'\\n\",\n       \"        ) {\\n\",\n       \"            fig.imageObj.src = evt.data;\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var msg = JSON.parse(evt.data);\\n\",\n       \"        var msg_type = msg['type'];\\n\",\n       \"\\n\",\n       \"        // Call the  \\\"handle_{type}\\\" callback, which takes\\n\",\n       \"        // the figure and JSON message as its only arguments.\\n\",\n       \"        try {\\n\",\n       \"            var callback = fig['handle_' + msg_type];\\n\",\n       \"        } catch (e) {\\n\",\n       \"            console.log(\\n\",\n       \"                \\\"No handler for the '\\\" + msg_type + \\\"' message type: \\\",\\n\",\n       \"                msg\\n\",\n       \"            );\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        if (callback) {\\n\",\n       \"            try {\\n\",\n       \"                // console.log(\\\"Handling '\\\" + msg_type + \\\"' message: \\\", msg);\\n\",\n       \"                callback(fig, msg);\\n\",\n       \"            } catch (e) {\\n\",\n       \"                console.log(\\n\",\n       \"                    \\\"Exception inside the 'handler_\\\" + msg_type + \\\"' callback:\\\",\\n\",\n       \"                    e,\\n\",\n       \"                    e.stack,\\n\",\n       \"                    msg\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\\n\",\n       \"mpl.findpos = function (e) {\\n\",\n       \"    //this section is from http://www.quirksmode.org/js/events_properties.html\\n\",\n       \"    var targ;\\n\",\n       \"    if (!e) {\\n\",\n       \"        e = window.event;\\n\",\n       \"    }\\n\",\n       \"    if (e.target) {\\n\",\n       \"        targ = e.target;\\n\",\n       \"    } else if (e.srcElement) {\\n\",\n       \"        targ = e.srcElement;\\n\",\n       \"    }\\n\",\n       \"    if (targ.nodeType === 3) {\\n\",\n       \"        // defeat Safari bug\\n\",\n       \"        targ = targ.parentNode;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // pageX,Y are the mouse positions relative to the document\\n\",\n       \"    var boundingRect = targ.getBoundingClientRect();\\n\",\n       \"    var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\\n\",\n       \"    var y = e.pageY - (boundingRect.top + document.body.scrollTop);\\n\",\n       \"\\n\",\n       \"    return { x: x, y: y };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"/*\\n\",\n       \" * return a copy of an object with only non-object keys\\n\",\n       \" * we need this to avoid circular references\\n\",\n       \" * http://stackoverflow.com/a/24161582/3208463\\n\",\n       \" */\\n\",\n       \"function simpleKeys(original) {\\n\",\n       \"    return Object.keys(original).reduce(function (obj, key) {\\n\",\n       \"        if (typeof original[key] !== 'object') {\\n\",\n       \"            obj[key] = original[key];\\n\",\n       \"        }\\n\",\n       \"        return obj;\\n\",\n       \"    }, {});\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.mouse_event = function (event, name) {\\n\",\n       \"    var canvas_pos = mpl.findpos(event);\\n\",\n       \"\\n\",\n       \"    if (name === 'button_press') {\\n\",\n       \"        this.canvas.focus();\\n\",\n       \"        this.canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var x = canvas_pos.x * this.ratio;\\n\",\n       \"    var y = canvas_pos.y * this.ratio;\\n\",\n       \"\\n\",\n       \"    this.send_message(name, {\\n\",\n       \"        x: x,\\n\",\n       \"        y: y,\\n\",\n       \"        button: event.button,\\n\",\n       \"        step: event.step,\\n\",\n       \"        guiEvent: simpleKeys(event),\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    /* This prevents the web browser from automatically changing to\\n\",\n       \"     * the text insertion cursor when the button is pressed.  We want\\n\",\n       \"     * to control all of the cursor setting manually through the\\n\",\n       \"     * 'cursor' event from matplotlib */\\n\",\n       \"    event.preventDefault();\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (_event, _name) {\\n\",\n       \"    // Handle any extra behaviour associated with a key event\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.key_event = function (event, name) {\\n\",\n       \"    // Prevent repeat events\\n\",\n       \"    if (name === 'key_press') {\\n\",\n       \"        if (event.which === this._key) {\\n\",\n       \"            return;\\n\",\n       \"        } else {\\n\",\n       \"            this._key = event.which;\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"    if (name === 'key_release') {\\n\",\n       \"        this._key = null;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var value = '';\\n\",\n       \"    if (event.ctrlKey && event.which !== 17) {\\n\",\n       \"        value += 'ctrl+';\\n\",\n       \"    }\\n\",\n       \"    if (event.altKey && event.which !== 18) {\\n\",\n       \"        value += 'alt+';\\n\",\n       \"    }\\n\",\n       \"    if (event.shiftKey && event.which !== 16) {\\n\",\n       \"        value += 'shift+';\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    value += 'k';\\n\",\n       \"    value += event.which.toString();\\n\",\n       \"\\n\",\n       \"    this._key_event_extra(event, name);\\n\",\n       \"\\n\",\n       \"    this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onclick = function (name) {\\n\",\n       \"    if (name === 'download') {\\n\",\n       \"        this.handle_save(this, null);\\n\",\n       \"    } else {\\n\",\n       \"        this.send_message('toolbar_button', { name: name });\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\\n\",\n       \"    this.message.textContent = tooltip;\\n\",\n       \"};\\n\",\n       \"mpl.toolbar_items = [[\\\"Home\\\", \\\"Reset original view\\\", \\\"fa fa-home icon-home\\\", \\\"home\\\"], [\\\"Back\\\", \\\"Back to previous view\\\", \\\"fa fa-arrow-left icon-arrow-left\\\", \\\"back\\\"], [\\\"Forward\\\", \\\"Forward to next view\\\", \\\"fa fa-arrow-right icon-arrow-right\\\", \\\"forward\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Pan\\\", \\\"Left button pans, Right button zooms\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-arrows icon-move\\\", \\\"pan\\\"], [\\\"Zoom\\\", \\\"Zoom to rectangle\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-square-o icon-check-empty\\\", \\\"zoom\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Download\\\", \\\"Download plot\\\", \\\"fa fa-floppy-o icon-save\\\", \\\"download\\\"]];\\n\",\n       \"\\n\",\n       \"mpl.extensions = [\\\"eps\\\", \\\"jpeg\\\", \\\"pdf\\\", \\\"png\\\", \\\"ps\\\", \\\"raw\\\", \\\"svg\\\", \\\"tif\\\"];\\n\",\n       \"\\n\",\n       \"mpl.default_extension = \\\"png\\\";/* global mpl */\\n\",\n       \"\\n\",\n       \"var comm_websocket_adapter = function (comm) {\\n\",\n       \"    // Create a \\\"websocket\\\"-like object which calls the given IPython comm\\n\",\n       \"    // object with the appropriate methods. Currently this is a non binary\\n\",\n       \"    // socket, so there is still some room for performance tuning.\\n\",\n       \"    var ws = {};\\n\",\n       \"\\n\",\n       \"    ws.close = function () {\\n\",\n       \"        comm.close();\\n\",\n       \"    };\\n\",\n       \"    ws.send = function (m) {\\n\",\n       \"        //console.log('sending', m);\\n\",\n       \"        comm.send(m);\\n\",\n       \"    };\\n\",\n       \"    // Register the callback with on_msg.\\n\",\n       \"    comm.on_msg(function (msg) {\\n\",\n       \"        //console.log('receiving', msg['content']['data'], msg);\\n\",\n       \"        // Pass the mpl event to the overridden (by mpl) onmessage function.\\n\",\n       \"        ws.onmessage(msg['content']['data']);\\n\",\n       \"    });\\n\",\n       \"    return ws;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.mpl_figure_comm = function (comm, msg) {\\n\",\n       \"    // This is the function which gets called when the mpl process\\n\",\n       \"    // starts-up an IPython Comm through the \\\"matplotlib\\\" channel.\\n\",\n       \"\\n\",\n       \"    var id = msg.content.data.id;\\n\",\n       \"    // Get hold of the div created by the display call when the Comm\\n\",\n       \"    // socket was opened in Python.\\n\",\n       \"    var element = document.getElementById(id);\\n\",\n       \"    var ws_proxy = comm_websocket_adapter(comm);\\n\",\n       \"\\n\",\n       \"    function ondownload(figure, _format) {\\n\",\n       \"        window.open(figure.canvas.toDataURL());\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fig = new mpl.figure(id, ws_proxy, ondownload, element);\\n\",\n       \"\\n\",\n       \"    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\\n\",\n       \"    // web socket which is closed, not our websocket->open comm proxy.\\n\",\n       \"    ws_proxy.onopen();\\n\",\n       \"\\n\",\n       \"    fig.parent_element = element;\\n\",\n       \"    fig.cell_info = mpl.find_output_cell(\\\"<div id='\\\" + id + \\\"'></div>\\\");\\n\",\n       \"    if (!fig.cell_info) {\\n\",\n       \"        console.error('Failed to find cell for figure', id, fig);\\n\",\n       \"        return;\\n\",\n       \"    }\\n\",\n       \"    fig.cell_info[0].output_area.element.one(\\n\",\n       \"        'cleared',\\n\",\n       \"        { fig: fig },\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_close = function (fig, msg) {\\n\",\n       \"    var width = fig.canvas.width / fig.ratio;\\n\",\n       \"    fig.cell_info[0].output_area.element.off(\\n\",\n       \"        'cleared',\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    // Update the output cell to use the data from the current canvas.\\n\",\n       \"    fig.push_to_output();\\n\",\n       \"    var dataURL = fig.canvas.toDataURL();\\n\",\n       \"    // Re-enable the keyboard manager in IPython - without this line, in FF,\\n\",\n       \"    // the notebook keyboard shortcuts fail.\\n\",\n       \"    IPython.keyboard_manager.enable();\\n\",\n       \"    fig.parent_element.innerHTML =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"    fig.close_ws(fig, msg);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.close_ws = function (fig, msg) {\\n\",\n       \"    fig.send_message('closing', msg);\\n\",\n       \"    // fig.ws.close()\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\\n\",\n       \"    // Turn the data on the canvas into data in the output cell.\\n\",\n       \"    var width = this.canvas.width / this.ratio;\\n\",\n       \"    var dataURL = this.canvas.toDataURL();\\n\",\n       \"    this.cell_info[1]['text/html'] =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Tell IPython that the notebook contents must change.\\n\",\n       \"    IPython.notebook.set_dirty(true);\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"    var fig = this;\\n\",\n       \"    // Wait a second, then push the new image to the DOM so\\n\",\n       \"    // that it is saved nicely (might be nice to debounce this).\\n\",\n       \"    setTimeout(function () {\\n\",\n       \"        fig.push_to_output();\\n\",\n       \"    }, 1000);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'btn-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'btn-group';\\n\",\n       \"    var button;\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'btn-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        button = fig.buttons[name] = document.createElement('button');\\n\",\n       \"        button.classList = 'btn btn-default';\\n\",\n       \"        button.href = '#';\\n\",\n       \"        button.title = name;\\n\",\n       \"        button.innerHTML = '<i class=\\\"fa ' + image + ' fa-lg\\\"></i>';\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Add the status bar.\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message pull-right';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"\\n\",\n       \"    // Add the close button to the window.\\n\",\n       \"    var buttongrp = document.createElement('div');\\n\",\n       \"    buttongrp.classList = 'btn-group inline pull-right';\\n\",\n       \"    button = document.createElement('button');\\n\",\n       \"    button.classList = 'btn btn-mini btn-primary';\\n\",\n       \"    button.href = '#';\\n\",\n       \"    button.title = 'Stop Interaction';\\n\",\n       \"    button.innerHTML = '<i class=\\\"fa fa-power-off icon-remove icon-large\\\"></i>';\\n\",\n       \"    button.addEventListener('click', function (_evt) {\\n\",\n       \"        fig.handle_close(fig, {});\\n\",\n       \"    });\\n\",\n       \"    button.addEventListener(\\n\",\n       \"        'mouseover',\\n\",\n       \"        on_mouseover_closure('Stop Interaction')\\n\",\n       \"    );\\n\",\n       \"    buttongrp.appendChild(button);\\n\",\n       \"    var titlebar = this.root.querySelector('.ui-dialog-titlebar');\\n\",\n       \"    titlebar.insertBefore(buttongrp, titlebar.firstChild);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._remove_fig_handler = function (event) {\\n\",\n       \"    var fig = event.data.fig;\\n\",\n       \"    fig.close_ws(fig, {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (el) {\\n\",\n       \"    el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (el) {\\n\",\n       \"    // this is important to make the div 'focusable\\n\",\n       \"    el.setAttribute('tabindex', 0);\\n\",\n       \"    // reach out to IPython and tell the keyboard manager to turn it's self\\n\",\n       \"    // off when our div gets focus\\n\",\n       \"\\n\",\n       \"    // location in version 3\\n\",\n       \"    if (IPython.notebook.keyboard_manager) {\\n\",\n       \"        IPython.notebook.keyboard_manager.register_events(el);\\n\",\n       \"    } else {\\n\",\n       \"        // location in version 2\\n\",\n       \"        IPython.keyboard_manager.register_events(el);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (event, _name) {\\n\",\n       \"    var manager = IPython.notebook.keyboard_manager;\\n\",\n       \"    if (!manager) {\\n\",\n       \"        manager = IPython.keyboard_manager;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Check for shift+enter\\n\",\n       \"    if (event.shiftKey && event.which === 13) {\\n\",\n       \"        this.canvas_div.blur();\\n\",\n       \"        // select the cell after this one\\n\",\n       \"        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\\n\",\n       \"        IPython.notebook.select(index + 1);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    fig.ondownload(fig, null);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.find_output_cell = function (html_output) {\\n\",\n       \"    // Return the cell and output element which can be found *uniquely* in the notebook.\\n\",\n       \"    // Note - this is a bit hacky, but it is done because the \\\"notebook_saving.Notebook\\\"\\n\",\n       \"    // IPython event is triggered only after the cells have been serialised, which for\\n\",\n       \"    // our purposes (turning an active figure into a static one), is too late.\\n\",\n       \"    var cells = IPython.notebook.get_cells();\\n\",\n       \"    var ncells = cells.length;\\n\",\n       \"    for (var i = 0; i < ncells; i++) {\\n\",\n       \"        var cell = cells[i];\\n\",\n       \"        if (cell.cell_type === 'code') {\\n\",\n       \"            for (var j = 0; j < cell.output_area.outputs.length; j++) {\\n\",\n       \"                var data = cell.output_area.outputs[j];\\n\",\n       \"                if (data.data) {\\n\",\n       \"                    // IPython >= 3 moved mimebundle to data attribute of output\\n\",\n       \"                    data = data.data;\\n\",\n       \"                }\\n\",\n       \"                if (data['text/html'] === html_output) {\\n\",\n       \"                    return [cell, data, j];\\n\",\n       \"                }\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// Register the function which deals with the matplotlib target/channel.\\n\",\n       \"// The kernel may be null if the page has been refreshed.\\n\",\n       \"if (IPython.notebook.kernel !== null) {\\n\",\n       \"    IPython.notebook.kernel.comm_manager.register_target(\\n\",\n       \"        'matplotlib',\\n\",\n       \"        mpl.mpl_figure_comm\\n\",\n       \"    );\\n\",\n       \"}\\n\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.Javascript object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<img src=\\\"data:image/png;base64,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\\\" width=\\\"640\\\">\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.HTML object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<matplotlib.legend.Legend at 0x7f6306879ca0>\"\n      ]\n     },\n     \"execution_count\": 52,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Visualizing the precision/recall tradeoff\\n\",\n    \"y_scores = cross_val_predict(sgd_clf,\\n\",\n    \"                             df1[features],\\n\",\n    \"                             df1['x_republican'],\\n\",\n    \"                             cv=3,\\n\",\n    \"                             method='decision_function',\\n\",\n    \"                             n_jobs=3)\\n\",\n    \"\\n\",\n    \"from sklearn.metrics import precision_recall_curve\\n\",\n    \"precisions, recalls, thresholds = precision_recall_curve(df1['x_republican'], y_scores)\\n\",\n    \"\\n\",\n    \"import matplotlib.pyplot as plt\\n\",\n    \"plt.plot(thresholds, precisions[:-1], label=\\\"Precision\\\")\\n\",\n    \"plt.plot(thresholds, recalls[:-1], label=\\\"Recall\\\")\\n\",\n    \"plt.xlabel('Threshold')\\n\",\n    \"plt.legend()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 53,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/javascript\": [\n       \"/* Put everything inside the global mpl namespace */\\n\",\n       \"/* global mpl */\\n\",\n       \"window.mpl = {};\\n\",\n       \"\\n\",\n       \"mpl.get_websocket_type = function () {\\n\",\n       \"    if (typeof WebSocket !== 'undefined') {\\n\",\n       \"        return WebSocket;\\n\",\n       \"    } else if (typeof MozWebSocket !== 'undefined') {\\n\",\n       \"        return MozWebSocket;\\n\",\n       \"    } else {\\n\",\n       \"        alert(\\n\",\n       \"            'Your browser does not have WebSocket support. ' +\\n\",\n       \"                'Please try Chrome, Safari or Firefox ≥ 6. ' +\\n\",\n       \"                'Firefox 4 and 5 are also supported but you ' +\\n\",\n       \"                'have to enable WebSockets in about:config.'\\n\",\n       \"        );\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\\n\",\n       \"    this.id = figure_id;\\n\",\n       \"\\n\",\n       \"    this.ws = websocket;\\n\",\n       \"\\n\",\n       \"    this.supports_binary = this.ws.binaryType !== undefined;\\n\",\n       \"\\n\",\n       \"    if (!this.supports_binary) {\\n\",\n       \"        var warnings = document.getElementById('mpl-warnings');\\n\",\n       \"        if (warnings) {\\n\",\n       \"            warnings.style.display = 'block';\\n\",\n       \"            warnings.textContent =\\n\",\n       \"                'This browser does not support binary websocket messages. ' +\\n\",\n       \"                'Performance may be slow.';\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    this.imageObj = new Image();\\n\",\n       \"\\n\",\n       \"    this.context = undefined;\\n\",\n       \"    this.message = undefined;\\n\",\n       \"    this.canvas = undefined;\\n\",\n       \"    this.rubberband_canvas = undefined;\\n\",\n       \"    this.rubberband_context = undefined;\\n\",\n       \"    this.format_dropdown = undefined;\\n\",\n       \"\\n\",\n       \"    this.image_mode = 'full';\\n\",\n       \"\\n\",\n       \"    this.root = document.createElement('div');\\n\",\n       \"    this.root.setAttribute('style', 'display: inline-block');\\n\",\n       \"    this._root_extra_style(this.root);\\n\",\n       \"\\n\",\n       \"    parent_element.appendChild(this.root);\\n\",\n       \"\\n\",\n       \"    this._init_header(this);\\n\",\n       \"    this._init_canvas(this);\\n\",\n       \"    this._init_toolbar(this);\\n\",\n       \"\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    this.waiting = false;\\n\",\n       \"\\n\",\n       \"    this.ws.onopen = function () {\\n\",\n       \"        fig.send_message('supports_binary', { value: fig.supports_binary });\\n\",\n       \"        fig.send_message('send_image_mode', {});\\n\",\n       \"        if (fig.ratio !== 1) {\\n\",\n       \"            fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\\n\",\n       \"        }\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onload = function () {\\n\",\n       \"        if (fig.image_mode === 'full') {\\n\",\n       \"            // Full images could contain transparency (where diff images\\n\",\n       \"            // almost always do), so we need to clear the canvas so that\\n\",\n       \"            // there is no ghosting.\\n\",\n       \"            fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\\n\",\n       \"        }\\n\",\n       \"        fig.context.drawImage(fig.imageObj, 0, 0);\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onunload = function () {\\n\",\n       \"        fig.ws.close();\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.ws.onmessage = this._make_on_message_function(this);\\n\",\n       \"\\n\",\n       \"    this.ondownload = ondownload;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_header = function () {\\n\",\n       \"    var titlebar = document.createElement('div');\\n\",\n       \"    titlebar.classList =\\n\",\n       \"        'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\\n\",\n       \"    var titletext = document.createElement('div');\\n\",\n       \"    titletext.classList = 'ui-dialog-title';\\n\",\n       \"    titletext.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'width: 100%; text-align: center; padding: 3px;'\\n\",\n       \"    );\\n\",\n       \"    titlebar.appendChild(titletext);\\n\",\n       \"    this.root.appendChild(titlebar);\\n\",\n       \"    this.header = titletext;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_canvas = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var canvas_div = (this.canvas_div = document.createElement('div'));\\n\",\n       \"    canvas_div.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'border: 1px solid #ddd;' +\\n\",\n       \"            'box-sizing: content-box;' +\\n\",\n       \"            'clear: both;' +\\n\",\n       \"            'min-height: 1px;' +\\n\",\n       \"            'min-width: 1px;' +\\n\",\n       \"            'outline: 0;' +\\n\",\n       \"            'overflow: hidden;' +\\n\",\n       \"            'position: relative;' +\\n\",\n       \"            'resize: both;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    function on_keyboard_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.key_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keydown',\\n\",\n       \"        on_keyboard_event_closure('key_press')\\n\",\n       \"    );\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keyup',\\n\",\n       \"        on_keyboard_event_closure('key_release')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    this._canvas_extra_style(canvas_div);\\n\",\n       \"    this.root.appendChild(canvas_div);\\n\",\n       \"\\n\",\n       \"    var canvas = (this.canvas = document.createElement('canvas'));\\n\",\n       \"    canvas.classList.add('mpl-canvas');\\n\",\n       \"    canvas.setAttribute('style', 'box-sizing: content-box;');\\n\",\n       \"\\n\",\n       \"    this.context = canvas.getContext('2d');\\n\",\n       \"\\n\",\n       \"    var backingStore =\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        this.context.webkitBackingStorePixelRatio ||\\n\",\n       \"        this.context.mozBackingStorePixelRatio ||\\n\",\n       \"        this.context.msBackingStorePixelRatio ||\\n\",\n       \"        this.context.oBackingStorePixelRatio ||\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        1;\\n\",\n       \"\\n\",\n       \"    this.ratio = (window.devicePixelRatio || 1) / backingStore;\\n\",\n       \"    if (this.ratio !== 1) {\\n\",\n       \"        fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var rubberband_canvas = (this.rubberband_canvas = document.createElement(\\n\",\n       \"        'canvas'\\n\",\n       \"    ));\\n\",\n       \"    rubberband_canvas.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    var resizeObserver = new ResizeObserver(function (entries) {\\n\",\n       \"        var nentries = entries.length;\\n\",\n       \"        for (var i = 0; i < nentries; i++) {\\n\",\n       \"            var entry = entries[i];\\n\",\n       \"            var width, height;\\n\",\n       \"            if (entry.contentBoxSize) {\\n\",\n       \"                if (entry.contentBoxSize instanceof Array) {\\n\",\n       \"                    // Chrome 84 implements new version of spec.\\n\",\n       \"                    width = entry.contentBoxSize[0].inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize[0].blockSize;\\n\",\n       \"                } else {\\n\",\n       \"                    // Firefox implements old version of spec.\\n\",\n       \"                    width = entry.contentBoxSize.inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize.blockSize;\\n\",\n       \"                }\\n\",\n       \"            } else {\\n\",\n       \"                // Chrome <84 implements even older version of spec.\\n\",\n       \"                width = entry.contentRect.width;\\n\",\n       \"                height = entry.contentRect.height;\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            // Keep the size of the canvas and rubber band canvas in sync with\\n\",\n       \"            // the canvas container.\\n\",\n       \"            if (entry.devicePixelContentBoxSize) {\\n\",\n       \"                // Chrome 84 implements new version of spec.\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'width',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].inlineSize\\n\",\n       \"                );\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'height',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].blockSize\\n\",\n       \"                );\\n\",\n       \"            } else {\\n\",\n       \"                canvas.setAttribute('width', width * fig.ratio);\\n\",\n       \"                canvas.setAttribute('height', height * fig.ratio);\\n\",\n       \"            }\\n\",\n       \"            canvas.setAttribute(\\n\",\n       \"                'style',\\n\",\n       \"                'width: ' + width + 'px; height: ' + height + 'px;'\\n\",\n       \"            );\\n\",\n       \"\\n\",\n       \"            rubberband_canvas.setAttribute('width', width);\\n\",\n       \"            rubberband_canvas.setAttribute('height', height);\\n\",\n       \"\\n\",\n       \"            // And update the size in Python. We ignore the initial 0/0 size\\n\",\n       \"            // that occurs as the element is placed into the DOM, which should\\n\",\n       \"            // otherwise not happen due to the minimum size styling.\\n\",\n       \"            if (width != 0 && height != 0) {\\n\",\n       \"                fig.request_resize(width, height);\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    });\\n\",\n       \"    resizeObserver.observe(canvas_div);\\n\",\n       \"\\n\",\n       \"    function on_mouse_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.mouse_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousedown',\\n\",\n       \"        on_mouse_event_closure('button_press')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseup',\\n\",\n       \"        on_mouse_event_closure('button_release')\\n\",\n       \"    );\\n\",\n       \"    // Throttle sequential mouse events to 1 every 20ms.\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousemove',\\n\",\n       \"        on_mouse_event_closure('motion_notify')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseenter',\\n\",\n       \"        on_mouse_event_closure('figure_enter')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseleave',\\n\",\n       \"        on_mouse_event_closure('figure_leave')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener('wheel', function (event) {\\n\",\n       \"        if (event.deltaY < 0) {\\n\",\n       \"            event.step = 1;\\n\",\n       \"        } else {\\n\",\n       \"            event.step = -1;\\n\",\n       \"        }\\n\",\n       \"        on_mouse_event_closure('scroll')(event);\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    canvas_div.appendChild(canvas);\\n\",\n       \"    canvas_div.appendChild(rubberband_canvas);\\n\",\n       \"\\n\",\n       \"    this.rubberband_context = rubberband_canvas.getContext('2d');\\n\",\n       \"    this.rubberband_context.strokeStyle = '#000000';\\n\",\n       \"\\n\",\n       \"    this._resize_canvas = function (width, height, forward) {\\n\",\n       \"        if (forward) {\\n\",\n       \"            canvas_div.style.width = width + 'px';\\n\",\n       \"            canvas_div.style.height = height + 'px';\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    // Disable right mouse context menu.\\n\",\n       \"    this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\\n\",\n       \"        event.preventDefault();\\n\",\n       \"        return false;\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    function set_focus() {\\n\",\n       \"        canvas.focus();\\n\",\n       \"        canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    window.setTimeout(set_focus, 100);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'mpl-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var button = (fig.buttons[name] = document.createElement('button'));\\n\",\n       \"        button.classList = 'mpl-widget';\\n\",\n       \"        button.setAttribute('role', 'button');\\n\",\n       \"        button.setAttribute('aria-disabled', 'false');\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"\\n\",\n       \"        var icon_img = document.createElement('img');\\n\",\n       \"        icon_img.src = '_images/' + image + '.png';\\n\",\n       \"        icon_img.srcset = '_images/' + image + '_large.png 2x';\\n\",\n       \"        icon_img.alt = tooltip;\\n\",\n       \"        button.appendChild(icon_img);\\n\",\n       \"\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fmt_picker = document.createElement('select');\\n\",\n       \"    fmt_picker.classList = 'mpl-widget';\\n\",\n       \"    toolbar.appendChild(fmt_picker);\\n\",\n       \"    this.format_dropdown = fmt_picker;\\n\",\n       \"\\n\",\n       \"    for (var ind in mpl.extensions) {\\n\",\n       \"        var fmt = mpl.extensions[ind];\\n\",\n       \"        var option = document.createElement('option');\\n\",\n       \"        option.selected = fmt === mpl.default_extension;\\n\",\n       \"        option.innerHTML = fmt;\\n\",\n       \"        fmt_picker.appendChild(option);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\\n\",\n       \"    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\\n\",\n       \"    // which will in turn request a refresh of the image.\\n\",\n       \"    this.send_message('resize', { width: x_pixels, height: y_pixels });\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_message = function (type, properties) {\\n\",\n       \"    properties['type'] = type;\\n\",\n       \"    properties['figure_id'] = this.id;\\n\",\n       \"    this.ws.send(JSON.stringify(properties));\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_draw_message = function () {\\n\",\n       \"    if (!this.waiting) {\\n\",\n       \"        this.waiting = true;\\n\",\n       \"        this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    var format_dropdown = fig.format_dropdown;\\n\",\n       \"    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\\n\",\n       \"    fig.ondownload(fig, format);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_resize = function (fig, msg) {\\n\",\n       \"    var size = msg['size'];\\n\",\n       \"    if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\\n\",\n       \"        fig._resize_canvas(size[0], size[1], msg['forward']);\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\\n\",\n       \"    var x0 = msg['x0'] / fig.ratio;\\n\",\n       \"    var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\\n\",\n       \"    var x1 = msg['x1'] / fig.ratio;\\n\",\n       \"    var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\\n\",\n       \"    x0 = Math.floor(x0) + 0.5;\\n\",\n       \"    y0 = Math.floor(y0) + 0.5;\\n\",\n       \"    x1 = Math.floor(x1) + 0.5;\\n\",\n       \"    y1 = Math.floor(y1) + 0.5;\\n\",\n       \"    var min_x = Math.min(x0, x1);\\n\",\n       \"    var min_y = Math.min(y0, y1);\\n\",\n       \"    var width = Math.abs(x1 - x0);\\n\",\n       \"    var height = Math.abs(y1 - y0);\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.clearRect(\\n\",\n       \"        0,\\n\",\n       \"        0,\\n\",\n       \"        fig.canvas.width / fig.ratio,\\n\",\n       \"        fig.canvas.height / fig.ratio\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\\n\",\n       \"    // Updates the figure title.\\n\",\n       \"    fig.header.textContent = msg['label'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_cursor = function (fig, msg) {\\n\",\n       \"    var cursor = msg['cursor'];\\n\",\n       \"    switch (cursor) {\\n\",\n       \"        case 0:\\n\",\n       \"            cursor = 'pointer';\\n\",\n       \"            break;\\n\",\n       \"        case 1:\\n\",\n       \"            cursor = 'default';\\n\",\n       \"            break;\\n\",\n       \"        case 2:\\n\",\n       \"            cursor = 'crosshair';\\n\",\n       \"            break;\\n\",\n       \"        case 3:\\n\",\n       \"            cursor = 'move';\\n\",\n       \"            break;\\n\",\n       \"    }\\n\",\n       \"    fig.rubberband_canvas.style.cursor = cursor;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_message = function (fig, msg) {\\n\",\n       \"    fig.message.textContent = msg['message'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_draw = function (fig, _msg) {\\n\",\n       \"    // Request the server to send over a new figure.\\n\",\n       \"    fig.send_draw_message();\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\\n\",\n       \"    fig.image_mode = msg['mode'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\\n\",\n       \"    for (var key in msg) {\\n\",\n       \"        if (!(key in fig.buttons)) {\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"        fig.buttons[key].disabled = !msg[key];\\n\",\n       \"        fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\\n\",\n       \"    if (msg['mode'] === 'PAN') {\\n\",\n       \"        fig.buttons['Pan'].classList.add('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    } else if (msg['mode'] === 'ZOOM') {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.add('active');\\n\",\n       \"    } else {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Called whenever the canvas gets updated.\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// A function to construct a web socket function for onmessage handling.\\n\",\n       \"// Called in the figure constructor.\\n\",\n       \"mpl.figure.prototype._make_on_message_function = function (fig) {\\n\",\n       \"    return function socket_on_message(evt) {\\n\",\n       \"        if (evt.data instanceof Blob) {\\n\",\n       \"            /* FIXME: We get \\\"Resource interpreted as Image but\\n\",\n       \"             * transferred with MIME type text/plain:\\\" errors on\\n\",\n       \"             * Chrome.  But how to set the MIME type?  It doesn't seem\\n\",\n       \"             * to be part of the websocket stream */\\n\",\n       \"            evt.data.type = 'image/png';\\n\",\n       \"\\n\",\n       \"            /* Free the memory for the previous frames */\\n\",\n       \"            if (fig.imageObj.src) {\\n\",\n       \"                (window.URL || window.webkitURL).revokeObjectURL(\\n\",\n       \"                    fig.imageObj.src\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\\n\",\n       \"                evt.data\\n\",\n       \"            );\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        } else if (\\n\",\n       \"            typeof evt.data === 'string' &&\\n\",\n       \"            evt.data.slice(0, 21) === 'data:image/png;base64'\\n\",\n       \"        ) {\\n\",\n       \"            fig.imageObj.src = evt.data;\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var msg = JSON.parse(evt.data);\\n\",\n       \"        var msg_type = msg['type'];\\n\",\n       \"\\n\",\n       \"        // Call the  \\\"handle_{type}\\\" callback, which takes\\n\",\n       \"        // the figure and JSON message as its only arguments.\\n\",\n       \"        try {\\n\",\n       \"            var callback = fig['handle_' + msg_type];\\n\",\n       \"        } catch (e) {\\n\",\n       \"            console.log(\\n\",\n       \"                \\\"No handler for the '\\\" + msg_type + \\\"' message type: \\\",\\n\",\n       \"                msg\\n\",\n       \"            );\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        if (callback) {\\n\",\n       \"            try {\\n\",\n       \"                // console.log(\\\"Handling '\\\" + msg_type + \\\"' message: \\\", msg);\\n\",\n       \"                callback(fig, msg);\\n\",\n       \"            } catch (e) {\\n\",\n       \"                console.log(\\n\",\n       \"                    \\\"Exception inside the 'handler_\\\" + msg_type + \\\"' callback:\\\",\\n\",\n       \"                    e,\\n\",\n       \"                    e.stack,\\n\",\n       \"                    msg\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\\n\",\n       \"mpl.findpos = function (e) {\\n\",\n       \"    //this section is from http://www.quirksmode.org/js/events_properties.html\\n\",\n       \"    var targ;\\n\",\n       \"    if (!e) {\\n\",\n       \"        e = window.event;\\n\",\n       \"    }\\n\",\n       \"    if (e.target) {\\n\",\n       \"        targ = e.target;\\n\",\n       \"    } else if (e.srcElement) {\\n\",\n       \"        targ = e.srcElement;\\n\",\n       \"    }\\n\",\n       \"    if (targ.nodeType === 3) {\\n\",\n       \"        // defeat Safari bug\\n\",\n       \"        targ = targ.parentNode;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // pageX,Y are the mouse positions relative to the document\\n\",\n       \"    var boundingRect = targ.getBoundingClientRect();\\n\",\n       \"    var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\\n\",\n       \"    var y = e.pageY - (boundingRect.top + document.body.scrollTop);\\n\",\n       \"\\n\",\n       \"    return { x: x, y: y };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"/*\\n\",\n       \" * return a copy of an object with only non-object keys\\n\",\n       \" * we need this to avoid circular references\\n\",\n       \" * http://stackoverflow.com/a/24161582/3208463\\n\",\n       \" */\\n\",\n       \"function simpleKeys(original) {\\n\",\n       \"    return Object.keys(original).reduce(function (obj, key) {\\n\",\n       \"        if (typeof original[key] !== 'object') {\\n\",\n       \"            obj[key] = original[key];\\n\",\n       \"        }\\n\",\n       \"        return obj;\\n\",\n       \"    }, {});\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.mouse_event = function (event, name) {\\n\",\n       \"    var canvas_pos = mpl.findpos(event);\\n\",\n       \"\\n\",\n       \"    if (name === 'button_press') {\\n\",\n       \"        this.canvas.focus();\\n\",\n       \"        this.canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var x = canvas_pos.x * this.ratio;\\n\",\n       \"    var y = canvas_pos.y * this.ratio;\\n\",\n       \"\\n\",\n       \"    this.send_message(name, {\\n\",\n       \"        x: x,\\n\",\n       \"        y: y,\\n\",\n       \"        button: event.button,\\n\",\n       \"        step: event.step,\\n\",\n       \"        guiEvent: simpleKeys(event),\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    /* This prevents the web browser from automatically changing to\\n\",\n       \"     * the text insertion cursor when the button is pressed.  We want\\n\",\n       \"     * to control all of the cursor setting manually through the\\n\",\n       \"     * 'cursor' event from matplotlib */\\n\",\n       \"    event.preventDefault();\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (_event, _name) {\\n\",\n       \"    // Handle any extra behaviour associated with a key event\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.key_event = function (event, name) {\\n\",\n       \"    // Prevent repeat events\\n\",\n       \"    if (name === 'key_press') {\\n\",\n       \"        if (event.which === this._key) {\\n\",\n       \"            return;\\n\",\n       \"        } else {\\n\",\n       \"            this._key = event.which;\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"    if (name === 'key_release') {\\n\",\n       \"        this._key = null;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var value = '';\\n\",\n       \"    if (event.ctrlKey && event.which !== 17) {\\n\",\n       \"        value += 'ctrl+';\\n\",\n       \"    }\\n\",\n       \"    if (event.altKey && event.which !== 18) {\\n\",\n       \"        value += 'alt+';\\n\",\n       \"    }\\n\",\n       \"    if (event.shiftKey && event.which !== 16) {\\n\",\n       \"        value += 'shift+';\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    value += 'k';\\n\",\n       \"    value += event.which.toString();\\n\",\n       \"\\n\",\n       \"    this._key_event_extra(event, name);\\n\",\n       \"\\n\",\n       \"    this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onclick = function (name) {\\n\",\n       \"    if (name === 'download') {\\n\",\n       \"        this.handle_save(this, null);\\n\",\n       \"    } else {\\n\",\n       \"        this.send_message('toolbar_button', { name: name });\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\\n\",\n       \"    this.message.textContent = tooltip;\\n\",\n       \"};\\n\",\n       \"mpl.toolbar_items = [[\\\"Home\\\", \\\"Reset original view\\\", \\\"fa fa-home icon-home\\\", \\\"home\\\"], [\\\"Back\\\", \\\"Back to previous view\\\", \\\"fa fa-arrow-left icon-arrow-left\\\", \\\"back\\\"], [\\\"Forward\\\", \\\"Forward to next view\\\", \\\"fa fa-arrow-right icon-arrow-right\\\", \\\"forward\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Pan\\\", \\\"Left button pans, Right button zooms\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-arrows icon-move\\\", \\\"pan\\\"], [\\\"Zoom\\\", \\\"Zoom to rectangle\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-square-o icon-check-empty\\\", \\\"zoom\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Download\\\", \\\"Download plot\\\", \\\"fa fa-floppy-o icon-save\\\", \\\"download\\\"]];\\n\",\n       \"\\n\",\n       \"mpl.extensions = [\\\"eps\\\", \\\"jpeg\\\", \\\"pdf\\\", \\\"png\\\", \\\"ps\\\", \\\"raw\\\", \\\"svg\\\", \\\"tif\\\"];\\n\",\n       \"\\n\",\n       \"mpl.default_extension = \\\"png\\\";/* global mpl */\\n\",\n       \"\\n\",\n       \"var comm_websocket_adapter = function (comm) {\\n\",\n       \"    // Create a \\\"websocket\\\"-like object which calls the given IPython comm\\n\",\n       \"    // object with the appropriate methods. Currently this is a non binary\\n\",\n       \"    // socket, so there is still some room for performance tuning.\\n\",\n       \"    var ws = {};\\n\",\n       \"\\n\",\n       \"    ws.close = function () {\\n\",\n       \"        comm.close();\\n\",\n       \"    };\\n\",\n       \"    ws.send = function (m) {\\n\",\n       \"        //console.log('sending', m);\\n\",\n       \"        comm.send(m);\\n\",\n       \"    };\\n\",\n       \"    // Register the callback with on_msg.\\n\",\n       \"    comm.on_msg(function (msg) {\\n\",\n       \"        //console.log('receiving', msg['content']['data'], msg);\\n\",\n       \"        // Pass the mpl event to the overridden (by mpl) onmessage function.\\n\",\n       \"        ws.onmessage(msg['content']['data']);\\n\",\n       \"    });\\n\",\n       \"    return ws;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.mpl_figure_comm = function (comm, msg) {\\n\",\n       \"    // This is the function which gets called when the mpl process\\n\",\n       \"    // starts-up an IPython Comm through the \\\"matplotlib\\\" channel.\\n\",\n       \"\\n\",\n       \"    var id = msg.content.data.id;\\n\",\n       \"    // Get hold of the div created by the display call when the Comm\\n\",\n       \"    // socket was opened in Python.\\n\",\n       \"    var element = document.getElementById(id);\\n\",\n       \"    var ws_proxy = comm_websocket_adapter(comm);\\n\",\n       \"\\n\",\n       \"    function ondownload(figure, _format) {\\n\",\n       \"        window.open(figure.canvas.toDataURL());\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fig = new mpl.figure(id, ws_proxy, ondownload, element);\\n\",\n       \"\\n\",\n       \"    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\\n\",\n       \"    // web socket which is closed, not our websocket->open comm proxy.\\n\",\n       \"    ws_proxy.onopen();\\n\",\n       \"\\n\",\n       \"    fig.parent_element = element;\\n\",\n       \"    fig.cell_info = mpl.find_output_cell(\\\"<div id='\\\" + id + \\\"'></div>\\\");\\n\",\n       \"    if (!fig.cell_info) {\\n\",\n       \"        console.error('Failed to find cell for figure', id, fig);\\n\",\n       \"        return;\\n\",\n       \"    }\\n\",\n       \"    fig.cell_info[0].output_area.element.one(\\n\",\n       \"        'cleared',\\n\",\n       \"        { fig: fig },\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_close = function (fig, msg) {\\n\",\n       \"    var width = fig.canvas.width / fig.ratio;\\n\",\n       \"    fig.cell_info[0].output_area.element.off(\\n\",\n       \"        'cleared',\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    // Update the output cell to use the data from the current canvas.\\n\",\n       \"    fig.push_to_output();\\n\",\n       \"    var dataURL = fig.canvas.toDataURL();\\n\",\n       \"    // Re-enable the keyboard manager in IPython - without this line, in FF,\\n\",\n       \"    // the notebook keyboard shortcuts fail.\\n\",\n       \"    IPython.keyboard_manager.enable();\\n\",\n       \"    fig.parent_element.innerHTML =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"    fig.close_ws(fig, msg);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.close_ws = function (fig, msg) {\\n\",\n       \"    fig.send_message('closing', msg);\\n\",\n       \"    // fig.ws.close()\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\\n\",\n       \"    // Turn the data on the canvas into data in the output cell.\\n\",\n       \"    var width = this.canvas.width / this.ratio;\\n\",\n       \"    var dataURL = this.canvas.toDataURL();\\n\",\n       \"    this.cell_info[1]['text/html'] =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Tell IPython that the notebook contents must change.\\n\",\n       \"    IPython.notebook.set_dirty(true);\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"    var fig = this;\\n\",\n       \"    // Wait a second, then push the new image to the DOM so\\n\",\n       \"    // that it is saved nicely (might be nice to debounce this).\\n\",\n       \"    setTimeout(function () {\\n\",\n       \"        fig.push_to_output();\\n\",\n       \"    }, 1000);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'btn-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'btn-group';\\n\",\n       \"    var button;\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'btn-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        button = fig.buttons[name] = document.createElement('button');\\n\",\n       \"        button.classList = 'btn btn-default';\\n\",\n       \"        button.href = '#';\\n\",\n       \"        button.title = name;\\n\",\n       \"        button.innerHTML = '<i class=\\\"fa ' + image + ' fa-lg\\\"></i>';\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Add the status bar.\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message pull-right';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"\\n\",\n       \"    // Add the close button to the window.\\n\",\n       \"    var buttongrp = document.createElement('div');\\n\",\n       \"    buttongrp.classList = 'btn-group inline pull-right';\\n\",\n       \"    button = document.createElement('button');\\n\",\n       \"    button.classList = 'btn btn-mini btn-primary';\\n\",\n       \"    button.href = '#';\\n\",\n       \"    button.title = 'Stop Interaction';\\n\",\n       \"    button.innerHTML = '<i class=\\\"fa fa-power-off icon-remove icon-large\\\"></i>';\\n\",\n       \"    button.addEventListener('click', function (_evt) {\\n\",\n       \"        fig.handle_close(fig, {});\\n\",\n       \"    });\\n\",\n       \"    button.addEventListener(\\n\",\n       \"        'mouseover',\\n\",\n       \"        on_mouseover_closure('Stop Interaction')\\n\",\n       \"    );\\n\",\n       \"    buttongrp.appendChild(button);\\n\",\n       \"    var titlebar = this.root.querySelector('.ui-dialog-titlebar');\\n\",\n       \"    titlebar.insertBefore(buttongrp, titlebar.firstChild);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._remove_fig_handler = function (event) {\\n\",\n       \"    var fig = event.data.fig;\\n\",\n       \"    fig.close_ws(fig, {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (el) {\\n\",\n       \"    el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (el) {\\n\",\n       \"    // this is important to make the div 'focusable\\n\",\n       \"    el.setAttribute('tabindex', 0);\\n\",\n       \"    // reach out to IPython and tell the keyboard manager to turn it's self\\n\",\n       \"    // off when our div gets focus\\n\",\n       \"\\n\",\n       \"    // location in version 3\\n\",\n       \"    if (IPython.notebook.keyboard_manager) {\\n\",\n       \"        IPython.notebook.keyboard_manager.register_events(el);\\n\",\n       \"    } else {\\n\",\n       \"        // location in version 2\\n\",\n       \"        IPython.keyboard_manager.register_events(el);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (event, _name) {\\n\",\n       \"    var manager = IPython.notebook.keyboard_manager;\\n\",\n       \"    if (!manager) {\\n\",\n       \"        manager = IPython.keyboard_manager;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Check for shift+enter\\n\",\n       \"    if (event.shiftKey && event.which === 13) {\\n\",\n       \"        this.canvas_div.blur();\\n\",\n       \"        // select the cell after this one\\n\",\n       \"        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\\n\",\n       \"        IPython.notebook.select(index + 1);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    fig.ondownload(fig, null);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.find_output_cell = function (html_output) {\\n\",\n       \"    // Return the cell and output element which can be found *uniquely* in the notebook.\\n\",\n       \"    // Note - this is a bit hacky, but it is done because the \\\"notebook_saving.Notebook\\\"\\n\",\n       \"    // IPython event is triggered only after the cells have been serialised, which for\\n\",\n       \"    // our purposes (turning an active figure into a static one), is too late.\\n\",\n       \"    var cells = IPython.notebook.get_cells();\\n\",\n       \"    var ncells = cells.length;\\n\",\n       \"    for (var i = 0; i < ncells; i++) {\\n\",\n       \"        var cell = cells[i];\\n\",\n       \"        if (cell.cell_type === 'code') {\\n\",\n       \"            for (var j = 0; j < cell.output_area.outputs.length; j++) {\\n\",\n       \"                var data = cell.output_area.outputs[j];\\n\",\n       \"                if (data.data) {\\n\",\n       \"                    // IPython >= 3 moved mimebundle to data attribute of output\\n\",\n       \"                    data = data.data;\\n\",\n       \"                }\\n\",\n       \"                if (data['text/html'] === html_output) {\\n\",\n       \"                    return [cell, data, j];\\n\",\n       \"                }\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// Register the function which deals with the matplotlib target/channel.\\n\",\n       \"// The kernel may be null if the page has been refreshed.\\n\",\n       \"if (IPython.notebook.kernel !== null) {\\n\",\n       \"    IPython.notebook.kernel.comm_manager.register_target(\\n\",\n       \"        'matplotlib',\\n\",\n       \"        mpl.mpl_figure_comm\\n\",\n       \"    );\\n\",\n       \"}\\n\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.Javascript object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<img src=\\\"data:,\\\" width=\\\"0\\\">\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.HTML object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Text(0, 0.5, 'Precision')\"\n      ]\n     },\n     \"execution_count\": 53,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Plot precision vs recall\\n\",\n    \"plt.step(recalls, precisions)\\n\",\n    \"plt.xlabel('Recall')\\n\",\n    \"plt.ylabel('Precision')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 54,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Precision for Low Threshold: 0.7734375\\n\",\n      \"Precision for High Threshold: 0.8346213292117465\\n\",\n      \"Recall for Low Threshold: 1.0\\n\",\n      \"Recall for High Threshold: 0.9090909090909091\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Assessing other scoring thresholds\\n\",\n    \"ypred_lower = y_scores > -1\\n\",\n    \"ypred_higher = y_scores > 1\\n\",\n    \"\\n\",\n    \"print('Precision for Low Threshold:',precision_score(y, ypred_lower))\\n\",\n    \"print('Precision for High Threshold:',precision_score(y, ypred_higher))\\n\",\n    \"print('Recall for Low Threshold:',recall_score(y, ypred_lower))\\n\",\n    \"print('Recall for High Threshold:',recall_score(y, ypred_higher))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 55,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/javascript\": [\n       \"/* Put everything inside the global mpl namespace */\\n\",\n       \"/* global mpl */\\n\",\n       \"window.mpl = {};\\n\",\n       \"\\n\",\n       \"mpl.get_websocket_type = function () {\\n\",\n       \"    if (typeof WebSocket !== 'undefined') {\\n\",\n       \"        return WebSocket;\\n\",\n       \"    } else if (typeof MozWebSocket !== 'undefined') {\\n\",\n       \"        return MozWebSocket;\\n\",\n       \"    } else {\\n\",\n       \"        alert(\\n\",\n       \"            'Your browser does not have WebSocket support. ' +\\n\",\n       \"                'Please try Chrome, Safari or Firefox ≥ 6. ' +\\n\",\n       \"                'Firefox 4 and 5 are also supported but you ' +\\n\",\n       \"                'have to enable WebSockets in about:config.'\\n\",\n       \"        );\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\\n\",\n       \"    this.id = figure_id;\\n\",\n       \"\\n\",\n       \"    this.ws = websocket;\\n\",\n       \"\\n\",\n       \"    this.supports_binary = this.ws.binaryType !== undefined;\\n\",\n       \"\\n\",\n       \"    if (!this.supports_binary) {\\n\",\n       \"        var warnings = document.getElementById('mpl-warnings');\\n\",\n       \"        if (warnings) {\\n\",\n       \"            warnings.style.display = 'block';\\n\",\n       \"            warnings.textContent =\\n\",\n       \"                'This browser does not support binary websocket messages. ' +\\n\",\n       \"                'Performance may be slow.';\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    this.imageObj = new Image();\\n\",\n       \"\\n\",\n       \"    this.context = undefined;\\n\",\n       \"    this.message = undefined;\\n\",\n       \"    this.canvas = undefined;\\n\",\n       \"    this.rubberband_canvas = undefined;\\n\",\n       \"    this.rubberband_context = undefined;\\n\",\n       \"    this.format_dropdown = undefined;\\n\",\n       \"\\n\",\n       \"    this.image_mode = 'full';\\n\",\n       \"\\n\",\n       \"    this.root = document.createElement('div');\\n\",\n       \"    this.root.setAttribute('style', 'display: inline-block');\\n\",\n       \"    this._root_extra_style(this.root);\\n\",\n       \"\\n\",\n       \"    parent_element.appendChild(this.root);\\n\",\n       \"\\n\",\n       \"    this._init_header(this);\\n\",\n       \"    this._init_canvas(this);\\n\",\n       \"    this._init_toolbar(this);\\n\",\n       \"\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    this.waiting = false;\\n\",\n       \"\\n\",\n       \"    this.ws.onopen = function () {\\n\",\n       \"        fig.send_message('supports_binary', { value: fig.supports_binary });\\n\",\n       \"        fig.send_message('send_image_mode', {});\\n\",\n       \"        if (fig.ratio !== 1) {\\n\",\n       \"            fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\\n\",\n       \"        }\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onload = function () {\\n\",\n       \"        if (fig.image_mode === 'full') {\\n\",\n       \"            // Full images could contain transparency (where diff images\\n\",\n       \"            // almost always do), so we need to clear the canvas so that\\n\",\n       \"            // there is no ghosting.\\n\",\n       \"            fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\\n\",\n       \"        }\\n\",\n       \"        fig.context.drawImage(fig.imageObj, 0, 0);\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onunload = function () {\\n\",\n       \"        fig.ws.close();\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.ws.onmessage = this._make_on_message_function(this);\\n\",\n       \"\\n\",\n       \"    this.ondownload = ondownload;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_header = function () {\\n\",\n       \"    var titlebar = document.createElement('div');\\n\",\n       \"    titlebar.classList =\\n\",\n       \"        'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\\n\",\n       \"    var titletext = document.createElement('div');\\n\",\n       \"    titletext.classList = 'ui-dialog-title';\\n\",\n       \"    titletext.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'width: 100%; text-align: center; padding: 3px;'\\n\",\n       \"    );\\n\",\n       \"    titlebar.appendChild(titletext);\\n\",\n       \"    this.root.appendChild(titlebar);\\n\",\n       \"    this.header = titletext;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_canvas = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var canvas_div = (this.canvas_div = document.createElement('div'));\\n\",\n       \"    canvas_div.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'border: 1px solid #ddd;' +\\n\",\n       \"            'box-sizing: content-box;' +\\n\",\n       \"            'clear: both;' +\\n\",\n       \"            'min-height: 1px;' +\\n\",\n       \"            'min-width: 1px;' +\\n\",\n       \"            'outline: 0;' +\\n\",\n       \"            'overflow: hidden;' +\\n\",\n       \"            'position: relative;' +\\n\",\n       \"            'resize: both;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    function on_keyboard_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.key_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keydown',\\n\",\n       \"        on_keyboard_event_closure('key_press')\\n\",\n       \"    );\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keyup',\\n\",\n       \"        on_keyboard_event_closure('key_release')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    this._canvas_extra_style(canvas_div);\\n\",\n       \"    this.root.appendChild(canvas_div);\\n\",\n       \"\\n\",\n       \"    var canvas = (this.canvas = document.createElement('canvas'));\\n\",\n       \"    canvas.classList.add('mpl-canvas');\\n\",\n       \"    canvas.setAttribute('style', 'box-sizing: content-box;');\\n\",\n       \"\\n\",\n       \"    this.context = canvas.getContext('2d');\\n\",\n       \"\\n\",\n       \"    var backingStore =\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        this.context.webkitBackingStorePixelRatio ||\\n\",\n       \"        this.context.mozBackingStorePixelRatio ||\\n\",\n       \"        this.context.msBackingStorePixelRatio ||\\n\",\n       \"        this.context.oBackingStorePixelRatio ||\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        1;\\n\",\n       \"\\n\",\n       \"    this.ratio = (window.devicePixelRatio || 1) / backingStore;\\n\",\n       \"    if (this.ratio !== 1) {\\n\",\n       \"        fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var rubberband_canvas = (this.rubberband_canvas = document.createElement(\\n\",\n       \"        'canvas'\\n\",\n       \"    ));\\n\",\n       \"    rubberband_canvas.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    var resizeObserver = new ResizeObserver(function (entries) {\\n\",\n       \"        var nentries = entries.length;\\n\",\n       \"        for (var i = 0; i < nentries; i++) {\\n\",\n       \"            var entry = entries[i];\\n\",\n       \"            var width, height;\\n\",\n       \"            if (entry.contentBoxSize) {\\n\",\n       \"                if (entry.contentBoxSize instanceof Array) {\\n\",\n       \"                    // Chrome 84 implements new version of spec.\\n\",\n       \"                    width = entry.contentBoxSize[0].inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize[0].blockSize;\\n\",\n       \"                } else {\\n\",\n       \"                    // Firefox implements old version of spec.\\n\",\n       \"                    width = entry.contentBoxSize.inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize.blockSize;\\n\",\n       \"                }\\n\",\n       \"            } else {\\n\",\n       \"                // Chrome <84 implements even older version of spec.\\n\",\n       \"                width = entry.contentRect.width;\\n\",\n       \"                height = entry.contentRect.height;\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            // Keep the size of the canvas and rubber band canvas in sync with\\n\",\n       \"            // the canvas container.\\n\",\n       \"            if (entry.devicePixelContentBoxSize) {\\n\",\n       \"                // Chrome 84 implements new version of spec.\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'width',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].inlineSize\\n\",\n       \"                );\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'height',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].blockSize\\n\",\n       \"                );\\n\",\n       \"            } else {\\n\",\n       \"                canvas.setAttribute('width', width * fig.ratio);\\n\",\n       \"                canvas.setAttribute('height', height * fig.ratio);\\n\",\n       \"            }\\n\",\n       \"            canvas.setAttribute(\\n\",\n       \"                'style',\\n\",\n       \"                'width: ' + width + 'px; height: ' + height + 'px;'\\n\",\n       \"            );\\n\",\n       \"\\n\",\n       \"            rubberband_canvas.setAttribute('width', width);\\n\",\n       \"            rubberband_canvas.setAttribute('height', height);\\n\",\n       \"\\n\",\n       \"            // And update the size in Python. We ignore the initial 0/0 size\\n\",\n       \"            // that occurs as the element is placed into the DOM, which should\\n\",\n       \"            // otherwise not happen due to the minimum size styling.\\n\",\n       \"            if (width != 0 && height != 0) {\\n\",\n       \"                fig.request_resize(width, height);\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    });\\n\",\n       \"    resizeObserver.observe(canvas_div);\\n\",\n       \"\\n\",\n       \"    function on_mouse_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.mouse_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousedown',\\n\",\n       \"        on_mouse_event_closure('button_press')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseup',\\n\",\n       \"        on_mouse_event_closure('button_release')\\n\",\n       \"    );\\n\",\n       \"    // Throttle sequential mouse events to 1 every 20ms.\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousemove',\\n\",\n       \"        on_mouse_event_closure('motion_notify')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseenter',\\n\",\n       \"        on_mouse_event_closure('figure_enter')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseleave',\\n\",\n       \"        on_mouse_event_closure('figure_leave')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener('wheel', function (event) {\\n\",\n       \"        if (event.deltaY < 0) {\\n\",\n       \"            event.step = 1;\\n\",\n       \"        } else {\\n\",\n       \"            event.step = -1;\\n\",\n       \"        }\\n\",\n       \"        on_mouse_event_closure('scroll')(event);\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    canvas_div.appendChild(canvas);\\n\",\n       \"    canvas_div.appendChild(rubberband_canvas);\\n\",\n       \"\\n\",\n       \"    this.rubberband_context = rubberband_canvas.getContext('2d');\\n\",\n       \"    this.rubberband_context.strokeStyle = '#000000';\\n\",\n       \"\\n\",\n       \"    this._resize_canvas = function (width, height, forward) {\\n\",\n       \"        if (forward) {\\n\",\n       \"            canvas_div.style.width = width + 'px';\\n\",\n       \"            canvas_div.style.height = height + 'px';\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    // Disable right mouse context menu.\\n\",\n       \"    this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\\n\",\n       \"        event.preventDefault();\\n\",\n       \"        return false;\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    function set_focus() {\\n\",\n       \"        canvas.focus();\\n\",\n       \"        canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    window.setTimeout(set_focus, 100);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'mpl-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var button = (fig.buttons[name] = document.createElement('button'));\\n\",\n       \"        button.classList = 'mpl-widget';\\n\",\n       \"        button.setAttribute('role', 'button');\\n\",\n       \"        button.setAttribute('aria-disabled', 'false');\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"\\n\",\n       \"        var icon_img = document.createElement('img');\\n\",\n       \"        icon_img.src = '_images/' + image + '.png';\\n\",\n       \"        icon_img.srcset = '_images/' + image + '_large.png 2x';\\n\",\n       \"        icon_img.alt = tooltip;\\n\",\n       \"        button.appendChild(icon_img);\\n\",\n       \"\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fmt_picker = document.createElement('select');\\n\",\n       \"    fmt_picker.classList = 'mpl-widget';\\n\",\n       \"    toolbar.appendChild(fmt_picker);\\n\",\n       \"    this.format_dropdown = fmt_picker;\\n\",\n       \"\\n\",\n       \"    for (var ind in mpl.extensions) {\\n\",\n       \"        var fmt = mpl.extensions[ind];\\n\",\n       \"        var option = document.createElement('option');\\n\",\n       \"        option.selected = fmt === mpl.default_extension;\\n\",\n       \"        option.innerHTML = fmt;\\n\",\n       \"        fmt_picker.appendChild(option);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\\n\",\n       \"    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\\n\",\n       \"    // which will in turn request a refresh of the image.\\n\",\n       \"    this.send_message('resize', { width: x_pixels, height: y_pixels });\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_message = function (type, properties) {\\n\",\n       \"    properties['type'] = type;\\n\",\n       \"    properties['figure_id'] = this.id;\\n\",\n       \"    this.ws.send(JSON.stringify(properties));\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_draw_message = function () {\\n\",\n       \"    if (!this.waiting) {\\n\",\n       \"        this.waiting = true;\\n\",\n       \"        this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    var format_dropdown = fig.format_dropdown;\\n\",\n       \"    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\\n\",\n       \"    fig.ondownload(fig, format);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_resize = function (fig, msg) {\\n\",\n       \"    var size = msg['size'];\\n\",\n       \"    if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\\n\",\n       \"        fig._resize_canvas(size[0], size[1], msg['forward']);\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\\n\",\n       \"    var x0 = msg['x0'] / fig.ratio;\\n\",\n       \"    var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\\n\",\n       \"    var x1 = msg['x1'] / fig.ratio;\\n\",\n       \"    var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\\n\",\n       \"    x0 = Math.floor(x0) + 0.5;\\n\",\n       \"    y0 = Math.floor(y0) + 0.5;\\n\",\n       \"    x1 = Math.floor(x1) + 0.5;\\n\",\n       \"    y1 = Math.floor(y1) + 0.5;\\n\",\n       \"    var min_x = Math.min(x0, x1);\\n\",\n       \"    var min_y = Math.min(y0, y1);\\n\",\n       \"    var width = Math.abs(x1 - x0);\\n\",\n       \"    var height = Math.abs(y1 - y0);\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.clearRect(\\n\",\n       \"        0,\\n\",\n       \"        0,\\n\",\n       \"        fig.canvas.width / fig.ratio,\\n\",\n       \"        fig.canvas.height / fig.ratio\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\\n\",\n       \"    // Updates the figure title.\\n\",\n       \"    fig.header.textContent = msg['label'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_cursor = function (fig, msg) {\\n\",\n       \"    var cursor = msg['cursor'];\\n\",\n       \"    switch (cursor) {\\n\",\n       \"        case 0:\\n\",\n       \"            cursor = 'pointer';\\n\",\n       \"            break;\\n\",\n       \"        case 1:\\n\",\n       \"            cursor = 'default';\\n\",\n       \"            break;\\n\",\n       \"        case 2:\\n\",\n       \"            cursor = 'crosshair';\\n\",\n       \"            break;\\n\",\n       \"        case 3:\\n\",\n       \"            cursor = 'move';\\n\",\n       \"            break;\\n\",\n       \"    }\\n\",\n       \"    fig.rubberband_canvas.style.cursor = cursor;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_message = function (fig, msg) {\\n\",\n       \"    fig.message.textContent = msg['message'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_draw = function (fig, _msg) {\\n\",\n       \"    // Request the server to send over a new figure.\\n\",\n       \"    fig.send_draw_message();\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\\n\",\n       \"    fig.image_mode = msg['mode'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\\n\",\n       \"    for (var key in msg) {\\n\",\n       \"        if (!(key in fig.buttons)) {\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"        fig.buttons[key].disabled = !msg[key];\\n\",\n       \"        fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\\n\",\n       \"    if (msg['mode'] === 'PAN') {\\n\",\n       \"        fig.buttons['Pan'].classList.add('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    } else if (msg['mode'] === 'ZOOM') {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.add('active');\\n\",\n       \"    } else {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Called whenever the canvas gets updated.\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// A function to construct a web socket function for onmessage handling.\\n\",\n       \"// Called in the figure constructor.\\n\",\n       \"mpl.figure.prototype._make_on_message_function = function (fig) {\\n\",\n       \"    return function socket_on_message(evt) {\\n\",\n       \"        if (evt.data instanceof Blob) {\\n\",\n       \"            /* FIXME: We get \\\"Resource interpreted as Image but\\n\",\n       \"             * transferred with MIME type text/plain:\\\" errors on\\n\",\n       \"             * Chrome.  But how to set the MIME type?  It doesn't seem\\n\",\n       \"             * to be part of the websocket stream */\\n\",\n       \"            evt.data.type = 'image/png';\\n\",\n       \"\\n\",\n       \"            /* Free the memory for the previous frames */\\n\",\n       \"            if (fig.imageObj.src) {\\n\",\n       \"                (window.URL || window.webkitURL).revokeObjectURL(\\n\",\n       \"                    fig.imageObj.src\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\\n\",\n       \"                evt.data\\n\",\n       \"            );\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        } else if (\\n\",\n       \"            typeof evt.data === 'string' &&\\n\",\n       \"            evt.data.slice(0, 21) === 'data:image/png;base64'\\n\",\n       \"        ) {\\n\",\n       \"            fig.imageObj.src = evt.data;\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var msg = JSON.parse(evt.data);\\n\",\n       \"        var msg_type = msg['type'];\\n\",\n       \"\\n\",\n       \"        // Call the  \\\"handle_{type}\\\" callback, which takes\\n\",\n       \"        // the figure and JSON message as its only arguments.\\n\",\n       \"        try {\\n\",\n       \"            var callback = fig['handle_' + msg_type];\\n\",\n       \"        } catch (e) {\\n\",\n       \"            console.log(\\n\",\n       \"                \\\"No handler for the '\\\" + msg_type + \\\"' message type: \\\",\\n\",\n       \"                msg\\n\",\n       \"            );\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        if (callback) {\\n\",\n       \"            try {\\n\",\n       \"                // console.log(\\\"Handling '\\\" + msg_type + \\\"' message: \\\", msg);\\n\",\n       \"                callback(fig, msg);\\n\",\n       \"            } catch (e) {\\n\",\n       \"                console.log(\\n\",\n       \"                    \\\"Exception inside the 'handler_\\\" + msg_type + \\\"' callback:\\\",\\n\",\n       \"                    e,\\n\",\n       \"                    e.stack,\\n\",\n       \"                    msg\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\\n\",\n       \"mpl.findpos = function (e) {\\n\",\n       \"    //this section is from http://www.quirksmode.org/js/events_properties.html\\n\",\n       \"    var targ;\\n\",\n       \"    if (!e) {\\n\",\n       \"        e = window.event;\\n\",\n       \"    }\\n\",\n       \"    if (e.target) {\\n\",\n       \"        targ = e.target;\\n\",\n       \"    } else if (e.srcElement) {\\n\",\n       \"        targ = e.srcElement;\\n\",\n       \"    }\\n\",\n       \"    if (targ.nodeType === 3) {\\n\",\n       \"        // defeat Safari bug\\n\",\n       \"        targ = targ.parentNode;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // pageX,Y are the mouse positions relative to the document\\n\",\n       \"    var boundingRect = targ.getBoundingClientRect();\\n\",\n       \"    var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\\n\",\n       \"    var y = e.pageY - (boundingRect.top + document.body.scrollTop);\\n\",\n       \"\\n\",\n       \"    return { x: x, y: y };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"/*\\n\",\n       \" * return a copy of an object with only non-object keys\\n\",\n       \" * we need this to avoid circular references\\n\",\n       \" * http://stackoverflow.com/a/24161582/3208463\\n\",\n       \" */\\n\",\n       \"function simpleKeys(original) {\\n\",\n       \"    return Object.keys(original).reduce(function (obj, key) {\\n\",\n       \"        if (typeof original[key] !== 'object') {\\n\",\n       \"            obj[key] = original[key];\\n\",\n       \"        }\\n\",\n       \"        return obj;\\n\",\n       \"    }, {});\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.mouse_event = function (event, name) {\\n\",\n       \"    var canvas_pos = mpl.findpos(event);\\n\",\n       \"\\n\",\n       \"    if (name === 'button_press') {\\n\",\n       \"        this.canvas.focus();\\n\",\n       \"        this.canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var x = canvas_pos.x * this.ratio;\\n\",\n       \"    var y = canvas_pos.y * this.ratio;\\n\",\n       \"\\n\",\n       \"    this.send_message(name, {\\n\",\n       \"        x: x,\\n\",\n       \"        y: y,\\n\",\n       \"        button: event.button,\\n\",\n       \"        step: event.step,\\n\",\n       \"        guiEvent: simpleKeys(event),\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    /* This prevents the web browser from automatically changing to\\n\",\n       \"     * the text insertion cursor when the button is pressed.  We want\\n\",\n       \"     * to control all of the cursor setting manually through the\\n\",\n       \"     * 'cursor' event from matplotlib */\\n\",\n       \"    event.preventDefault();\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (_event, _name) {\\n\",\n       \"    // Handle any extra behaviour associated with a key event\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.key_event = function (event, name) {\\n\",\n       \"    // Prevent repeat events\\n\",\n       \"    if (name === 'key_press') {\\n\",\n       \"        if (event.which === this._key) {\\n\",\n       \"            return;\\n\",\n       \"        } else {\\n\",\n       \"            this._key = event.which;\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"    if (name === 'key_release') {\\n\",\n       \"        this._key = null;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var value = '';\\n\",\n       \"    if (event.ctrlKey && event.which !== 17) {\\n\",\n       \"        value += 'ctrl+';\\n\",\n       \"    }\\n\",\n       \"    if (event.altKey && event.which !== 18) {\\n\",\n       \"        value += 'alt+';\\n\",\n       \"    }\\n\",\n       \"    if (event.shiftKey && event.which !== 16) {\\n\",\n       \"        value += 'shift+';\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    value += 'k';\\n\",\n       \"    value += event.which.toString();\\n\",\n       \"\\n\",\n       \"    this._key_event_extra(event, name);\\n\",\n       \"\\n\",\n       \"    this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onclick = function (name) {\\n\",\n       \"    if (name === 'download') {\\n\",\n       \"        this.handle_save(this, null);\\n\",\n       \"    } else {\\n\",\n       \"        this.send_message('toolbar_button', { name: name });\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\\n\",\n       \"    this.message.textContent = tooltip;\\n\",\n       \"};\\n\",\n       \"mpl.toolbar_items = [[\\\"Home\\\", \\\"Reset original view\\\", \\\"fa fa-home icon-home\\\", \\\"home\\\"], [\\\"Back\\\", \\\"Back to previous view\\\", \\\"fa fa-arrow-left icon-arrow-left\\\", \\\"back\\\"], [\\\"Forward\\\", \\\"Forward to next view\\\", \\\"fa fa-arrow-right icon-arrow-right\\\", \\\"forward\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Pan\\\", \\\"Left button pans, Right button zooms\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-arrows icon-move\\\", \\\"pan\\\"], [\\\"Zoom\\\", \\\"Zoom to rectangle\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-square-o icon-check-empty\\\", \\\"zoom\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Download\\\", \\\"Download plot\\\", \\\"fa fa-floppy-o icon-save\\\", \\\"download\\\"]];\\n\",\n       \"\\n\",\n       \"mpl.extensions = [\\\"eps\\\", \\\"jpeg\\\", \\\"pdf\\\", \\\"png\\\", \\\"ps\\\", \\\"raw\\\", \\\"svg\\\", \\\"tif\\\"];\\n\",\n       \"\\n\",\n       \"mpl.default_extension = \\\"png\\\";/* global mpl */\\n\",\n       \"\\n\",\n       \"var comm_websocket_adapter = function (comm) {\\n\",\n       \"    // Create a \\\"websocket\\\"-like object which calls the given IPython comm\\n\",\n       \"    // object with the appropriate methods. Currently this is a non binary\\n\",\n       \"    // socket, so there is still some room for performance tuning.\\n\",\n       \"    var ws = {};\\n\",\n       \"\\n\",\n       \"    ws.close = function () {\\n\",\n       \"        comm.close();\\n\",\n       \"    };\\n\",\n       \"    ws.send = function (m) {\\n\",\n       \"        //console.log('sending', m);\\n\",\n       \"        comm.send(m);\\n\",\n       \"    };\\n\",\n       \"    // Register the callback with on_msg.\\n\",\n       \"    comm.on_msg(function (msg) {\\n\",\n       \"        //console.log('receiving', msg['content']['data'], msg);\\n\",\n       \"        // Pass the mpl event to the overridden (by mpl) onmessage function.\\n\",\n       \"        ws.onmessage(msg['content']['data']);\\n\",\n       \"    });\\n\",\n       \"    return ws;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.mpl_figure_comm = function (comm, msg) {\\n\",\n       \"    // This is the function which gets called when the mpl process\\n\",\n       \"    // starts-up an IPython Comm through the \\\"matplotlib\\\" channel.\\n\",\n       \"\\n\",\n       \"    var id = msg.content.data.id;\\n\",\n       \"    // Get hold of the div created by the display call when the Comm\\n\",\n       \"    // socket was opened in Python.\\n\",\n       \"    var element = document.getElementById(id);\\n\",\n       \"    var ws_proxy = comm_websocket_adapter(comm);\\n\",\n       \"\\n\",\n       \"    function ondownload(figure, _format) {\\n\",\n       \"        window.open(figure.canvas.toDataURL());\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fig = new mpl.figure(id, ws_proxy, ondownload, element);\\n\",\n       \"\\n\",\n       \"    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\\n\",\n       \"    // web socket which is closed, not our websocket->open comm proxy.\\n\",\n       \"    ws_proxy.onopen();\\n\",\n       \"\\n\",\n       \"    fig.parent_element = element;\\n\",\n       \"    fig.cell_info = mpl.find_output_cell(\\\"<div id='\\\" + id + \\\"'></div>\\\");\\n\",\n       \"    if (!fig.cell_info) {\\n\",\n       \"        console.error('Failed to find cell for figure', id, fig);\\n\",\n       \"        return;\\n\",\n       \"    }\\n\",\n       \"    fig.cell_info[0].output_area.element.one(\\n\",\n       \"        'cleared',\\n\",\n       \"        { fig: fig },\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_close = function (fig, msg) {\\n\",\n       \"    var width = fig.canvas.width / fig.ratio;\\n\",\n       \"    fig.cell_info[0].output_area.element.off(\\n\",\n       \"        'cleared',\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    // Update the output cell to use the data from the current canvas.\\n\",\n       \"    fig.push_to_output();\\n\",\n       \"    var dataURL = fig.canvas.toDataURL();\\n\",\n       \"    // Re-enable the keyboard manager in IPython - without this line, in FF,\\n\",\n       \"    // the notebook keyboard shortcuts fail.\\n\",\n       \"    IPython.keyboard_manager.enable();\\n\",\n       \"    fig.parent_element.innerHTML =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"    fig.close_ws(fig, msg);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.close_ws = function (fig, msg) {\\n\",\n       \"    fig.send_message('closing', msg);\\n\",\n       \"    // fig.ws.close()\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\\n\",\n       \"    // Turn the data on the canvas into data in the output cell.\\n\",\n       \"    var width = this.canvas.width / this.ratio;\\n\",\n       \"    var dataURL = this.canvas.toDataURL();\\n\",\n       \"    this.cell_info[1]['text/html'] =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Tell IPython that the notebook contents must change.\\n\",\n       \"    IPython.notebook.set_dirty(true);\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"    var fig = this;\\n\",\n       \"    // Wait a second, then push the new image to the DOM so\\n\",\n       \"    // that it is saved nicely (might be nice to debounce this).\\n\",\n       \"    setTimeout(function () {\\n\",\n       \"        fig.push_to_output();\\n\",\n       \"    }, 1000);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'btn-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'btn-group';\\n\",\n       \"    var button;\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'btn-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        button = fig.buttons[name] = document.createElement('button');\\n\",\n       \"        button.classList = 'btn btn-default';\\n\",\n       \"        button.href = '#';\\n\",\n       \"        button.title = name;\\n\",\n       \"        button.innerHTML = '<i class=\\\"fa ' + image + ' fa-lg\\\"></i>';\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Add the status bar.\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message pull-right';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"\\n\",\n       \"    // Add the close button to the window.\\n\",\n       \"    var buttongrp = document.createElement('div');\\n\",\n       \"    buttongrp.classList = 'btn-group inline pull-right';\\n\",\n       \"    button = document.createElement('button');\\n\",\n       \"    button.classList = 'btn btn-mini btn-primary';\\n\",\n       \"    button.href = '#';\\n\",\n       \"    button.title = 'Stop Interaction';\\n\",\n       \"    button.innerHTML = '<i class=\\\"fa fa-power-off icon-remove icon-large\\\"></i>';\\n\",\n       \"    button.addEventListener('click', function (_evt) {\\n\",\n       \"        fig.handle_close(fig, {});\\n\",\n       \"    });\\n\",\n       \"    button.addEventListener(\\n\",\n       \"        'mouseover',\\n\",\n       \"        on_mouseover_closure('Stop Interaction')\\n\",\n       \"    );\\n\",\n       \"    buttongrp.appendChild(button);\\n\",\n       \"    var titlebar = this.root.querySelector('.ui-dialog-titlebar');\\n\",\n       \"    titlebar.insertBefore(buttongrp, titlebar.firstChild);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._remove_fig_handler = function (event) {\\n\",\n       \"    var fig = event.data.fig;\\n\",\n       \"    fig.close_ws(fig, {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (el) {\\n\",\n       \"    el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (el) {\\n\",\n       \"    // this is important to make the div 'focusable\\n\",\n       \"    el.setAttribute('tabindex', 0);\\n\",\n       \"    // reach out to IPython and tell the keyboard manager to turn it's self\\n\",\n       \"    // off when our div gets focus\\n\",\n       \"\\n\",\n       \"    // location in version 3\\n\",\n       \"    if (IPython.notebook.keyboard_manager) {\\n\",\n       \"        IPython.notebook.keyboard_manager.register_events(el);\\n\",\n       \"    } else {\\n\",\n       \"        // location in version 2\\n\",\n       \"        IPython.keyboard_manager.register_events(el);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (event, _name) {\\n\",\n       \"    var manager = IPython.notebook.keyboard_manager;\\n\",\n       \"    if (!manager) {\\n\",\n       \"        manager = IPython.keyboard_manager;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Check for shift+enter\\n\",\n       \"    if (event.shiftKey && event.which === 13) {\\n\",\n       \"        this.canvas_div.blur();\\n\",\n       \"        // select the cell after this one\\n\",\n       \"        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\\n\",\n       \"        IPython.notebook.select(index + 1);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    fig.ondownload(fig, null);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.find_output_cell = function (html_output) {\\n\",\n       \"    // Return the cell and output element which can be found *uniquely* in the notebook.\\n\",\n       \"    // Note - this is a bit hacky, but it is done because the \\\"notebook_saving.Notebook\\\"\\n\",\n       \"    // IPython event is triggered only after the cells have been serialised, which for\\n\",\n       \"    // our purposes (turning an active figure into a static one), is too late.\\n\",\n       \"    var cells = IPython.notebook.get_cells();\\n\",\n       \"    var ncells = cells.length;\\n\",\n       \"    for (var i = 0; i < ncells; i++) {\\n\",\n       \"        var cell = cells[i];\\n\",\n       \"        if (cell.cell_type === 'code') {\\n\",\n       \"            for (var j = 0; j < cell.output_area.outputs.length; j++) {\\n\",\n       \"                var data = cell.output_area.outputs[j];\\n\",\n       \"                if (data.data) {\\n\",\n       \"                    // IPython >= 3 moved mimebundle to data attribute of output\\n\",\n       \"                    data = data.data;\\n\",\n       \"                }\\n\",\n       \"                if (data['text/html'] === html_output) {\\n\",\n       \"                    return [cell, data, j];\\n\",\n       \"                }\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// Register the function which deals with the matplotlib target/channel.\\n\",\n       \"// The kernel may be null if the page has been refreshed.\\n\",\n       \"if (IPython.notebook.kernel !== null) {\\n\",\n       \"    IPython.notebook.kernel.comm_manager.register_target(\\n\",\n       \"        'matplotlib',\\n\",\n       \"        mpl.mpl_figure_comm\\n\",\n       \"    );\\n\",\n       \"}\\n\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.Javascript object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<img src=\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4XuydCbiN1f7HfxyOecpUGZJKs6FQ4irFdUuD2y1CZpUGES4RGaPSFaFoQDLrFs1K3ZC6SooQTUgZKuJmPKb/81v37vM/jn3O2fus/e53+qzn6al413rX+qzv3uu71/BbeY4fP35cSBCAAAQgAAEIQAACoSGQBwMYmr6moRCAAAQgAAEIQMAQwAAiBAhAAAIQgAAEIBAyAhjAkHU4zYUABCAAAQhAAAIYQDQAAQhAAAIQgAAEQkYAAxiyDqe5EIAABCAAAQhAAAOIBiAAAQhAAAIQgEDICGAAQ9bhNBcCEIAABCAAAQhgANEABCAAAQhAAAIQCBkBDGDIOpzmQgACEIAABCAAAQwgGoAABCAAAQhAAAIhI4ABDFmH01wIQAACEIAABCCAAUQDEIAABCAAAQhAIGQEMIAh63CaCwEIQAACEIAABDCAaAACEIAABCAAAQiEjAAGMGQdTnMhAAEIQAACEIAABhANQAACEIAABCAAgZARwACGrMNpLgQgAAEIQAACEMAAogEIQAACEIAABCAQMgIYwJB1OM2FAAQgAAEIQAACGEA0AAEIQAACEIAABEJGAAMYsg6nuRCAAAQgAAEIQAADiAYgAAEIQAACEIBAyAhgAEPW4TQXAhCAAAQgAAEIYADRAAQgAAEIQAACEAgZAQxgyDqc5kIAAhCAAAQgAAEMIBqAAAQgAAEIQAACISOAAQxZh9NcCEAAAhCAAAQggAFEAxCAAAQgAAEIQCBkBDCAIetwmgsBCEAAAhCAAAQwgGgAAhCAAAQgAAEIhIwABjBkHU5zIQABCEAAAhCAAAYQDUAAAhCAAAQgAIGQEcAAhqzDaS4EIAABCEAAAhDAAKIBCEAAAhCAAAQgEDICGMCQdTjNhQAEIAABCEAAAhhANAABCEAAAhCAAARCRgADGLIOp7kQgAAEIAABCEAAA4gGIAABCEAAAhCAQMgIYABD1uE0FwIQgAAEIAABCGAA0QAEIAABCEAAAhAIGQEMYMg6nOZCAAIQgAAEIAABDCAagAAEIAABCEAAAiEjgAEMWYfTXAhAAAIQgAAEIIABRAMQgAAEIAABCEAgZAQwgCHrcJoLAQhAAAIQgAAEMIBoAAIQgAAEIAABCISMAAYwZB1OcyEAAQhAAAIQgAAGEA1AAAIQgAAEIACBkBHAAIasw2kuBCAAAQhAAAIQwACiAQhAAAIQgAAEIBAyAhjAkHU4zYUABCAAAQhAAAIYQDQAAQhAAAIQgAAEQkYAAxiyDqe5EIAABCAAAQhAAAOIBiAAAQhAAAIQgEDICGAAQ9bhNBcCEIAABCAAAQhgANEABCAAAQhAAAIQCBkBDKBFhx87dky2bt0qxYoVkzx58liURFYIQAACEIAABJJF4Pjx4/LHH3/I6aefLnnz5k3Waz31HgygRXf89NNPUqlSJYsSyAoBCEAAAhCAgFsEtmzZIhUrVnTr9a6+FwNogX/Pnj1SsmRJUQEVL17coiSyQgACEIAABCCQLAL/+c9/zATO7t27pUSJEsl6rafegwG06A4VkApHjSAG0AIkWSEAAQhAAAJJJMD4LYIBtBAcArKAR1YIQAACEICASwQYvzGAVtJDQFb4yAwBCEAAAhBwhQDjNwbQSngIyAofmSEAAQhAAAKuEGD8xgBaCQ8BWeEjMwQgAAEIQMAVAozfGEAr4SEgK3xkhgAEIAABCLhCgPEbA2glPARkhY/MEIAABCAAAVcIMH5jAK2Eh4Cs8JEZAhCAAAQg4AoBxm8MoJXwEJAVPjJDAAIQgAAEXCHA+I0BtBIeArLCR2YIQAACEICAKwQYvwNkAJcsWSKjRo2Szz//XLZt2yavvvqqNG/ePFthffjhh9KzZ09Zu3atuRJmwIAB0qFDh5jFiIBiRsWDEIAABCAAAc8QYPwOkAF8++23ZdmyZXLppZfKzTffnKMB3Lhxo1x00UXStWtX6dKli7z//vvSo0cPefPNN6Vp06YxiRQBxYSJhyAAAQhAAAKeIsD4HSADmFFZefLkydEA9u3b15i9NWvWpGe97bbbzMXQ77zzTkxCRUAxYeIhCEAAAhCAQLYEjh8/LgcOH436TKH8KaLjeiIT43eIDWDDhg3lkksukTFjxqRrasqUKWYWcM+ePVF1dujQIdF/IkkFpEvH+nzx4sUTqU3KggAEIAABCHieQHbGLdbKHz8ucuvET2Tdtv9EzbJuaFMpnJov1uJieg4DGGIDWK1aNenYsaP069cvXSxvvfWWNGvWTPbv3y+FChU6SUSDBw+WIUOGnPTnGMCYPm88BAEIQAACLhBIhEmLVu2cjFuimooBTBTJE8vJc1yVEbAUyxJwbgwgM4ABEwrNgQAEIOBhAokwbskyaYnAeMFpxWXirdWkV4/7pf+AgXLueeeZYlkCTgTdk8sIrQHMzRJwZnxMITsjSkqFAAQgECYC0Yye34zbvK71xHab3hefLZdWrVrJli1bpE6dOrJ8+fKE7/2L6IrxO8RLwHoIRJd8v/rqq/TvmdatW8uuXbs4BBKmb17aCgEIQCCJBDKbvWQZPZ1dS4RJi4bKdobu2LFjJozbQw89JEePHpVzzjlH5s6dKzVr1nSsZzCAATKAe/fule+++86IpVatWjJ69Ghp1KiRnHLKKVK5cmWz1+/nn3+WadOmmWciYWDuvfde6dSpk3zwwQdy//33EwbGsY8bBUMAAhAIB4Gslm5zY/YSZdxsTZpTPffrr79Ku3bt0idedCJm4sSJUqxYMadeacrFAAbIAGpQZzV8mVP79u1l6tSpJsDzpk2bRJ+LJP3vBx54QNatWycVK1aUgQMHEgja0Y8chUMAAhDwP4Hs9ublxuQpkayMnleNWyJ6USdtrrzyStm6dasULFhQxo8fbyZkEh3yJVpdMYABMoCJEGO8ZSCgeInxPAQgAAFvEYj3oEVuDV7GVkcze0E2eln1+JEjR+Sqq66SnTt3yrx588zlDMlKjN8YQCutISArfGSGAAQgkFQCydx/l93SbRjNXqSjf/nlFylZsqSkpqaaP9q+fbsULVrU/JPMxPiNAbTSGwKywkdmCEAAAkkjoObvlomfyOebf0/IO3Pamxdmk5cVYL1ytU2bNqL7/HSfvpuJ8RsDaKU/BGSFj8wQgAAEEkogu+Xc/WlHpfbwRVHfl5OZi5YJgxd71+nJ3qFDh8qwYcNE++jiiy+Wf//731K4cOHYC0nwk4zfGEArSSEgK3xkhgAEIJAwAvHM8K0Y0FgKp6akvxszl7BuOKkgPeChM36LFy82f9elSxcZO3asq+ZP68H4jQG0Uj0CssJHZghAAALWBCKzftnN8GV8Se0zSv0vHl4e63dTQPYEFi5cKG3bthUN9aJ7/CZNmmTMoBcS4zcG0EqHCMgKH5khAAEIWBHIatYv8wxfxpcw22eFPObMu3fvlipVqsiePXukRo0aJrCzXsHqlcT4jQG00iICssJHZghAAAJxEci8xy/arB8zfHEhdfRhNX3/+te/5MknnzRx/ryUGL8xgFZ6REBW+MgMAQhAIEsC8YZsicz6McPnnqjefPNNKVSokFx99dXuVSLGNzN+YwBjlEr0xxCQFT4yQwACEDiBQMT0xRtsmVk/d4V0+PBh6d+/vzzxxBNSvnx5+fLLL+XUU091t1I5vJ3xGwNoJVAEZIWPzBCAAATSCcR6ipdbNLwlms2bN0vLli1l+fLlpmL333+/PP7441KgQAFvVTRTbRi/MYBWAkVAVvjIDAEIQMAQUPO3c1/aSXH6MHveFsj8+fOlY8eOogc+9HaPKVOmSPPmzb1d6f/VjvEbA2glVARkhY/MEIBACAnEsreP/XzeFoYGdu7Vq5eJ56fpsssuk9mzZ5tTv35JjN8YQCutIiArfGSGAAQCTCDarRyx7O1jP5/3RaF9265dO5k+fboxgiNGjEi/29f7tf9vDRm/MYBWWkVAVvjIDAEIBJRArPv5MjY/styrN3TkyUOQZi9KQw975M+f31Rt7969smzZMmnatKkXq5pjnRi/MYA5iiS7BxCQFT4yQwACASWwP+2IXPDwwixbx94+f3X8wYMHzUzfli1bZMGCBYEw6IzfGECrTyECssJHZghAIIAEMh/oiHYrB7H6/NPx3377rbRo0cKEdtG0ZMkS+dOf/uSfBmRRU8ZvDKCViBGQFT4yQwACPiQQbW9fpBnR9vitG9pUCqfm82FLqfKsWbPkzjvvNMu9ZcqUkZdeekn+8pe/BAIM4zcG0ErICMgKH5khAAGfEYh3bx8HOnzWwf+r7oEDB6R79+7y3HPPmT9p2LChzJw5UypUqODPBkWpNeM3BtBKzAjICh+ZIQABnxHIaW9fpDkc6PBZx2aq7k033SSvvfaa2ev30EMPyaBBgyRfvmDN4jJ+YwCtPqUIyAofmSEAAY8TyLzcuz/taHqw5mh7+yLNYY+fxzs2h+p9+umn8re//c0Edm7cuLG/G5NF7Rm/MYBWwkZAVvjIDAEIeIhALAGaM1aXvX0e6jzLquzbt0/U9DVq1Ci9pEOHDnn+OjebZjN+YwBt9EMgSSt6ZIYABNwgkNsAzRnryt4+N3rOmXeuXbvWnPL9/vvvzX2+NWrUcOZFHisVA4gBtJIkArLCR2YIQMBhAvHO6kWrDjH7HO4kl4pXbegS73333Sd66OP000+XefPmyRVXXOFSjZL7WsZvDKCV4hCQFT4yQwACDhKI98SuVgWz52CHeKjoP/74Q+6++26ZMWOGqZXe5qEhXsqWLeuhWjpbFcZvDKCVwhCQFT4yQwACDhHIHIw582uiGT19hsMbDnWIh4pdtWqVWfL95ptvJCUlRYYPHy59+vSRvHnzeqiWzleF8RsDaKUyBGSFj8wQgEAuCcQbjDnziV2MXi7BByDbI488IgMGDJCKFSvK7NmzpX79+gFoVfxNYPzGAMavmgw5EJAVPjJDAAJxEIiYvmi3bWRXDAc24oAcgkePHj0qw4YNk27duknp0qVD0OLoTWT8xgBaiR8BWeEjMwQgECMBm/18hVNTTEBfUjgJrFy50izz6n6/QoUKhRNClFYzfmMArT4MCMgKH5khAIEYCUS7gSOrfXyRIlnmjRFuQB/THw0TJkyQXr16SVpamvTr109GjBgR0NbG3yzGbwxg/KrJkAMBWeEjMwQgEAOBzAc6Ivv5MHgxwAvpI7t375bOnTvLK6+8Ygg0b95cJk+eLKVKlQopkZObzfiNAbT6MCAgK3xkhgAEciAQbemXGziQTXYE9EaPli1byqZNmyR//vzyxBNPmP1+bAM4kRrjNwbQ6psEAVnhIzMEIJAFgciBj4x37+qjHOhAMtkRmDt3rtx+++1y+PBhqVq1qsyZM0dq164NtCgEGL8xgFYfDARkhY/MEIBAJgJq/NT03TrxE1m37T8n/K0u/ZYukspMDqrJksCPP/4oNWvWlMaNG8tzzz0nJUqUgFYWBBi/MYBWHw4EZIWPzBCAQAYC2Z30ZeYPqWRFQE1f5cqV0/9al37POOMMfijkIBnGbwyg1bcKArLCR2YIQEBEslruzXjKlwMfSCUzgWPHjsmoUaNMUOdXX31Vrr/+eiDFQYDxGwMYh1xOfhQBWeEjMwRCSyCnoM4s94ZWGjE1/Ndff5X27dvL22+/bZ6/5557TMgXUuwEGL8xgLGrJcqTCMgKH5khEAoCma9ty+kmD5Z7QyGLXDdyyZIl0qpVK9m6dasULFhQxo0bZ0K+cMo3PqSM3xjA+BST6WkEZIWPzBAINIHsDnRkbjjLvYGWQkIap1e4jRw5UgYNGiS6/HveeeeJnvq9+OKLE1J+2Aph/MYAWmkeAVnhIzMEAkEg8wyfNiqnWT59BtMXiO5PWiMWLVokTZo0Me/T5V9d8i1SpEjS3h+0FzF+YwCtNI2ArPCRGQK+JxDrHb3Rrm3jYIfvuz/pDejZs6dUr15dOnTokPR3B+2FjN8YQCtNIyArfGSGgK8JZL6iLVpjIsavcGoKe7R83dvJr7wu+eotHjrbd+qppya/AgF/I+M3BtBK4gjICh+ZIeBbAtFm/iJ39GZsFLN8vu1iVyu+bds2ad26tXz44YdyzTXXyLvvvit58+Z1tU5BeznjNwbQStMIyAofmSHgOwJc0ea7LvNdhdXs6XVuGupF9/hNmjRJ2rRp47t2eL3CjN8YQCuNIiArfGSGgG8IcEWbb7rKtxU9cuSIOeGrJ31VbzVq1DCnfKtVq+bbNnm54ozfGEArfSIgK3xkhoCnCeQUrFkrT8w+T3ehbyq3Y8cOufXWW2Xp0qWmzl27dpUnn3zSxPkjOUOA8RsDaKUsBGSFj8wQ8ByBWEwf4Vs8122+r9Aff/whtWvXFt379/zzz0uLFi183yavN4DxGwNopVEEZIWPzBDwFIGcQrpwotdT3eX7yhw+fFjy5cuXfjp87dq1ZsbvrLPO8n3b/NAAxm8MoJVOEZAVPjJDwFME9qcdkQseXnhCnZjt81QXBaYymzdvlttuu83M9D3wwAOBaZefGsL4jQG00isCssJHZgh4hkDmmH6RkC6EcfFMFwWmIgsWLJCOHTvK77//LmXLlpUffvhBihYtGpj2+aUhjN8YQCutIiArfGSGgCcIRFv6XTe0qRROzeeJ+lGJYBBIS0uTvn37ypgxY0yD6tatK3PmzJEqVaoEo4E+awXjNwbQSrIIyAofmSHgCoHMd/fuTzsqtYcvSq8LJ3td6ZZAv3Tjxo3SsmVL+eyzz0w7e/XqJSNGjJDU1NRAt9vLjWP8xgBa6RMBWeEjMwSSRiCW071aGV36LV0klWvbktYzwX+RnvCtWrWq/Pbbb3LKKafI1KlT5YYbbgh+wz3eQsZvDKCVRBGQFT4yQ8BRArGavkglmPlztDtCXfg//vEPeeWVV2TWrFlSuXLlULPwSuMZvzGAVlpEQFb4yAwBxwjEGtIlT57/rwIHPhzrjtAV/N1334nu+bvgggtM21WPetNH/vz5Q8fCqw1m/MYAWmkTAVnhIzMEHCNASBfH0FJwDgRmz54td955p5x++umyYsUKTvh6VDGM3xhAK2kiICt8ZIaAIwQI6eIIVgrNgcCBAwekR48e8uyzz5onGzZsaO7yLV++POw8SIDxO2AGcMKECTJq1CjZvn27uUh73Lhx5qh9VkmP4z/zzDPy448/SpkyZeSWW24xF3HHev8iAvLgp5oqhZoAIV1C3f2uNX79+vUmqPNXX31lDhA99NBDMmjQIHPTB8mbBBi/A2QANZ5Su3btZOLEiXLZZZeZWEvz5s2TDRs2SLly5U5S4MyZM6VTp04yefJkueKKK+Sbb76RDh06mOjso0ePjkmxCCgmTDwEAccJRA58ENLFcdS8IBOBl156Se6++27Zt2+fme2bPn26NG7cGE4eJ8D4HSADqKavTp06Mn78eCO7Y8eOSaVKlaRbt27y4IMPniTF++67T77++mt5//330/9OYzMtX75cPvroo5iki4BiwsRDEHCUQFYHPgjp4ih2Cv/fONOkSRP54IMP5Oqrr5YZM2bIqaeeChsfEGD8DogB1NNWhQsXlpdfflmaN2+eLr327dvL7t27Ra/eyZx0BvCee+6Rd9991ywT63U8zZo1k7Zt20r//v1jki8CigkTD0HAMQKZ9/tFXkRIF8eQU3AmArrlaNq0aSa4c0pKCnx8QoDxOyAGcOvWrVKhQgX5+OOPpV69euny69OnjyxevNjM6kVLTz31lPTu3Tv9iH7Xrl3NnsCs0qFDh0T/iSQVkM4y7tmzR4oXL+4T2VNNCPibQHbx/bjD19996/Xaq/Y0kPOaNWtEY/uR/EsAAxhiA/jhhx+a/X7Dhw83ewY1blP37t3ljjvukIEDB0ZV9eDBg2XIkCEn/R0G0L9fAtTcXwSyi+/HrJ+/+tJvtd27d6/Z66d7/DQtWrRIrrnmGr81g/r+jwAGMCAGMDdLwH/605/k8ssvN6eGI0k/2Bq/ST/oefPmPemDwgwg3x0QcIdAVoc8tDYXnFZc5nWtJ4VTU7jCzZ3uCfxbV69ebU756qFCXeYdNmyY9O3bN+o4EXgYAWkgBjAgBlD1qLN4updPQ79o0kMgeuWOHvaIdgjk0ksvNSe1HnvssXQ56zU9nTt3Fr27MZa9HAgoIN8ENMPTBLI75KGmjxs8PN19vq6cau+5556T+++/32z/0a1GGui5QYMGvm4XlRdh/A6QAdQwMHroY9KkScYIahgYDcKp8Zn0aL6GiNEPr8b506TLuRruRYN2RpaAdXpfjaGWFUtCQLFQ4hkI2BGIdqsHy712TMkdGwE9KBjZF66HBHX/n8aMJfmfAON3gAygylFDwEQCQdesWVP0kIeaO01XXXWVVKlSxXyANem9jI888ohoDKeff/5ZypYtKzfccIP5s5IlS8akbgQUEyYegoAVgYwGkEMeVijJHCeB1157zVwQMGLECOnZsydLvnHy8/LjjN8BM4DJFhsCSjZx3hdGAhkN4LqhTaVwKrcrhFEHyWizLvlu3rzZTBZEkt4UpduJSMEiwPiNAbRSNAKywkdmCORIIHOcPwxgjsh4IJcENGZsly5d5F//+pd8+eWXJsQXKbgEGL8xgFbqRkBW+MgMgagEsovzhwFENE4Q+Oyzz6Rly5ayceNGyZ8/v+hFAbr0SwouAcZvDKCVuhGQFT4yQ+AEAmr89C7fWyd+Iuu2/eckOhz8QDCJJqCaGzt2rOilAYcPH5YzzzzTHALUa0VJwSbA+I0BtFI4ArLCR2YIpBPILsAzcf4QihMEdu3aJR07dhQ96KFJZ/yef/55KVGihBOvo0yPEWD8xgBaSRIBWeEjMwTMNYwHDh81M3+1hy9KJxIxfXnyCHH+0IkjBDQ+rMaBTU1NlSeffNLc8pFHBUcKBQHGbwygldARkBU+MoeYQHbLvRrqpXSRVAbjEOsjGU0/cOCAtGnTxlz9WatWrWS8knd4iADjNwbQSo4IyAofmUNGILvDHREU7PMLmSiS2NzffvvNxIp9+OGHieeXRO5efRXjNwbQSpsIyAofmUNEIJY9fiz3hkgQSW7q0qVLpVWrVibovwb779+/f5JrwOu8RoDxGwNopUkEZIWPzCEiEO06Nw53hEgALjVV74R/9NFHzazf0aNH5dxzzzVXhFavXt2lGvFarxBg/MYAWmkRAVnhI3OICHCdW4g62yNN/eWXX+T222+X9957z9Sobdu28vTTT0vRokU9UkOq4SYBxm8MoJX+EJAVPjKHiADXuYWosz3Q1GXLlpmwLtu3b5fChQvLhAkTpEOHDh6oGVXwCgHGbwyglRYRkBU+MoeIAAYwRJ3tgabqVW6XX365nH322WbJ94ILLvBAraiClwgwfmMArfSIgKzwkTkEBKLF+eM6txB0vAtNPHTokBQoUCD9zXqn72WXXWZmAEkQyEyA8RsDaPWpQEBW+MgccAJZnfzFAAa8411o3rvvviudO3eWV155hWvcXODvx1cyfmMArXSLgKzwkTngBKKd/CXOX8A7PcnNO3LkiAwaNEhGjhxpbpW56aabZP78+UmuBa/zIwHGbwyglW4RkBU+MgecACd/A97BLjfvp59+ktatW4vG+NPUtWtXGT16tBQqVMjlmvF6PxBg/MYAWukUAVnhI3PACXDwI+Ad7GLz3nrrLWnXrp3s3LlTihUrJs8995y0bNnSxRrxar8RYPzGAFppFgFZ4SNzwAlgAAPewS41b8mSJXLllVeat19yySUyZ84cc9qXBIF4CDB+YwDj0ctJzyIgK3xkDjgBDGDAO9il5untHjfeeKNUrVpVRo0adcLJX5eqxGt9SIDxGwNoJVsEZIWPzAEngAEMeAcnsXkLFy6U+vXrp9/icfjwYcmfP38Sa8CrgkaA8RsDaKVpBGSFj8wBJ4ABDHgHJ6F5aWlp0rdvXxkzZoy0b99epk6dmoS38oowEGD8xgBa6RwBWeEjc4AJaEiOnfvSpPbwRaaVxP4LcGc71LSNGzeagx2fffaZeUPPnj3Nkm/evHkdeiPFhokA4zcG0ErvCMgKH5kDSiBaAGgMYEA726FmaUDnTp06yZ49e6RUqVLy4osvyg033ODQ2yg2jAQYvzGAVrpHQFb4yBxQApkDQBP8OaAd7UCzDh48KH//+99l/PjxpvR69erJ7NmzpXLlyg68jSLDTIDxGwNopX8EZIWPzAElkDkAdOkiqZInT56AtpZmJZLA9u3bpXr16vLrr79Knz59ZPjw4Rz2SCRgykonwPiNAbT6OCAgK3xkDigBDn8EtGOT1Kz3339fDh06JNddd12S3shrwkiA8RsDaKV7BGSFj8wBJYABDGjHOtCsAwcOSI8ePaRx48Zy6623OvAGioRAdAKM3xhAq88GArLCR+aAEsAABrRjE9ysDRs2SIsWLWT16tVSsmRJ2bRpk5QoUSLBb6E4CGAAs9JAnuN6ZI+UKwIYwFxhI1PACWAAA97BCWje9OnTpWvXrrJv3z4pV66c6P83adIkASVTBARiI8D4zQxgbErJ4ikEZIWPzAElgAEMaMcmoFn79++Xbt26yeTJk01pjRo1khkzZshpp52WgNIpAgKxE2D8xgDGrpYoTyIgK3xkDigBDGBAO9ayWWr+6tatK2vXrjWnwgcNGiQDBgyQlJQUy5LJDoH4CTB+YwDjV02GHAjICh+ZA0ZAd5McOHxU9qcd5QaQgPVtopqjBz7mzJkjM2fONLN/JAi4RYDxGwNopT0EZIWPzAEiEO32D20eN4AEqJNz0ZS9e/eK/nPqqaea3Hq37+7du82+PxIE3CTA+O0hA6gR4AsWLOimHuJ+NwKKGxkZAkog8+0f2kxuAAloZ8fYLD3dq6d8y5YtK//6178kX758MebkMQg4T4Dx22UDeOzYMXnkkUdk4sSJsmPHDvnmm2+katWqMnDgQKlSpYp07tzZeRVYvAEBWeoSe5EAACAASURBVMAja2AI6Ozfzn1p6cu+KwY0lsKpKVIofwo3gASml2NviOrhueeek/vvv98EdK5QoYIsXrxYzjrrrNgL4UkIOEyA8dtlAzh06FBzybf++4477pA1a9YYA6h7RMaMGSOffPKJwxKwKx4B2fEjt38JRPb7aRCpWyd+Iuu2/Se9MSz7+rdfbWuu34l33XWXub9Xk97mod/xZcqUsS2a/BBIKAHGb5cN4Nlnny2TJk2Sa665RooVKyarVq0yBnD9+vXmEvDff/89oR2e6MIQUKKJUp4fCGS130/rzrKvH3rQmTquXLlSWrZsKd99951Z7h0xYoT06tVL8ubN68wLKRUCFgQYv102gIUKFTJm74wzzjjBAK5bt86EC9DNw15OCMjLvUPdnCIQbb/fBacVl3ld65mlXw3xQQoXAf1RUKdOHfn888+lcuXKZgZQf8STIOBVAozfLhvASy+9VB544AG5/fbbTzCAuiT83nvvydKlS72qHVMvBOTp7qFyCSYQLcwL+/0SDNnHxX399ddmO8+ECRPklFNO8XFLqHoYCDB+u2wAFyxYIO3bt5d+/fqZL44hQ4aI3g85bdo0eeONNzx/NRACCsPXBG1UAoR5QQeZCXz22Weiy766548EAb8RYPx22QCqYHSWT82f7v/TJd9LLrlEHn74Yfnzn//seT0hIM93ERVMAIHMp3wjRbLfLwFwfViE6mHs2LHSp08fOXr0qCxZskTq16/vw5ZQ5TATYPz2gAH0swARkJ97j7rHQiDazB/LvrGQC+Yzu3btko4dO8prr71mGnjzzTfLCy+8ICVLlgxmg2lVYAkwfrtsAPXEry4jlC5d+gSRaaR4nQn84YcfPC0+BOTp7qFyCSCQ+cAHs34JgOrTIjQs12233SY//vijpKamyujRo+Wee+7h0I9P+zPs1Wb8dtkAaniA7du3n3QtkAaF1pNkGkTUywkBebl3qFsiCGQ0gDrzV7pIKgN+IsD6rAxd8u3du7ccOXJENHzX3LlzpVatWj5rBdWFwP8TYPx2yQBGlg+aN29ugoSWKFEivVd0T8n7779vTgHrgRAvJwTk5d6hbokgkNEAEuA5EUT9WcbTTz8t9957r5kB1NitxYsX92dDqDUE/keA8dslAxgJDKrxwnSPUcaUP39+cw3cP/7xD7n++us9LVYE5OnuoXIJIIABTABEnxaR8X52/Z5+9913zeE84jz6tEOp9gkEGL9dMoCRXjjzzDPNHkC/XhOEgPhGCToBDGDQe/jk9ukd7SNHjjSrM/r9nHGFJnw0aHFQCTB+u2wA/S4sBOT3HqT+ORHAAOZEKFh/r/uv27Zta7bgaNKgznrQgwSBoBFg/PaAAdy3b58sXrzYnCxLS0s7QWP333+/pzWHgDzdPVQuAQQwgAmA6JMi/vWvf0nr1q3NwTy9plPNX4cOHVjy9Un/Uc34CDB+u2wAv/jiC7nuuutk//79okZQrw/67bffpHDhwuZkMGFg4hM0T0Mg0QQwgIkm6r3y9ODd8OHDTUB+Xf694IILzCnfCy+80HuVpUYQSBABDKDLBvCqq66SatWqycSJE80+E70NRA+B6N3A3bt3N0FGvZwQkJd7h7olggAGMBEUvV3GwIEDjQHU1KlTJxk3bpz5EU6CQJAJMH67bAA1evzy5cvl3HPPNZHkNdDo+eefb/5M7whev369p/WHgDzdPVQuAQQwgAmA6PEidNWlQYMG8tBDD5n9fyQIhIEA47fLBrBs2bLy8ccfyznnnGNmAvWXZ9OmTY3xu/TSS82ysJcTAvJy71A3GwIa9uPA4aOyP+2o1B6+yBRFHEAbot7Jq8GcFyxYIH/729/SK6V/li9fPu9UkppAwGECjN8uG0CNKaWbjHXj8R133CGrV68WPfjx0ksvye+//25mAr2cEJCXe4e65ZZAtPt/MYC5pemtfD/99JP5vl26dKkJ89KuXTtvVZDaQCBJBBi/XTaAK1askD/++EMaNWokv/zyi/kyiswI6gXjNWvWTJIUcvcaBJQ7buTyNoHM9/9qbbkD2Nt9Fkvt3nrrLfMdu3PnTilWrJjod+ytt94aS1aegUDgCDB+u2wA/a4oBOT3HqT+0Qhkvv+3cGqKFMqfQjgQn8rl8OHDZn/fqFGjTAv0Dl895at3+pIgEFYCjN8eNYArV66Uhx9+WN544424tKlxq/RLTuNY1ahRw+wprFu3bpZl7N6923wxvvLKK7Jr1y4544wzZMyYMSY0TSwJAcVCiWf8RoCDH37rsazrq/FV9f5ePWCn6b777jPfkQULFgxOI2kJBHJBgPHbRQO4cOFCE20+NTVVunTpIlWrVjWHPx588EF5/fXXzWEQXbKINc2ZM8csb2hImcsuu8wYuXnz5smGDRtMTMHMSYNO169f3/xd//79pUKFCrJ582ZzGlnNYywJAcVCiWf8RgAD6Lcey7q+en+vfpdqmC1d8s148CM4raQlEIifAOO3SwZQv4j00IcGftbDHqVLl5bRo0dLt27dpGXLliYGoIaDiSep6atTp46MHz/eZNOAppUqVTJlqqnMnNQo6i9hNZ0aezA3CQHlhhp5vE4AA+j1Hoqvfs8++6w0btzY/MgmQQAC/yXA+O2SAaxevbqJN/X3v/9d/vnPf5qNyJdffrnZl1KxYsW49amzeRq49OWXX5bmzZun59dYgrrMqyEPMidd5lUDqvn07zUkjZ6O69u3r6SkpMRUBwQUEyYe8hkBDKDPOixDdTdu3Ch33XWXWQnB8Pm3H6m58wQYv10ygEWKFJG1a9dKlSpVRENOFChQQPQeSl2SzU3aunWrWcLVE8T16tVLL6JPnz7mnuFo4WTOO+882bRpk7Rp08Zcdv7dd9+Zf2sYmkGDBkWtxqFDh0T/iSQVkM4y7tmzR4oXL56bqpMHAp4ioJ/HnfvSiP3nqV6JrTK6l1lv8tDvIw2xpdtsSBCAQHQCGECXDGDevHnNQY3I3jwNSaDXwOX2F2tuDKAGnj548KDoL+bIjJ8uQ+uy8LZt26IqZvDgwTJkyJCT/g4DyFdMEAhEi/9H8Gfv96z+KO3du3f69hddTZk9e7Y51EaCAAQwgFlpIM9x/dZPclIDqHdPFi1a1LxZl111ObhMmTIn1ERn42JJuVkCvvLKK83ev0WL/nvLgaa3337bnADWL1Q9nJI5MQMYS2/wjF8JZI7/R+w/7/ekrlzovmmNnKBJv0cfeeSRXO9r9n6LqSEEEkOAGUCXZgB16TdPnjzZ9qL+/Q8//BBzT+shEA35oqFfNOkhkMqVK5uwB9EOgejJ35kzZ5p3qCHVNHbsWHnsscdEZxRjSQgoFko84xcCmeP/lS6SmuPn1C9tC2I9P//8cxNEX4Pp60E6vdmjWbNmQWwqbYJAwgkwfrtkABPekyKiYWD00MekSZOMEdQwMHqoRE/5li9f3oSI0X2CI0eONK/fsmWLXHjhhSaPnhT+9ttvzf4ZnXXU2ICxJAQUCyWe8QsBDn/4paf+W09dkdB904UKFZJZs2bl6gCdv1pMbSGQOAKM3wEygCoLDQETCQSt18g99dRTJiagpquuusocOpk6dWq6gjQ46gMPPCBffvmlMYedO3fmFHDiPl+U5DMCGEDvd5iuWOjKRr58+Uxl9QpNjWYQ+X/vt4AaQsAbBDCAATOAyZYVAko2cd7nJAEMoJN07cuePn26dO3a1fxoHTZsmH2BlACBEBNg/MYAWskfAVnhI7PHCGAAPdYh/6vO/v37zTaVyZMnmz+55ppr5J133mHWz5vdRa18QoDxGwNoJVUEZIWPzB4jgAH0WIeIyLp166RFixYmbqoejNM70gcOHBhzsHrvtYgaQcAbBBi/MYBWSkRAVvjI7DECGEDvdIhG59L9yvfee68cOHBATj31VJkxY4ZcffXV3qkkNYGAjwkwfnvAAH7//fcyZcoU0X9rGBYNDq3x+HSjs57S9XJCQF7uHeoWLwEMYLzEnHv+559/Fg1Wr8u/TZo0kZdeeslEMyBBAAKJIcD47bIB1Gvarr32WhPKYMmSJfL111+b20AeffRRWbFihbnb18sJAXm5d6hbvAQwgPESc/Z5jev3008/Sb9+/dJjlTr7RkqHQHgIMH67bAD13t5bb71VevbsKRmvg/v000/l5ptvNl9+Xk4IyMu9Q93iJYABjJdY4p7XJd/nn39ezj//fGnQoEHiCqYkCEAgKgHGb5cNoF4F99VXX8mZZ555ggHctGmTnHfeeeauXi8nBOTl3qFu8RLAAMZLLDHP6/fIXXfdZe7vrVixoqxevVpKlSqVmMIpBQIQwABmoQFX7gKO1EW/7PS2jiuuuOIEA/jqq6+ay811X6CXEwbQy71D3eIlgAGMl5j981988YU55at3+qakpMiIESPMd1/kekr7N1ACBCAQjQDjt8szgPpFt3z5cpk3b57Z8KwXmu/YscNc26b/DBo0yNPKRUCe7h4qFyMBXX48cPio7E87KrWHLzK51g1tKoVT/3vbBCnxBJT5M888Y4I6p6WlSaVKlcwMoP4YJkEAAs4TYPx22QDqF5+GOdBwB0ePHjWBTfXfrVu3Nn+mv4i9nBCQl3uHusVCQI3ILRM/kc83/37C4xjAWOjl7hnd2tK2bdv0Q2433nijiYSgV7qRIACB5BBg/HbZAEa6+ccff5Q1a9bI3r17pVatWnLOOeckRwGWb0FAlgDJ7jqBjMu+kcrUPqOUzOtazwQeJiWegDHdt9wir7/+ujz22GPSo0cPWCceMyVCIFsCjN8uG8CPPvrI1yfeEBDfMH4nkNEArhjQWAqnpkih/CkYkgR3rJq+Q4cOScGCBU3Ju3fvlm+//Vbq1KmT4DdRHAQgEAsBxm+XDWBqaqpUqFBBWrVqJbfffrtccMEFsfSbZ55BQJ7pCiqSSwIc/MgluDiy7dq1Szp16iQFChQw+/yYWY0DHo9CwCECjN8uG8DffvvNfCHOmjVLPvnkE6levbq0adPGGEI9Iez1hIC83kPULycCGMCcCNn9/b///W9p2bKl6DYX/cGrB928fsORXYvJDQF/EGD8dtkAZpTJxo0bZebMmcYMrl+/Xho2bCgffPCBp5WEgDzdPVQuBgIYwBgg5eKRY8eOyT/+8Q/p37+/HDlyRM466ywT8uqSSy7JRWlkgQAEEk2A8dtDBlA7V08A6z3AAwcONMFQ9f+9nBCQl3uHusVCAAMYC6X4ntGVjQ4dOsibb75pMuoM4LPPPivFixePryCehgAEHCPA+O0RA7hs2TKZMWOGCYugIRJuuukmsxT8l7/8xbHOT0TBCCgRFCnDTQIYwMTS18MeesWlxjfVPX9jx46VO++8k31/icVMaRCwJsD47bIB1EvOdQ/g1q1bpUmTJsb0qfkrXLiwdecmowAElAzKvMNJAhjAxNNdsmSJ3H333WZLS40aNRL/AkqEAASsCTB+u2wA69evb0yfXoVUpkwZ6w5NdgEIKNnEeV+iCWAA7Yn+8ssvsmrVKvMjNpJ0+4rXA9nbt5wSIOBfAozfLhtA/0rnvzVHQH7vQeqPAbTTwIcffmhuLtLvghUrVsh5551nVyC5IQCBpBBg/HbBAL722mty7bXXSv78+UX/O7ukVyR5OSEgL/cOdYuFAAYwFkonP6MzfI888ogMGTJE9MTv+eefb/Yw+y2Wae5aTy4I+J8A47cLBjBv3ryyfft2KVeunOh/Z5U0WCqngP3/IaMF3iaAAYy/f/T7S7euRMJUdezYUcaNGydFihSJvzByQAACrhDAALpgAF3paYdeioAcAkuxSSOAAYwP9aJFi4z5031/elht4sSJ0rZt2/gK4WkIQMB1AozfLhvAadOmmRhZGi4hY0pLSzOng9u1a+e6SLKrAALydPdQuRgIYABjgJThEQ3sPHLkSLn44otNYGf2/MXHj6ch4BUCjN8uG0A9Jbdt2zazHJwx7dy50/wZS8Be+ahQj6ASwADG17N6q8fo0aOlW7duUqhQofgy8zQEIOAZAhhAlw2g7gHcsWOHlC1b9gRRaEiFRo0aiV6i7uWEgLzcO9QtFgIYwOwpvfPOOzJ+/Hh55ZVXzF2+JAhAIBgEGL9dMoC1atUykfHV6OnF6Pny5UtXlM766b3AeguILrF4OSEgL/cOdYuFAAYwOqXDhw+bKykfe+wx88CoUaOkd+/esSDlGQhAwAcEGL9dMoAaOkGT/rtXr15StGjRdLnor+wqVarI3/72N8//4kZAPviUU8VsCWAAT8bz448/SqtWreTjjz82f3nvvffKE088IQULFkRNEIBAQAgwfrtkACP6efHFF80hEL9+sSKggHwThLgZGMATO//111+XDh06mO0nxYsXlxdeeEFuueWWECuEpkMgmAQYv102gH6XFQLyew9Sfwzg/2tA9/rp4Q5NtWvXljlz5kjVqlURCQQgEEACjN8uGMBTTjlFvvnmG3P3b6lSpcxewKwSh0AC+KmjSZ4igAH8/+747rvv5NJLL5VOnTrJo48+elJ4Kk91HJWBAASsCGAAXTCAuux72223mS/XqVOnZmsA27dvb9XBTmdGQE4TpnynCYTdAK5fv/6EWH56y8epp57qNHbKhwAEXCbA+O2CAXS5zxP6egSUUJwU5gKBsBrAQ4cOyd///neZMGGCLFy4UBo3buwCfV4JAQi4RYDx22UDuHLlSsmfP7+Jqq9pwYIFMmXKFHOh+uDBgzkF7NYng/eGhkAYDaAu9erhM/3+0TRixAjp169faPqchkIAAiIYQJcNYJ06deTBBx80IV9++OEHY/xuvvlm+eyzz6RZs2YyZswYT+sUAXm6e6hcDATCZgA1tmiXLl3kjz/+kNKlS4tuSdHvGhIEIBAuAozfLhvAEiVKmF/hZ511lgm4+sEHH5jlmGXLlpl9glu2bPG0IhGQp7uHysVAICwG8MCBA9KzZ0+ZOHGiodKgQQOZNWuWVKxYMQZKPAIBCASNAOO3ywZQ42x9/vnncs4550iTJk3k+uuvl+7du4sGYj333HNFv7S9nBCQl3uHusVCICwGcN68edKiRQuDRJd7hw4desINRLGw4hkIQCA4BBi/XTaAV199tVSqVMlswO7cubOsW7dOzj77bFm8eLHoCeBNmzZ5Wm0IyNPdQ+ViIBAWA3j8+HF54IEH5Nprr5WmTZvGQIZHIACBIBNg/HbZAK5evVratGljZvx0eWbQoEFGbxqMdefOnTJz5kxP6w8Bebp7qFwMBIJqAPfv328OkvXt29fs9SNBAAIQyEiA8dtlA5iVHA8ePCgpKSnmhLCXEwLycu9Qt1gIBNEA6kqCLveuXbtWbrrpJpk/f34sKHgGAhAIEQHGb48YQN0H+PXXXxvp6UngSy65xBcyREC+6CYqmQ2BoBlADS5/7733is4Ali9fXmbMmCHXXHMNGoAABCBwAgHGb5cN4C+//GLicemev5IlS5rO2b17tzRq1Ehmz54tZcuW9bRkEZCnu4fKxUAgKAZw7969xvhNmzbNtFr3FU+fPt2YQBIEIACBzAQYv102gGr+NP6ffmmff/75pn90+UYPgOhhEA3T4OWEgLzcO9QtFgJBMIAa2PmGG24QvdYtb9685oSvxhfVbSQkCEAAAtEIMH67bAA1DuCiRYtEA0JnTJ9++qn8+c9/NrOBXk4IyMu9Q91iIRAEA6jfE7Vq1ZK0tDTzo7Fhw4axNJ1nIACBEBNg/HbZABYrVkyWLl0qNWvWPEGGX3zxhVx55ZXmqhYvJwTk5d6hbtkR0LAoBw4flf1pR6X28EX/nX0f2lQKp+bzBTjd41eoUCHJkyePqe9XX30lp556que3jfgCLpWEQAgIMH67bAD1hJ7+etdf7aeffrqR3M8//2xCw5QqVUpeffVVT8sQAXm6e6hcFgTU/N0y8RP5fPPvJzzhFwP45ZdfmlO+vXv3ljvvvJN+hgAEIBA3AcZvlw2gXvV24403mnANGhBak/7ZRRddJK+99prnr2lCQHF/5sjgAQIZl30j1al9RimZ17Ve+oyaB6p5UhXUuOpVbhrQ+dChQ1KtWjVZs2aN58NFeZEldYJA2AkwfrtsAFWA+qX+/vvvp4eB0cMgeoLPDwkB+aGXqGNGAvp527kvLX3Zd8WAxlI4NUUK5U/xtPnbs2eP3HHHHaJXumnSQx9TpkwhyDPyhgAEckWA8dtFAzhnzhwzy6cbtzVOV9euXXPViW5mQkBu0ufd8RKItvTrh2XfFStWmHBRGjEgX7588thjj5lZwMj+v3g58DwEIAABxm+XDOAzzzxjYnadc845ZiO3buDWq+BGjRrlK1UiIF91V+grm3np1w/Lvjt27JAzzzxTDhw4IGeccYboD8fLLrss9H0JAAhAwI4A47dLBvDCCy80m7gjd/9qwNa77rpL9u3bZ9ejSc6NgJIMnNdZEchoAHXpt3SRVF/Mog0bNkw0MsALL7xgDoeRIAABCNgSYPx2yQDqrJ9e/ValShXTh8eOHTMzgZs2bZLTTjvNtl+Tlh8BJQ01L0oAAb/E/Fu+fLm5Gejcc89N/37Q5V6WfBMgAoqAAAQMAcZvlwygRuvXpZ2MV71pTMBVq1ZJ1apVfSNPBOSbrqKiIuJ1A6g/BJ988klzi4feCf7vf//b/DAkQQACEEg0AcZvFw2gxu8qXLhwep9OmDBBbr/9dtHbQSJp9OjRie7zhJaHgBKKk8IcJuBlA7hz505zBeSbb75pKNx6661myVd/GJIgAAEIJJoA47dLBvCqq67KcTlHl3s++OCDRPd5QstDQAnFSWEOE/CqAVy2bJncdttt8tNPP0mBAgVkzJgxZk8wS74OC4LiIRBiAozfLhnAoGgOAQWlJ8PRDq8ZQF3yffzxx2XAgAFy9OhRExVg7ty5J10NGY7eoZUQgEAyCTB+YwCt9IaArPCROckEvGYADx8+LLoa8PHHH0vr1q3NLR8s+SZZFLwOAiElwPgdMAOo+wg1luD27dulRo0aMm7cOKlbt26O8p49e7a0atVK9G7i+fPn5/h85AEEFDMqHvQAAa8ZQEXy448/mpuAOnTowJKvBzRCFSAQFgKM3wEygBogtl27dmYWQQPF6j4ivTZqw4YNUq5cuSw1raFnGjRoYE4fn3LKKRjAsHz6Q9hOtw2gLvOOGDFC9u7da27zIEEAAhBwiwAGMEAGUE1fnTp1ZPz48UZPur+oUqVK0q1bNxNWIlrSAalhw4bSqVMnWbp0qezevRsD6Nankfc6TsBNA6iz8nrKX2f7NK1cuVJq1arleJt5AQQgAIFoBDCAATGAep+whpR5+eWXpXnz5ul9rWEl1NQtWLAg6idAbyJZvXq1vPrqq2YJKicDeOjQIdF/IkkFpCZTL6ovXrw4nzIIeJqAWwZQTV+bNm1M7E/9nOpVkDpbT4IABCDgFgEMoAcMoM68TZo0Sb7//ntj4CpUqCAvvfSSuf9Tl2ZjSVu3bjX5dDN5vXr10rP06dNHFi9eLHqzQOb00UcfmdATX375pZQpUyYmAzh48GAZMmTISWVhAGPpJZ5xm0CyDeCRI0dk6NChMnz4cDl+/LhcdNFF5pTv+eef7zYK3g8BCIScAAbQZQP4z3/+U9q2bWtmB9T0rVu3zuzF02Xct956y/wTS4rXAP7xxx9SvXp1efrpp+Xaa681r2AGMBbSPONnAsk2gDfeeKO8/vrrBtkdd9whY8eO5WYPPwuIukMgQAQwgC4bQN0D9MADD5jloIxXwenF72rMdN9QLCneJWCd9dN3p6SkpBevewY16TV1enDkrLPOyvHVCChHRDzgIQLJNoB6ul6Nn87wa5gXEgQgAAGvEGD8dtkA6n4gnfWrUqXKCQbwhx9+MHeBHjx4MGat6CEQDfmioV80qaGrXLmy3HfffScdAtFyv/vuuxPK1mC0OjOosxTVqlWT1NTUHN+NgHJExAMeIuC0AdQlX/3s6ucnkn755ZdsT+F7CA9VgQAEQkSA8dtlA6jLvc8++6w0btz4BAM4bdo0efTRR405jDVpGBg99KGzDWoENQyM7jdav369lC9f3swy6j7BkSNHRi0yliXgzBkRUKy9w3NeIOCkAdyyZYuJpak/rFatWmU+cyQIQAACXiXA+O2yAVQzNn36dJk8ebI0adLE7PnbvHmzWRYeOHCgCeEST9K9g5FA0DVr1pSnnnrKxATUpDcO6Ezj1KlTMYDxQOXZwBBwygC+8cYb5sfXrl27zGl4PXWvnzcSBCAAAa8SwAC6bAD1ZKAGhlUjuH//fqMTvQy+d+/eMmzYMK/qJr1eCMjzXUQFMxBItAHUvbf9+vWT0aNHm7dceumlojPxseyfpWMgAAEIuEmA8dtlAxjpfB1IdOlIbwjQvX9FixZ1UxcxvxsBxYyKBz1AIJEGUG/Q0TBKkRBL3bt3N7d76A84EgQgAAGvE2D89ogB9LpQsqofAvJrz4Wz3ok0gHfddZfZv1uyZEmZMmXKCQHYw0mXVkMAAn4iwPjtsgFs1KhRthfAf/DBB57WEwLydPdQuUwEEmkA9cR8165d5ZFHHjF7a0kQgAAE/ESA8dtlA6iHPTKmw4cPm5s51qxZYzaVa0gWLycE5OXeoW6ZCdgYQL2p57nnnjP7dfPkyQNcCEAAAr4mwPjtsgHMSj165ZruB3ziiSc8LTAE5OnuoXIJmgGcN2+edOnSRVTverI+3tP5dAQEIAABrxFg/PaoAdQDIRrLT8NKeDkhIC/3DnWznQHUgOk9e/aUZ555xhRVv359mTVrllSqVAm4EIAABHxNgPHbowZQ7wXu27ev6B2/Xk4IyMu9Q91sDOA333wjLVq0MEGdNT344IMydOhQyZ8/P2AhAAEI+J4A47fLBvDmm28+QUQaF3Dbtm2yYsUKEwh60KBBnhYZAvJ091C5TARi3QM4f/58adu2rdmGUaZMGdEfZH/5y1/gCQEIQCAwBBi/3nRFKwAAIABJREFUXTaAHTt2PEFMefPmlbJly8rVV18tf/7znz0vNATk+S6ighkIxGoANbZfgwYN5IorrpCZM2eaKxRJEIAABIJEgPHbRQN49OhRWbZsmVx88cVSqlQpX+oKAfmy20Jb6ewM4L59+6RIkSLpbPSzqdco5suXL7S8aDgEIBBcAozfLhpAlVXBggXl66+/ljPPPNOXKkNAvuy20FY6KwP44osvSq9evUTjblavXj20fGg4BCAQHgKM3y4bwNq1a5vro6655hpfqg4B+bLbQlvpzAbw+OFDcu+994oaQE16u8fEiRNDy4eGQwAC4SHA+O2yAXznnXfMZfLDhg0zF8lnXIJSGRYvXtzTakRAnu4eKpeJQEYDOK9lBWnfprWZgde9txp7s3///pKSkgI3CEAAAoEnwPjtkgHUcBK65FSsWLF0kWW8XUBPA+v/6z5BLycE5OXeoW4RAvp5OnD4qOxPOyqXDntP9q5+V/Z/+JxonL/TTz/dHPS48sorAQYBCEAgNAQYv10ygDrLoOFedPYhu+T1QQkBhea7wrcNVfN3y8RP5PPNv5s27NuwTH6bP9L8d9OmTU2IFz15T4IABCAQJgKM3y4ZQF1y2r59u5QrV87XekNAvu4+X1U+MosXb6V11q/28EXp2Y4fOyoH33hEerRtboKt62eRBAEIQCBsBBi/XTSAO3bs8P3MAwIK21dGYtobr5k7flzk1omfyLpt/4m7Avqu/V8vkcLV6snng6+TwqkpUiAlD3v94iZJBghAIEgEGL9dNIAlSpQw+/yyS9wFHKSPW7jbEjF9NmYuXoLHDu2Tne+Ml/3rl0rVP/1Vvlv8zxw/c/G+g+chAAEI+JEABtBFAzhmzBhRE5hdat++vad1hYA83T2eqVzmfXi5rdgFpxWXeV3rSQ6/m0zxX6z8XNq2bi0bN/5ggjmPHDnSHLzK6UdXbutGPghAAAJ+IsD47aIBZA+gnz4q1DUeApmXeDPvw9Oy4jFzkXcXyp+So4HTd48fP1569+4taWlpcsYZZ8js2bPl8ssvj6cJPAsBCEAg0AQwgC4ZwMgpYA6BBPrzFdjGZbeHL6cl3hUDGpt9eLGYuXgB/v7779K5c2d59dVXTdbmzZvL5MmTfXvVYrzt53kIQAACsRLAALpkADkFHKtEec5LBMyBirSjuT6QUfuMUv9bws1+72tu27x582apVauW7N27V5544gnp1q1bjjOGuX0X+SAAAQj4mQAG0CUD6GfRZKw7AgpKT2bdjtwe3oi2xOvErF8kaHqkBQsXLpTSpUuLXrNIggAEIACB6AQYvzGAVp8NBGSFz9XMsYRiyW45N6c9fE6YvczAdu7cKR07djR3+DZr1sxVnrwcAhCAgJ8IMH5jAK30ioCs8LmW2eZUbsT46T4+N0/ULlu2TFq1aiVbtmyRChUqyPfffy8FChRwjSkvhgAEIOAnAozfGEArvSIgK3xJyRxtpi/aqdzsKpNxti8ZM3vZ1eXYsWPy+OOPy4ABA8xd2eecc47MnTtXatasmRSevAQCEIBAEAgwfmMArXSMgKzwJSxzVsu5OZ3I1QpETuVmVxm3TV+kbr/++qu0a9dO3nnnHfNHrVu3lokTJ0qxYsUSxpKCIAABCISBAOM3BtBK5wjICl9CMtss5zp9KjchDfxfIb/99pvUqFFDtm7dKgULFpRx48aZkC9uLkMnsn2UBQEIQCCZBBi/MYBWekNAVvisMkdm/WJZzs3qwIZXZvZiBXHnnXfK0qVLzZLvxRdfHGs2noMABCAAgUwEGL8xgFYfCgRkhS/mzJmXeLNa2s1qOddvRi8CZseOHWaGLxIw/cCBA2bfX9GiRWNmx4MQgAAEIHAyAcZvDKDV5wIBWeGLKXOsS7x+Ws6NpeHvv/++tGnTRqpXr272/GnwdBIEIAABCCSGAOM3BtBKSQjICl9MmfenHZELHl4Y9Vkvnc6NqTExPKQzfEOHDpVhw4aJmt8LL7xQ1AyWL18+htw8AgEIQAACsRBg/MYAxqKTLJ9BQFb4ss0cbY9f5iVevy7tZtVwPeChs34ffviheaRLly4yduxYKVy4sHOgKRkCEIBACAkwfmMArWSPgKzwZZk5q2XfdUObSuHUfM681OVS9Qq3tm3bioZ60T1+kyZNMmFeSBCAAAQgkHgCjN8YQCtVISArfFEzq/nbuS9Nag9fdMLfB22PX8bGHTlyRC666CLZsGGDCfWip3yrVauWeLiUCAEIQAAChgDjNwbQ6qOAgKzwnZQ52sxfZNk3aMu9mRv/5ZdfygsvvCCjRo0ycf5IEIAABCDgHAHGbwyglboQkBU+c8jhwOGj6YVkjukX5Fm/N9980wR1vuOOO+wgkhsCEIAABOImwPiNAYxbNBkzIKD48UVMX07XtOnMX+kiqYG76eLw4cPSv39/eeKJJyR//vzy6aefco9v/DIiBwQgAAErAozfGEAEZEUg+8yxBnDOXEpQZ/42b94sLVu2lOXLl5sm33///fL4449LgQIFHOwFioYABCAAgcwEMIAYQKtPBQI6GV+sM3yRnNGuaQvifr/58+dLx44dZffu3VKyZEmZPHmy/PWvf7XSH5khAAEIQCB3BBi/MYC5U87/ciGgE/HFemtHEAM4Zyekv//972bJV1PdunVlzpw5UqVKFSvtkRkCEIAABHJPgPEbA5h79XCM/CR20W7tCMsMX3ZC0pO9ffr0kV69esmIESMkNTXVSndkhgAEIAABOwIYQAyglYIQ0In4MhrAsIRvyUpAe/fuNQGdNR07dkz+/e9/yxVXXGGlNzJDAAIQgEBiCDB+YwCtlISAsjaAQb61IzvRHDx40Mz0ffDBB7JixQopUqSIlcbIDAEIQAACiSfA+I0BtFIVAsIAZiTw7bffSosWLUSDOmt6+eWX5W9/+5uVxsgMAQhAAAKJJ8D4jQG0UhUCwgBGCMyaNUvuvPNO0aXfMmXKyPTp06Vp06ZW+iIzBCAAAQg4Q4DxGwNopaywCyi7mzzCsgR84MAB6d69uzz33HNGSw0bNpSZM2dKhQoVrLRFZghAAAIQcI5A2MdvJZvnuI7ipFwRCLOAcgr5EhYD2LVrV5k0aZK5seShhx6SQYMGSb58+XKlJzJBAAIQgEByCIR5/I4QxgBaaC1MAsrp3t6MGIN6k0c0qeh9vn/5y19k9OjR0rhxYws1kRUCEIAABJJFIEzjd1ZMMYAWaguLgHKa7YuEfImgDOJNHpG27du3T/RWjzZt2qQrR8O85M2b10JJZIUABCAAgWQSCMv4nR1TDKCF4oIuoMis3/60o1J7+KKopMI027d27VpzynfdunUyb948ueWWWyzUQ1YIQAACEHCLQNDH71i4YgBjoZTFM0EWUFazfmGa7Yt0u7LQu3u7desmeujjtNNOEz31e+WVV1qoh6wQgAAEIOAWgSCP37EyxQDGSirKc34VUOb9fNEQRJv1C9NsX4TJH3/8IXfffbfMmDHD/JGGdpk2bZqUK1fOQjlkhQAEIAABNwn4dfxOJDMMoAVNPwkoYvr0zPetEz+Rddv+E3PLw3qt26pVq8yS7zfffCMpKSkyfPhwc6cv+/1ilg4PQgACEPAkAT+N304BxABakPWLgHI6xJEdgjDO+kV46GGPv/71r1KxYkWz5NugQQMLtZAVAhCAAAS8QsAv47eTvDCAFnT9IqD9aUfkgocXntDSC04rLvO61pM8ebIHEOQTvdFarmZZY/pF0gsvvCA33XSTud2DBAEIQAACwSDgl/HbSdqBMoATJkyQUaNGyfbt26VGjRoybtw4qVu3blR+enOD7uVas2aN+ftLL71URowYkeXz0Qrxi4AyGsCwLufG8iFauXKl3HvvveaEr876kSAAAQhAIJgE/DJ+O0k/MAZwzpw50q5dO5k4caJcdtllMmbMGDOQb9iwIeqGfY3jVr9+fbniiiukYMGC8thjj8mrr74qGuoj1mu8/CKgjAYwLDd0xPOh0Vk//fHQq1cvSUtLk1atWpnr3EgQgAAEIBBMAn4Zv52kHxgDqKavTp06Mn78eMNLg/NWqlTJhO548MEHc2R49OhRKVWqlMmvRjKW5BcBYQCz7s3du3dL586d5ZVXXjEPNW/e3IR8US2QIAABCEAgmAT8Mn47ST8QBlBnbQoXLiwvv/yyGcAjqX379qID/IIFC3JkqOE+NLSHzhpef/31UZ8/dOiQ6D+RpAJSk7lnzx4pXrx4ju9w6wEMYHTyn376qbRs2VI2bdok+fPnlyeeeML8YMi4B9CtPuO9EIAABCDgHAEMoEggDKDex6rLth9//LHUq1cvXTEasmPx4sWyfPnyHFV0zz33yMKFC80SsC4JR0uDBw+WIUOGnPRXGMAc8Xrugffee0+uu+46OXLkiJx55pmiWwh0BpkEAQhAAALBJ4ABxAAalT/66KPy+OOPy4cffijVq1fPUvl+mQHMHOg5Y1Bn9gD+t3v3799v9oqed9558vzzz0uJEiWC/41HCyEAAQhAwBDAAAbEANosAeuynwb4XbRokdSuXTuuj4YXBZRTzL8wG8CvvvpKLrzwwvRAzrt27TJ7/VjyjUv2PAwBCEDA9wS8OH4nG2ogloAVms7maMgXDf2iSQ+BVK5cWe67774sD4HorN8jjzxiln4vv/zyuNl7UUDRYv5FGhbWoM6qBTX6/fv3l2HDhkm/fv3i7msyQAACEIBAcAh4cfxONt3AGEDdw6WHPiZNmmSMoIaBmTt3rqxfv17Kly9vTvbqPsGRI0caxhr25eGHHzbhPjQcTCQVLVpU9J9YkhcFFC3mX6QtYQvqrO3+9ddfjS7efvttg6Ft27by4osvMusXi8B5BgIQgEBACXhx/E426sAYQAWnIVwigaBr1qwpTz31lJkZ1HTVVVdJlSpVZOrUqeb/9b83b958Eu9BgwaJHvaIJXlRQJz4/f+eW7JkiYnpp4eE9GCPzg5ryBeWfGNRN89AAAIQCC4BL47fyaYdKAOYbHheEBAHPk7udV3y1ZleneHV/9aDHjobfPHFFydbIrwPAhCAAAQ8SMAL47fbWDCAFj3gtoA48BG983TZX68C1MNBuvyrt3wUKVLEoqfJCgEIQAACQSLg9vjtBZYYQItecFtAHPjIuvP0rufU1FRjAEkQgAAEIACBjATcHr+90BsYQItecFtAHPj4b+fpNX4ayqdZs2Zxh/Kx6H6yQgACEICATwm4PX57ARsG0KIX3BYQBz7EHPBo06aNCeJdtWpVWbNmjRQqVMiiV8kKAQhAAAJBJ+D2+O0FvhhAi15wW0BhN4Dvvvuu3H777SbUi4bu0RBArVu3tuhRskIAAhCAQBgIuD1+e4ExBtCiF9wSUOTkb1iveNP7ezVcj570VRZ64ENP+VarVs2iN8kKAQhAAAJhIeDW+O0lvhhAi95ItoDU7Kjpu3XiJ7Ju239OqHlYrnjbvXu33HDDDfLRRx+Z9nft2lWefPJJE+ePBAEIQAACEIiFQLLH71jqlOxnMIAWxJMpoOxCvoTpijeN63f99dcbA/j8889LixYtLHqQrBCAAAQgEEYCyRy/vcoXA2jRM8kUUOaQLxecVlzmda0nefKIBP2Kt8OHD4su+0YOd/z222+iM4Fnn322Re+RFQIQgAAEwkogmeO3VxljAC16JpkCyhzypXSR1FBcaabX9d12223mNo8pU6ZY9BZZIQABCEAAAv8lkMzx26vMMYAWPZNMAYXxxO+CBQukY8eO8vvvv0vJkiVl9erVUqlSJYseIysEIAABCEAAA6gawABafBKSYQDDeOJXr3Dr27evjBkzxvRO3bp1Zc6cOVKlShWL3iIrBCAAAQhAgBnAiAYwgBafBqcNYFYHP4J84veHH36Qli1byooVK0zP9OrVS0aMGGGudSNBAAIQgAAEEkHA6fE7EXV0ugwMoAVhpwUU7a7fIJ/41Svdzj//fPn222/llFNOkalTp5qQLyQIQAACEIBAIgk4PX4nsq5OlYUBtCDrtICi3fUb9BO/CxcuNPf6zpw5k/1+FtokKwQgAAEIZE3A6fHbD+wxgBa95LSAwnDw47vvvpONGzdKkyZN0ntCl77zaHwbEgQgAAEIQMABAk6P3w5UOeFFYgAtkDotoKAbwNmzZ8udd94pefPmlZUrV0rVqlUteoOsEIAABCAAgdgIOD1+x1YLd5/CAFrwd1pAQTWABw4ckB49esizzz5r6P/pT3+SWbNmSYUKFSx6g6wQgAAEIACB2Ag4PX7HVgt3n8IAWvB3WkBBNIDr168317d99dVXZpn3oYcekkGDBkm+fPkseoKsEIAABCAAgdgJOD1+x14T957EAFqwd1pAQTOA06dPl65du8q+ffukfPnyov/fuHFjix4gKwQgAAEIQCB+Ak6P3/HXKPk5MIAWzJ0WUNAM4P333y/jxo2Tq6++WmbMmCGnnnqqBX2yQgACEIAABHJHwOnxO3e1Sm4uDKAFb6cFFAQDmPFE76FDh0xsvy5dukhKSooFebJCAAIQgAAEck/A6fE79zVLXk4MoAVrpwXkZwOoxk/N3ty5c+X1119nj5+FzsgKAQhAAAKJJeD0+J3Y2jpTGgbQgqvTAvKrAdy7d6/cfffdZo+fpsmTJ0vHjh0tSJMVAhCAAAQgkDgCTo/fiaupcyVhAC3YOi0gPxrA1atXm1O+GzZsMMu8w4YNk759+5pYfyQIQAACEICAFwg4PX57oY051QEDmBOhbP7eaQH5yQDqkq/G9evevbvoXj+N6aeBnhs0aGBBmKwQgAAEIACBxBNwevxOfI0TXyIG0IKp0wLykwHUeH4jRowwNJs1a2b2/5UpU8aCLlkhAAEIQAACzhBwevx2ptaJLRUDaMHTaQH5yQCuXbtW6tevLwMGDJCePXuy5GuhK7JCAAIQgICzBJwev52tfWJKxwBacHRaQF42gLrk+8UXX8gll1ySTvD333+XUqVKWRAlKwQgAAEIQMB5Ak6P3863wP4NGEALhk4LyKsGcPfu3SaW3/z58+XDDz9kn5+FhsgKAQhAAALJJ+D0+J38FsX/Rgxg/MzSczgtIC8awM8++0xatmwpGzdulPz588ukSZMI8WKhIbJCAAIQgEDyCTg9fie/RfG/EQMYP7NQGkBd8h07dqz06dNHDh8+LGeeeabMmTNH6tSpY0GQrBCAAAQgAIHkE8AAimAALXTntIC8MgO4a9cuM8v32muvGVq33HKLPP/881KiRAkLemSFAAQgAAEIuEPA6fHbnVbF91YMYHy8TnjaaQF5xQCq2bvjjjskNTVVnnzySXPLR548eSzIkRUCEIAABCDgHgGnx2/3Whb7mzGAsbM66UmnBeQVA6jLv7169ZK2bdtKrVq1LIiRFQIQgAAEIOA+AafHb/dbmHMNMIA5M8ryCacF5JYB/O2330w8v8cff1yKFy9uQYisEIAABCAAAe8RcHr89l6LT64RBtCil5wWkBsGcOnSpdKqVSv5+eefzYzftGnTLAiRFQIQgAAEIOA9Ak6P395rMQYwoX3itICSaQCPHTsmI0eOlIcfflj0v88991yZO3euVK9ePaHMKAwCEIAABCDgNgGnx2+32xfL+5kBjIVSFs84LaBkGcAdO3aY2b733nvPtFT/++mnn5aiRYta0CErBCAAAQhAwJsEnB6/vdnqE2uFAbToJacFlAwD+Pnnn8v1118v27dvl0KFChnj16FDBwsqZIUABCAAAQh4m4DT47e3W//f2mEALXrJaQElwwD++uuvUrNmTXOHry75XnDBBRZEyAoBCEAAAhDwPgGnx2/vE8AAWvWR0wJyygDu2bPnhCDOa9euNTd7FC5c2IoHmSEAAQhAAAJ+IOD0+O0HBswAWvSS0wJywgDqPr/bb79d/vGPf5h/kyAAAQhAAAJhI+D0+O0HnhhAi15yWkCJNIBHjhyRwYMHy4gRI0QDO9evX1805As3elgIgKwQgAAEIOBLAk6P336AggG06CWnBZQoA/jTTz9J69atjeHT1LVrVxk9erQ59EGCAAQgAAEIhI2A0+O3H3hiAC16yWkBJcIAvvXWW9KuXTvZuXOnFCtWTPRe3xYtWli0mqwQgAAEIAABfxNwevz2Ax0MoEUvOS0gWwP47bffynnnnWcCO19yySUyZ84cOfvssy1aTFYIQAACEICA/wk4PX77gRAG0KKXnBaQrQHUpvXr10/27dsno0aNkgIFCli0lqwQgAAEIACBYBBwevz2AyUMoEUvOS2g3BjA119/XS666CIT1kWTHvjgoIdFJ5MVAhCAAAQCR8Dp8dsPwDCAFr3ktIDiMYBpaWny4IMPypNPPil169Y1Bz5SU1MtWkdWCEAAAhCAQDAJOD1++4EaBtCil5wWUKwGcOPGjdKyZUv57LPPTGseeOABefTRRzGAFn1LVghAAAIQCC4Bp8dvP5DDAFr0ktMCisUAvvLKK9KpUyfR2z30OrepU6fKjTfeaNEqskIAAhCAAASCTcDp8dsP9DCAFr3kpIB0797OfWlSe/giU8N1Q5tK4dR86bU9dOiQ9O7dW8aPH2/+rF69ejJ79mypXLmyRYvICgEIQAACEAg+ASfHb7/QwwBa9JRTAlLzd8vET+Tzzb+n1y6zATx48KC5zWPlypXSp08fGT58uOTPn9+iNWSFAAQgAAEIhIOAU+O3n+hhAC16yykBZVz61erVPqOUzOtaz5zmzXiq9/vvv5cNGzbIddddZ9EKskIAAhCAAATCRcCp8dtPFDGAFr3llIAyGsAVAxpL6SKpojN+PXr0kPLly8vQoUMtak1WCEAAAhCAQLgJODV++4lqoAzghAkTTMDj7du3S40aNWTcuHEmJEpWad68eTJw4EDZtGmTnHPOOfLYY4/FNZvmlIAyH/7YsvF7c33b6tWrJSUlRfSGj0icPz+JjbpCAAIQgAAEvEDAqfHbC22LtQ6BMYB6zZneeTtx4kS57LLLZMyYMaIGT5dIy5UrdxKPjz/+WBo2bCgjR46U66+/XmbOnGkMoO6p00DKsSSnBJTRAA487zfpft+95jYPbcf06dOlSZMmsVSPZyAAAQhAAAIQiELAqfHbT7ADYwDV9NWpUyf9VKzef1upUiXp1q2bCZCcOWncPDVVb7zxRvpfXX755VKzZk1jImNJTglIDeB5/RbIrvcmyr6v/nsKuFGjRjJjxgw57bTTYqkaz0AAAhCAAAQgkAUBp8ZvPwEPhAHUWzAKFy4sL7/8sjRv3jydf/v27WX37t2yYMGCk/pEw6X07NnT7KuLpEGDBsn8+fNl1apVUftQQ6/oP5GkAlKTqTH4ihcvnrB+33swTUpXvUjStn1rDn5ovQYMGGCWf0kQgAAEIAABCNgRwACKBMIAbt26VSpUqCC6rKvx8CJJw6MsXrxYli9ffpJS9Jq0F198UVq1apX+d08//bQMGTJEduzYEVVZgwcPNn+fOSXaAOoMYOXmvWT3kpfk9VfmyrV/bmyndHJDAAIQgAAEIHDCBE6JEiUSPoHjJ8QYwDgMYLJmADXUi5pA/YVyaplTzCwgCQIQgAAEIACBxBBgBjAgM4DJWgLOLDsElJgPIqVAAAIQgAAEkkmA8TsgBlBFo4dANOSLhn7RpIdAdJ/ffffdl+UhkP3798vrr7+errkrrrhCqlev7vohkGR+CHgXBCAAAQhAIGwEMIABMoAaBkYPfUyaNMkYQQ0DM3fuXFm/fr0JnqwhYnSfoIZ90aT7Ba+88kp59NFHpVmzZuYe3REjRngiDEzYPoi0FwIQgAAEIJBMAhjAABlAFc748ePTA0FrOJennnrKzAxquuqqq6RKlSoyderUdI1pnEA9XRsJBP344497IhB0Mj8EvAsCEIAABCAQNgIYwIAZwGQLGAElmzjvgwAEIAABCNgTYPzGAFqpCAFZ4SMzBCAAAQhAwBUCjN8YQCvhISArfGSGAAQgAAEIuEKA8RsDaCU8BGSFj8wQgAAEIAABVwgwfmMArYSHgKzwkRkCEIAABCDgCgHGbwyglfAQkBU+MkMAAhCAAARcIcD4jQG0Eh4CssJHZghAAAIQgIArBBi/MYBWwkNAVvjIDAEIQAACEHCFAOM3BtBKeAjICh+ZIQABCEAAAq4QYPzGAFoJDwFZ4SMzBCAAAQhAwBUCjN8YQCvh7dmzR0qWLClbtmyR4sWLW5VFZghAAAIQgAAEkkNADWClSpVk9+7dUqJEieS81GNvyXP8+PHjHquTb6rz008/GQGRIAABCEAAAhDwHwGdwKlYsaL/Kp6AGmMALSAeO3ZMtm7dKsWKFZM8efJYlHRy1sivE2YXE4r1pMLg7CzfSOlwhnNyCCTnLejZ/5x17uuPP/6Q008/XfLmzZucBnnsLRhAj3VIxgFTp6V1mZnlZec6iX0gzrHNWDKc4ZwcAsl5C3qGc3IIOPsWDKCzfHNdOl8wuUYXV0Y4x4Ur1w/DOdfo4soI57hw5fphOOcaXVwZ4RwXrrgfxgDGjSw5GRA+nJNDIDlvQc9wTg6B5LwFPcM5OQScfQsG0Fm+uS790KFDMnLkSOnXr58UKFAg1+WQMXsCcE6OQuAM5+QQSM5b0DOck0PA2bdgAJ3lS+kQgAAEIAABCEDAcwQwgJ7rEioEAQhAAAIQgAAEnCWAAXSWL6VDAAIQgAAEIAABzxHAAHquS6gQBCAAAQhAAAIQcJYABtBZvpQOAQhAAAIQgAAEPEcAA+hSl0yYMEFGjRol27dvlxo1asi4ceOkbt26WdZm3rx5MnDgQNm0aZOcc8458thjj8l1113nUu399dp4WD/33HMybdo0WbNmjWnkpZdeKiNGjMi2b/xFw7naxsM5Yy1mz54trVq1kptuuknmz5/vXAUDUnK8nPWu04ceekheeeUV2bVrl5xxxhkyZswYvj9y0EO8nJXpM888Iz/++KOUKVNGbrnlFhPJoWCWEq7UAAAQSUlEQVTBggFRXuKbsWTJEjMOfv7557Jt2zZ59dVXpXnz5tm+6MMPP5SePXvK2rVrzVWsAwYMkA4dOiS+ciEoEQPoQifPmTNH2rVrJxMnTpTLLrvMfBmrwduwYYOUK1fupBp9/PHH0rBhQ/Nlcv3118vMmTONAVy5cqVcdNFFLrTAP6+Ml3WbNm2kfv36csUVV5gvbuWsX0r6ZVOhQgX/NDzJNY2Xc6R6+oOmQYMGUrVqVTnllFMwgDn0W7yc09LSjJ71e6V///5Gw5s3b5aSJUuaH56k6ATi5azfyZ06dZLJkyeb745vvvnGmJLbbrtNRo8eDeYsCLz99tuybNky80P75ptvztEAbty40Yx5Xbt2lS5dusj7778vPXr0kDfffFOaNm0K5zgJYADjBJaIx9X01alTR8aPH2+K0zuF9ZdMt27d5MEHHzzpFS1btpR9+/bJG2+8kf53l19+udSsWdOYSFLWBOJlnbmko0ePSqlSpUxfqWknRSeQG87KVn/Y6MC5dOlS0ZkqZgCzV1i8nPX7QWdY1q9fL/nz50e+MRKIl/N9990nX3/9tTEkkdSrVy9Zvny5fPTRRzG+NdyP5cmTJ0cD2LdvX2P2Iis0SkxNtn53vPPOO+EGmIvWYwBzAc0mi/4iL1y4sLz88ssnTHW3b9/eiHjBggUnFV+5cmUz5a2/dCJp0KBBZrBctWqVTXUCnTc3rDMD0cvCdfZEZ2h19pV0MoHcclYNr1692nzp62wJBjB7deWGs24T0ZlV/c7R75ayZctK69atRQfSlJQU5ByFQG446wzgPffcI++++67ZLvLDDz9Is2bNpG3btmbmlZQzgVgMoP5gvOSSS8yqWSRNmTLFjI179uzJ+SU8cQIBDGCSBbF161azDKPLuvXq1Ut/e58+fWTx4sXmF2PmlJqaKi+++KLZJxVJTz/9tAwZMkR27NiR5Bb453W5YZ25dfqlvnDhQrMEzF6e6H2fG846K6K/3L/88kuzXwoDmPPnKjeczzvvPLNvWLc2qJa/++478+/7779f1ICTTiaQG85aylNPPSW9e/eW48ePy5EjR8wype4JJMVGIBYDWK1aNenYsaO5ISuS3nrrLWO29+/fL4UKFYrtZTxlCGAAkyyE3Hy5YABz10m5YZ3xTY8++qg8/vjjopuOq1evnrtKhCBXvJx1VlV56o+Ya6+91hDCAOYslHg5a4k6YB48eFB071Rkxk/3pOmysG66JyXGAOp3hP6gGT58uNnXrUa7e/fucscdd5jDe6ScCWAAc2aU6CcwgIkmmkN5uVleYAk4d52UG9aRNz3xxBPmy3zRokVSu3bt3FUgJLni5ayzfrVq1TphCVL3wWrKmzevOQx11llnhYRe7M2Ml7OWfOWVV5q9f6rjSNKN97o0rPfZ6o9L0okEcsP5T3/6k+i+bDXWkTR9+nS58847Ze/evUbXpOwJxGIAWQJOrIowgInlGVNp+gtR94lo6BdNOvipydONxFkdAtHp7ddffz29fD1pprMoHALJHnm8rLU0nfV75JFHzNKvfqmTciYQD2edkdIZkoxJQznozODYsWPNrBXGJDrzeDhrCbr/TPen6Z60iAlRxnq6XWcUSYnhrKdYGzdubLhG0qxZs6Rz585G1+y3zFlpsRhA3buqS75fffVVeoG6p1XDG3EIJGfGmZ/AAMbPzDqHhhjQQx+TJk0yRlA3tM6dO9ec1Ctfvrw5bar7BDXsiybdL6i/5HVJUvc6aNw0jU1HGJicuyJe1voF/vDDD5tBU8NnRFLRokVF/yFFJxAv58ylsAQcm7Li5bxlyxa58MILzfeNRhn49ttvzalr3QOosQFJidHz4MGDTbiXZ599Nn0J+O677zbhTbTPSNEJ6Oxo5Megrgoow0aNGpmDSzoponv9fv75ZxObVVMkDMy9995rdPzBBx8YLRMGJncKwwDmjpt1Lg0rEgkEreFcdAOx/rrXdNVVV0mVKlVk6tSp6e/RU6g6SxIJBK2zVASCjq0b4mGt3DVOWuakG+b1S56UNYF4OGMAc6+keDl/8skn8sADD5gDN/rDUmelOAWcM/94OOuhD101eOmll4xh0dPWN9xwg/kzjblIik5A906q4cuc9AeLjn/6w1DHPH0ukvS/Vc/r1q2TihUrmj2WBILOncIwgLnjRi4IQAACEIAABCDgWwIYQN92HRWHAAQgAAEIQAACuSOAAcwdN3JBAAIQgAAEIAAB3xLAAPq266g4BCAAAQhAAAIQyB0BDGDuuJELAhCAAAQgAAEI+JYABtC3XUfFIQABCEAAAhCAQO4IYABzx41cEIAABCAAAQhAwLcEMIC+7ToqDgEIQAACEIAABHJHAAOYO27kggAEciCggVx79Oghu3fv9iWrWK6m4gYTX3YtlYYABEQEA4gMIACBLAmowXnxxRdP+nu9Uuzss8/OlpzTBlDL79ixo6mDmrXTTz9dmjRpYu5jLVeunHWvbt++XUqVKiUFChQwtxGceeaZ8sUXX4je3BNJe/bskePHjzt624PeQDNkyBDzSr3PV9t57bXXmqsh9cqsWBNmNVZSPAeBcBDAAIajn2klBHJFQE3Djh07ZMqUKSfk16uucrrgPhkGsHv37rJhwwY5duyYrFr1f+2daahNXRjHnw/ITFGXiCIylcxkKiRFmUnki0vmQiiUMn5AZjJ+Qck8y5xMGYuIFGUuY5EhQ739ntqnfc/d5168Z2s7/qve3uvcfdZe67eoX8+w900XwqZNm9qxY8d+a7+ZvpRJALN6kwyTIYC7du2ykydP2o8fP+zu3bv+HtR27dr90ntmJYB/4rR0DxH4ewhIAP+es9JKReCPEyhKGnhxO2L48OFDj0Tx7lPeUV2+fHlfZ7oAImikhK9du+YRu3r16tm6deusZcuWfv358+f95e/8vmrVqta3b19buHChlStXLnLfUYK5YMECfzcoL5kncjdv3jxbv369vXr1yho2bOhRsx49evh8X79+tcmTJ9vu3bvt3bt3lpeXZ6NHj/Y1MMIpYH4Oj86dO/v7ScN8uA+y9vTpU4/UBaN3795WpUoV27x5s3+0f/9+j+jxLlOiebz3dObMmVaiRInIfTLnvn37/F2+wZgyZYqzf/v2rX+EGI4aNcpOnz5tRC5r1aplY8eONQSZEY4iBnOcOXPG3zv+5MkTY77jx4/7ujt27GjLly/395FriIAI5C4BCWDunq12JgL/m0BRArhs2TKPtpEaRQIRji5dutiaNWsiBbBJkybWrFkzlx2ihwhN/fr1fY4HDx74/xG2nj17urCNHz/eP0uPPgabihLApUuXutS9f//eNm7c6OKDZHJfBIzf37lzx+Vz8eLFtmLFCtu2bZsLEyLEf0OGDCkkgFevXrXWrVt7FK5x48ZWqlQpl94wHySyWrVqduTIEevatavPgaBVr1499dm5c+esV69efl9Ei30jbswze/bsnxJAopHM8fr1a5c9xrdv35wdEo5sXrx40eeF3aBBg1yIR4wY4VwCnqwfsYUx0UTkHAllnuvXr9utW7d8nxoiIAK5SUACmJvnql2JQFYIICZbt2610qVLp+aj/mznzp2F5idNSQQNMWGkC1rFihVt5cqVHvFKH/n5+S6FyFowiAgSafv48WOB+2cSQOoSESPug7DVqFHDxo0bZzNmzEjNicS1atXKVq9ebRMnTnQZROrSI3x8IRwBzJQCThfkPn36uIBt2rTJ70lUkGgfYkl0rVu3bi6HQZSRa+A7bdo0e/78eUYBnDt3rpUpU8YjfV++fPHriMBOmjQp4zkj0Agi58KIknnujfCRVg4YEBmtXLmyRx27d++elb9HmkQERCB5BCSAyTsTrUgEEkMAaXj27JmtXbs2tSZSskS1ECdStPfu3fPI0vfv311OELayZcsWEkCicfPnz3epQ4QGDhxodevW9XmRMiJOJUuWTN2H5opPnz55qpT0bfoImkBYDzWA3LtDhw4e+SMSV6lSJU/Tcr9gIEykokmV3rhxw5tGEDbSwshjWHh+RwAR45EjR3rdJClo7k2Ke8mSJb4EaieJxoXrJwOpC7il7xNuO3bssAMHDvgekTaip4cOHSqQNkZqiXI+fvzYPn/+7CluGlauXLmSUQCnTp3qUdGw4HMx3JlvzJgxifm7qIWIgAhkl4AEMLs8NZsI5BSBTClgImINGjRwQRg8eLCnQ4nYkWYkFUoEKSpFe//+fTt8+LAdPXrUzp49a9u3b/daPwQPGSMqlz5Iz0alIpmf6xE5omtIKVEyBkJanAAG17EWZBZ5Q0yDiNnvCCCCRi0haVaktnbt2l7T2Lx5c18X6yMi2K9fv0L7rFOnToHaweCCqBpA0uTMSWSQAUcaYBBN0rkVKlSwRYsW2eXLl1O1g1FnyfnBjzR4+kBWYaghAiKQmwQkgLl5rtqVCGSFQCYBpHGCWjmEJ2h4IJVIA0ZRAhheFN8n6kVka+jQoR41Q8R+dhTXZZwpBUwaeNWqVYVuQ+cwkcA3b9640IYFkPQs8yFzLVq0SH03ig8ihoC2adPGRZD0ajDat2/v4hykiH9mr1ECeOnSJa+3pIaQRpIJEyZ4pPTUqVOpKZFZ0vFB8wg1gS9evLCDBw+mrtmwYYNNnz7dH3ND6lxDBETg3yEgAfx3zlo7FYFfJpBJAEmjkl6kEYTGgwsXLnhdG+niKAEkJUm6ccCAAd40QqcstYD9+/f35/aR/m3btq0/3oR6QNK6CM2JEyciZY2NFCeArI3GCurwWCsyRt1c0ATCz0QNaRBBYulgJjrJHvhzWABJbyNINLCwPlKmRMei+CCxpJPpoh02bJjNmjUrxR3J5Hd8BgvuA8vbt297LV7UiBJArkMwiTIiszSVIN+kiuG7ZcsW/4yfAwGkQ5oaS7p9SXuzfppHYIPczpkzx2rWrGmPHj2yPXv2eF0if9YQARHITQISwNw8V+1KBLJCoKguYGrHSDPypo9OnTp5FG/48OGRAkg9GsKHKBLp4zEvpEH5flB/RuMGgkV0i/o/6gNJL4ebOMKbKk4AqQskRUqU6+XLl9aoUaMCj4HhczqWaR6hJg+ZYj0IISP9TSDUFiJJCCIdvOmPgQnWxn0RJ6JtROhI7YYHEsg8PFSamkcigkgltYO/IoCkfTkf1s+Dr2nA2bt3r6+b6CqCR3o7EEA6qzkj+FKHGDwGhkYRooB0L3/48MFlkEYVuqQVFczKPyNNIgKJJCABTOSxaFEiIAIiIAIiIAIiEB8BCWB8bDWzCIiACIiACIiACCSSgAQwkceiRYmACIiACIiACIhAfAQkgPGx1cwiIAIiIAIiIAIikEgCEsBEHosWJQIiIAIiIAIiIALxEZAAxsdWM4uACIiACIiACIhAIglIABN5LFqUCIiACIiACIiACMRHQAIYH1vNLAIiIAIiIAIiIAKJJCABTOSxaFEiIAIiIAIiIAIiEB8BCWB8bDWzCIiACIiACIiACCSSgAQwkceiRYmACIiACIiACIhAfAQkgPGx1cwiIAIiIAIiIAIikEgCEsBEHosWJQIiIAIiIAIiIALxEfgPwNGXMPyBBOYAAAAASUVORK5CYII=\\\" width=\\\"640\\\">\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.HTML object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Text(0, 0.5, 'True Positive Rate')\"\n      ]\n     },\n     \"execution_count\": 55,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# ROC Curve\\n\",\n    \"from sklearn.metrics import roc_curve\\n\",\n    \"fpr, tpr, thresholds = roc_curve(y, y_scores)\\n\",\n    \"plt.plot(fpr, tpr)\\n\",\n    \"plt.plot([0,1],[0,1],'k--')\\n\",\n    \"plt.xlabel('False Positive Rate')\\n\",\n    \"plt.ylabel('True Positive Rate')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 56,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.6847594721157939\"\n      ]\n     },\n     \"execution_count\": 56,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# AUC\\n\",\n    \"from sklearn.metrics import roc_auc_score\\n\",\n    \"roc_auc_score(y, y_scores)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 57,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/javascript\": [\n       \"/* Put everything inside the global mpl namespace */\\n\",\n       \"/* global mpl */\\n\",\n       \"window.mpl = {};\\n\",\n       \"\\n\",\n       \"mpl.get_websocket_type = function () {\\n\",\n       \"    if (typeof WebSocket !== 'undefined') {\\n\",\n       \"        return WebSocket;\\n\",\n       \"    } else if (typeof MozWebSocket !== 'undefined') {\\n\",\n       \"        return MozWebSocket;\\n\",\n       \"    } else {\\n\",\n       \"        alert(\\n\",\n       \"            'Your browser does not have WebSocket support. ' +\\n\",\n       \"                'Please try Chrome, Safari or Firefox ≥ 6. ' +\\n\",\n       \"                'Firefox 4 and 5 are also supported but you ' +\\n\",\n       \"                'have to enable WebSockets in about:config.'\\n\",\n       \"        );\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\\n\",\n       \"    this.id = figure_id;\\n\",\n       \"\\n\",\n       \"    this.ws = websocket;\\n\",\n       \"\\n\",\n       \"    this.supports_binary = this.ws.binaryType !== undefined;\\n\",\n       \"\\n\",\n       \"    if (!this.supports_binary) {\\n\",\n       \"        var warnings = document.getElementById('mpl-warnings');\\n\",\n       \"        if (warnings) {\\n\",\n       \"            warnings.style.display = 'block';\\n\",\n       \"            warnings.textContent =\\n\",\n       \"                'This browser does not support binary websocket messages. ' +\\n\",\n       \"                'Performance may be slow.';\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    this.imageObj = new Image();\\n\",\n       \"\\n\",\n       \"    this.context = undefined;\\n\",\n       \"    this.message = undefined;\\n\",\n       \"    this.canvas = undefined;\\n\",\n       \"    this.rubberband_canvas = undefined;\\n\",\n       \"    this.rubberband_context = undefined;\\n\",\n       \"    this.format_dropdown = undefined;\\n\",\n       \"\\n\",\n       \"    this.image_mode = 'full';\\n\",\n       \"\\n\",\n       \"    this.root = document.createElement('div');\\n\",\n       \"    this.root.setAttribute('style', 'display: inline-block');\\n\",\n       \"    this._root_extra_style(this.root);\\n\",\n       \"\\n\",\n       \"    parent_element.appendChild(this.root);\\n\",\n       \"\\n\",\n       \"    this._init_header(this);\\n\",\n       \"    this._init_canvas(this);\\n\",\n       \"    this._init_toolbar(this);\\n\",\n       \"\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    this.waiting = false;\\n\",\n       \"\\n\",\n       \"    this.ws.onopen = function () {\\n\",\n       \"        fig.send_message('supports_binary', { value: fig.supports_binary });\\n\",\n       \"        fig.send_message('send_image_mode', {});\\n\",\n       \"        if (fig.ratio !== 1) {\\n\",\n       \"            fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\\n\",\n       \"        }\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onload = function () {\\n\",\n       \"        if (fig.image_mode === 'full') {\\n\",\n       \"            // Full images could contain transparency (where diff images\\n\",\n       \"            // almost always do), so we need to clear the canvas so that\\n\",\n       \"            // there is no ghosting.\\n\",\n       \"            fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\\n\",\n       \"        }\\n\",\n       \"        fig.context.drawImage(fig.imageObj, 0, 0);\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onunload = function () {\\n\",\n       \"        fig.ws.close();\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.ws.onmessage = this._make_on_message_function(this);\\n\",\n       \"\\n\",\n       \"    this.ondownload = ondownload;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_header = function () {\\n\",\n       \"    var titlebar = document.createElement('div');\\n\",\n       \"    titlebar.classList =\\n\",\n       \"        'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\\n\",\n       \"    var titletext = document.createElement('div');\\n\",\n       \"    titletext.classList = 'ui-dialog-title';\\n\",\n       \"    titletext.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'width: 100%; text-align: center; padding: 3px;'\\n\",\n       \"    );\\n\",\n       \"    titlebar.appendChild(titletext);\\n\",\n       \"    this.root.appendChild(titlebar);\\n\",\n       \"    this.header = titletext;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_canvas = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var canvas_div = (this.canvas_div = document.createElement('div'));\\n\",\n       \"    canvas_div.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'border: 1px solid #ddd;' +\\n\",\n       \"            'box-sizing: content-box;' +\\n\",\n       \"            'clear: both;' +\\n\",\n       \"            'min-height: 1px;' +\\n\",\n       \"            'min-width: 1px;' +\\n\",\n       \"            'outline: 0;' +\\n\",\n       \"            'overflow: hidden;' +\\n\",\n       \"            'position: relative;' +\\n\",\n       \"            'resize: both;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    function on_keyboard_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.key_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keydown',\\n\",\n       \"        on_keyboard_event_closure('key_press')\\n\",\n       \"    );\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keyup',\\n\",\n       \"        on_keyboard_event_closure('key_release')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    this._canvas_extra_style(canvas_div);\\n\",\n       \"    this.root.appendChild(canvas_div);\\n\",\n       \"\\n\",\n       \"    var canvas = (this.canvas = document.createElement('canvas'));\\n\",\n       \"    canvas.classList.add('mpl-canvas');\\n\",\n       \"    canvas.setAttribute('style', 'box-sizing: content-box;');\\n\",\n       \"\\n\",\n       \"    this.context = canvas.getContext('2d');\\n\",\n       \"\\n\",\n       \"    var backingStore =\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        this.context.webkitBackingStorePixelRatio ||\\n\",\n       \"        this.context.mozBackingStorePixelRatio ||\\n\",\n       \"        this.context.msBackingStorePixelRatio ||\\n\",\n       \"        this.context.oBackingStorePixelRatio ||\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        1;\\n\",\n       \"\\n\",\n       \"    this.ratio = (window.devicePixelRatio || 1) / backingStore;\\n\",\n       \"    if (this.ratio !== 1) {\\n\",\n       \"        fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var rubberband_canvas = (this.rubberband_canvas = document.createElement(\\n\",\n       \"        'canvas'\\n\",\n       \"    ));\\n\",\n       \"    rubberband_canvas.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    var resizeObserver = new ResizeObserver(function (entries) {\\n\",\n       \"        var nentries = entries.length;\\n\",\n       \"        for (var i = 0; i < nentries; i++) {\\n\",\n       \"            var entry = entries[i];\\n\",\n       \"            var width, height;\\n\",\n       \"            if (entry.contentBoxSize) {\\n\",\n       \"                if (entry.contentBoxSize instanceof Array) {\\n\",\n       \"                    // Chrome 84 implements new version of spec.\\n\",\n       \"                    width = entry.contentBoxSize[0].inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize[0].blockSize;\\n\",\n       \"                } else {\\n\",\n       \"                    // Firefox implements old version of spec.\\n\",\n       \"                    width = entry.contentBoxSize.inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize.blockSize;\\n\",\n       \"                }\\n\",\n       \"            } else {\\n\",\n       \"                // Chrome <84 implements even older version of spec.\\n\",\n       \"                width = entry.contentRect.width;\\n\",\n       \"                height = entry.contentRect.height;\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            // Keep the size of the canvas and rubber band canvas in sync with\\n\",\n       \"            // the canvas container.\\n\",\n       \"            if (entry.devicePixelContentBoxSize) {\\n\",\n       \"                // Chrome 84 implements new version of spec.\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'width',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].inlineSize\\n\",\n       \"                );\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'height',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].blockSize\\n\",\n       \"                );\\n\",\n       \"            } else {\\n\",\n       \"                canvas.setAttribute('width', width * fig.ratio);\\n\",\n       \"                canvas.setAttribute('height', height * fig.ratio);\\n\",\n       \"            }\\n\",\n       \"            canvas.setAttribute(\\n\",\n       \"                'style',\\n\",\n       \"                'width: ' + width + 'px; height: ' + height + 'px;'\\n\",\n       \"            );\\n\",\n       \"\\n\",\n       \"            rubberband_canvas.setAttribute('width', width);\\n\",\n       \"            rubberband_canvas.setAttribute('height', height);\\n\",\n       \"\\n\",\n       \"            // And update the size in Python. We ignore the initial 0/0 size\\n\",\n       \"            // that occurs as the element is placed into the DOM, which should\\n\",\n       \"            // otherwise not happen due to the minimum size styling.\\n\",\n       \"            if (width != 0 && height != 0) {\\n\",\n       \"                fig.request_resize(width, height);\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    });\\n\",\n       \"    resizeObserver.observe(canvas_div);\\n\",\n       \"\\n\",\n       \"    function on_mouse_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.mouse_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousedown',\\n\",\n       \"        on_mouse_event_closure('button_press')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseup',\\n\",\n       \"        on_mouse_event_closure('button_release')\\n\",\n       \"    );\\n\",\n       \"    // Throttle sequential mouse events to 1 every 20ms.\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousemove',\\n\",\n       \"        on_mouse_event_closure('motion_notify')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseenter',\\n\",\n       \"        on_mouse_event_closure('figure_enter')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseleave',\\n\",\n       \"        on_mouse_event_closure('figure_leave')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener('wheel', function (event) {\\n\",\n       \"        if (event.deltaY < 0) {\\n\",\n       \"            event.step = 1;\\n\",\n       \"        } else {\\n\",\n       \"            event.step = -1;\\n\",\n       \"        }\\n\",\n       \"        on_mouse_event_closure('scroll')(event);\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    canvas_div.appendChild(canvas);\\n\",\n       \"    canvas_div.appendChild(rubberband_canvas);\\n\",\n       \"\\n\",\n       \"    this.rubberband_context = rubberband_canvas.getContext('2d');\\n\",\n       \"    this.rubberband_context.strokeStyle = '#000000';\\n\",\n       \"\\n\",\n       \"    this._resize_canvas = function (width, height, forward) {\\n\",\n       \"        if (forward) {\\n\",\n       \"            canvas_div.style.width = width + 'px';\\n\",\n       \"            canvas_div.style.height = height + 'px';\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    // Disable right mouse context menu.\\n\",\n       \"    this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\\n\",\n       \"        event.preventDefault();\\n\",\n       \"        return false;\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    function set_focus() {\\n\",\n       \"        canvas.focus();\\n\",\n       \"        canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    window.setTimeout(set_focus, 100);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'mpl-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var button = (fig.buttons[name] = document.createElement('button'));\\n\",\n       \"        button.classList = 'mpl-widget';\\n\",\n       \"        button.setAttribute('role', 'button');\\n\",\n       \"        button.setAttribute('aria-disabled', 'false');\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"\\n\",\n       \"        var icon_img = document.createElement('img');\\n\",\n       \"        icon_img.src = '_images/' + image + '.png';\\n\",\n       \"        icon_img.srcset = '_images/' + image + '_large.png 2x';\\n\",\n       \"        icon_img.alt = tooltip;\\n\",\n       \"        button.appendChild(icon_img);\\n\",\n       \"\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fmt_picker = document.createElement('select');\\n\",\n       \"    fmt_picker.classList = 'mpl-widget';\\n\",\n       \"    toolbar.appendChild(fmt_picker);\\n\",\n       \"    this.format_dropdown = fmt_picker;\\n\",\n       \"\\n\",\n       \"    for (var ind in mpl.extensions) {\\n\",\n       \"        var fmt = mpl.extensions[ind];\\n\",\n       \"        var option = document.createElement('option');\\n\",\n       \"        option.selected = fmt === mpl.default_extension;\\n\",\n       \"        option.innerHTML = fmt;\\n\",\n       \"        fmt_picker.appendChild(option);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\\n\",\n       \"    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\\n\",\n       \"    // which will in turn request a refresh of the image.\\n\",\n       \"    this.send_message('resize', { width: x_pixels, height: y_pixels });\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_message = function (type, properties) {\\n\",\n       \"    properties['type'] = type;\\n\",\n       \"    properties['figure_id'] = this.id;\\n\",\n       \"    this.ws.send(JSON.stringify(properties));\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_draw_message = function () {\\n\",\n       \"    if (!this.waiting) {\\n\",\n       \"        this.waiting = true;\\n\",\n       \"        this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    var format_dropdown = fig.format_dropdown;\\n\",\n       \"    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\\n\",\n       \"    fig.ondownload(fig, format);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_resize = function (fig, msg) {\\n\",\n       \"    var size = msg['size'];\\n\",\n       \"    if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\\n\",\n       \"        fig._resize_canvas(size[0], size[1], msg['forward']);\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\\n\",\n       \"    var x0 = msg['x0'] / fig.ratio;\\n\",\n       \"    var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\\n\",\n       \"    var x1 = msg['x1'] / fig.ratio;\\n\",\n       \"    var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\\n\",\n       \"    x0 = Math.floor(x0) + 0.5;\\n\",\n       \"    y0 = Math.floor(y0) + 0.5;\\n\",\n       \"    x1 = Math.floor(x1) + 0.5;\\n\",\n       \"    y1 = Math.floor(y1) + 0.5;\\n\",\n       \"    var min_x = Math.min(x0, x1);\\n\",\n       \"    var min_y = Math.min(y0, y1);\\n\",\n       \"    var width = Math.abs(x1 - x0);\\n\",\n       \"    var height = Math.abs(y1 - y0);\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.clearRect(\\n\",\n       \"        0,\\n\",\n       \"        0,\\n\",\n       \"        fig.canvas.width / fig.ratio,\\n\",\n       \"        fig.canvas.height / fig.ratio\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\\n\",\n       \"    // Updates the figure title.\\n\",\n       \"    fig.header.textContent = msg['label'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_cursor = function (fig, msg) {\\n\",\n       \"    var cursor = msg['cursor'];\\n\",\n       \"    switch (cursor) {\\n\",\n       \"        case 0:\\n\",\n       \"            cursor = 'pointer';\\n\",\n       \"            break;\\n\",\n       \"        case 1:\\n\",\n       \"            cursor = 'default';\\n\",\n       \"            break;\\n\",\n       \"        case 2:\\n\",\n       \"            cursor = 'crosshair';\\n\",\n       \"            break;\\n\",\n       \"        case 3:\\n\",\n       \"            cursor = 'move';\\n\",\n       \"            break;\\n\",\n       \"    }\\n\",\n       \"    fig.rubberband_canvas.style.cursor = cursor;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_message = function (fig, msg) {\\n\",\n       \"    fig.message.textContent = msg['message'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_draw = function (fig, _msg) {\\n\",\n       \"    // Request the server to send over a new figure.\\n\",\n       \"    fig.send_draw_message();\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\\n\",\n       \"    fig.image_mode = msg['mode'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\\n\",\n       \"    for (var key in msg) {\\n\",\n       \"        if (!(key in fig.buttons)) {\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"        fig.buttons[key].disabled = !msg[key];\\n\",\n       \"        fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\\n\",\n       \"    if (msg['mode'] === 'PAN') {\\n\",\n       \"        fig.buttons['Pan'].classList.add('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    } else if (msg['mode'] === 'ZOOM') {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.add('active');\\n\",\n       \"    } else {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Called whenever the canvas gets updated.\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// A function to construct a web socket function for onmessage handling.\\n\",\n       \"// Called in the figure constructor.\\n\",\n       \"mpl.figure.prototype._make_on_message_function = function (fig) {\\n\",\n       \"    return function socket_on_message(evt) {\\n\",\n       \"        if (evt.data instanceof Blob) {\\n\",\n       \"            /* FIXME: We get \\\"Resource interpreted as Image but\\n\",\n       \"             * transferred with MIME type text/plain:\\\" errors on\\n\",\n       \"             * Chrome.  But how to set the MIME type?  It doesn't seem\\n\",\n       \"             * to be part of the websocket stream */\\n\",\n       \"            evt.data.type = 'image/png';\\n\",\n       \"\\n\",\n       \"            /* Free the memory for the previous frames */\\n\",\n       \"            if (fig.imageObj.src) {\\n\",\n       \"                (window.URL || window.webkitURL).revokeObjectURL(\\n\",\n       \"                    fig.imageObj.src\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\\n\",\n       \"                evt.data\\n\",\n       \"            );\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        } else if (\\n\",\n       \"            typeof evt.data === 'string' &&\\n\",\n       \"            evt.data.slice(0, 21) === 'data:image/png;base64'\\n\",\n       \"        ) {\\n\",\n       \"            fig.imageObj.src = evt.data;\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var msg = JSON.parse(evt.data);\\n\",\n       \"        var msg_type = msg['type'];\\n\",\n       \"\\n\",\n       \"        // Call the  \\\"handle_{type}\\\" callback, which takes\\n\",\n       \"        // the figure and JSON message as its only arguments.\\n\",\n       \"        try {\\n\",\n       \"            var callback = fig['handle_' + msg_type];\\n\",\n       \"        } catch (e) {\\n\",\n       \"            console.log(\\n\",\n       \"                \\\"No handler for the '\\\" + msg_type + \\\"' message type: \\\",\\n\",\n       \"                msg\\n\",\n       \"            );\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        if (callback) {\\n\",\n       \"            try {\\n\",\n       \"                // console.log(\\\"Handling '\\\" + msg_type + \\\"' message: \\\", msg);\\n\",\n       \"                callback(fig, msg);\\n\",\n       \"            } catch (e) {\\n\",\n       \"                console.log(\\n\",\n       \"                    \\\"Exception inside the 'handler_\\\" + msg_type + \\\"' callback:\\\",\\n\",\n       \"                    e,\\n\",\n       \"                    e.stack,\\n\",\n       \"                    msg\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\\n\",\n       \"mpl.findpos = function (e) {\\n\",\n       \"    //this section is from http://www.quirksmode.org/js/events_properties.html\\n\",\n       \"    var targ;\\n\",\n       \"    if (!e) {\\n\",\n       \"        e = window.event;\\n\",\n       \"    }\\n\",\n       \"    if (e.target) {\\n\",\n       \"        targ = e.target;\\n\",\n       \"    } else if (e.srcElement) {\\n\",\n       \"        targ = e.srcElement;\\n\",\n       \"    }\\n\",\n       \"    if (targ.nodeType === 3) {\\n\",\n       \"        // defeat Safari bug\\n\",\n       \"        targ = targ.parentNode;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // pageX,Y are the mouse positions relative to the document\\n\",\n       \"    var boundingRect = targ.getBoundingClientRect();\\n\",\n       \"    var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\\n\",\n       \"    var y = e.pageY - (boundingRect.top + document.body.scrollTop);\\n\",\n       \"\\n\",\n       \"    return { x: x, y: y };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"/*\\n\",\n       \" * return a copy of an object with only non-object keys\\n\",\n       \" * we need this to avoid circular references\\n\",\n       \" * http://stackoverflow.com/a/24161582/3208463\\n\",\n       \" */\\n\",\n       \"function simpleKeys(original) {\\n\",\n       \"    return Object.keys(original).reduce(function (obj, key) {\\n\",\n       \"        if (typeof original[key] !== 'object') {\\n\",\n       \"            obj[key] = original[key];\\n\",\n       \"        }\\n\",\n       \"        return obj;\\n\",\n       \"    }, {});\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.mouse_event = function (event, name) {\\n\",\n       \"    var canvas_pos = mpl.findpos(event);\\n\",\n       \"\\n\",\n       \"    if (name === 'button_press') {\\n\",\n       \"        this.canvas.focus();\\n\",\n       \"        this.canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var x = canvas_pos.x * this.ratio;\\n\",\n       \"    var y = canvas_pos.y * this.ratio;\\n\",\n       \"\\n\",\n       \"    this.send_message(name, {\\n\",\n       \"        x: x,\\n\",\n       \"        y: y,\\n\",\n       \"        button: event.button,\\n\",\n       \"        step: event.step,\\n\",\n       \"        guiEvent: simpleKeys(event),\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    /* This prevents the web browser from automatically changing to\\n\",\n       \"     * the text insertion cursor when the button is pressed.  We want\\n\",\n       \"     * to control all of the cursor setting manually through the\\n\",\n       \"     * 'cursor' event from matplotlib */\\n\",\n       \"    event.preventDefault();\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (_event, _name) {\\n\",\n       \"    // Handle any extra behaviour associated with a key event\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.key_event = function (event, name) {\\n\",\n       \"    // Prevent repeat events\\n\",\n       \"    if (name === 'key_press') {\\n\",\n       \"        if (event.which === this._key) {\\n\",\n       \"            return;\\n\",\n       \"        } else {\\n\",\n       \"            this._key = event.which;\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"    if (name === 'key_release') {\\n\",\n       \"        this._key = null;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var value = '';\\n\",\n       \"    if (event.ctrlKey && event.which !== 17) {\\n\",\n       \"        value += 'ctrl+';\\n\",\n       \"    }\\n\",\n       \"    if (event.altKey && event.which !== 18) {\\n\",\n       \"        value += 'alt+';\\n\",\n       \"    }\\n\",\n       \"    if (event.shiftKey && event.which !== 16) {\\n\",\n       \"        value += 'shift+';\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    value += 'k';\\n\",\n       \"    value += event.which.toString();\\n\",\n       \"\\n\",\n       \"    this._key_event_extra(event, name);\\n\",\n       \"\\n\",\n       \"    this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onclick = function (name) {\\n\",\n       \"    if (name === 'download') {\\n\",\n       \"        this.handle_save(this, null);\\n\",\n       \"    } else {\\n\",\n       \"        this.send_message('toolbar_button', { name: name });\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\\n\",\n       \"    this.message.textContent = tooltip;\\n\",\n       \"};\\n\",\n       \"mpl.toolbar_items = [[\\\"Home\\\", \\\"Reset original view\\\", \\\"fa fa-home icon-home\\\", \\\"home\\\"], [\\\"Back\\\", \\\"Back to previous view\\\", \\\"fa fa-arrow-left icon-arrow-left\\\", \\\"back\\\"], [\\\"Forward\\\", \\\"Forward to next view\\\", \\\"fa fa-arrow-right icon-arrow-right\\\", \\\"forward\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Pan\\\", \\\"Left button pans, Right button zooms\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-arrows icon-move\\\", \\\"pan\\\"], [\\\"Zoom\\\", \\\"Zoom to rectangle\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-square-o icon-check-empty\\\", \\\"zoom\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Download\\\", \\\"Download plot\\\", \\\"fa fa-floppy-o icon-save\\\", \\\"download\\\"]];\\n\",\n       \"\\n\",\n       \"mpl.extensions = [\\\"eps\\\", \\\"jpeg\\\", \\\"pdf\\\", \\\"png\\\", \\\"ps\\\", \\\"raw\\\", \\\"svg\\\", \\\"tif\\\"];\\n\",\n       \"\\n\",\n       \"mpl.default_extension = \\\"png\\\";/* global mpl */\\n\",\n       \"\\n\",\n       \"var comm_websocket_adapter = function (comm) {\\n\",\n       \"    // Create a \\\"websocket\\\"-like object which calls the given IPython comm\\n\",\n       \"    // object with the appropriate methods. Currently this is a non binary\\n\",\n       \"    // socket, so there is still some room for performance tuning.\\n\",\n       \"    var ws = {};\\n\",\n       \"\\n\",\n       \"    ws.close = function () {\\n\",\n       \"        comm.close();\\n\",\n       \"    };\\n\",\n       \"    ws.send = function (m) {\\n\",\n       \"        //console.log('sending', m);\\n\",\n       \"        comm.send(m);\\n\",\n       \"    };\\n\",\n       \"    // Register the callback with on_msg.\\n\",\n       \"    comm.on_msg(function (msg) {\\n\",\n       \"        //console.log('receiving', msg['content']['data'], msg);\\n\",\n       \"        // Pass the mpl event to the overridden (by mpl) onmessage function.\\n\",\n       \"        ws.onmessage(msg['content']['data']);\\n\",\n       \"    });\\n\",\n       \"    return ws;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.mpl_figure_comm = function (comm, msg) {\\n\",\n       \"    // This is the function which gets called when the mpl process\\n\",\n       \"    // starts-up an IPython Comm through the \\\"matplotlib\\\" channel.\\n\",\n       \"\\n\",\n       \"    var id = msg.content.data.id;\\n\",\n       \"    // Get hold of the div created by the display call when the Comm\\n\",\n       \"    // socket was opened in Python.\\n\",\n       \"    var element = document.getElementById(id);\\n\",\n       \"    var ws_proxy = comm_websocket_adapter(comm);\\n\",\n       \"\\n\",\n       \"    function ondownload(figure, _format) {\\n\",\n       \"        window.open(figure.canvas.toDataURL());\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fig = new mpl.figure(id, ws_proxy, ondownload, element);\\n\",\n       \"\\n\",\n       \"    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\\n\",\n       \"    // web socket which is closed, not our websocket->open comm proxy.\\n\",\n       \"    ws_proxy.onopen();\\n\",\n       \"\\n\",\n       \"    fig.parent_element = element;\\n\",\n       \"    fig.cell_info = mpl.find_output_cell(\\\"<div id='\\\" + id + \\\"'></div>\\\");\\n\",\n       \"    if (!fig.cell_info) {\\n\",\n       \"        console.error('Failed to find cell for figure', id, fig);\\n\",\n       \"        return;\\n\",\n       \"    }\\n\",\n       \"    fig.cell_info[0].output_area.element.one(\\n\",\n       \"        'cleared',\\n\",\n       \"        { fig: fig },\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_close = function (fig, msg) {\\n\",\n       \"    var width = fig.canvas.width / fig.ratio;\\n\",\n       \"    fig.cell_info[0].output_area.element.off(\\n\",\n       \"        'cleared',\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    // Update the output cell to use the data from the current canvas.\\n\",\n       \"    fig.push_to_output();\\n\",\n       \"    var dataURL = fig.canvas.toDataURL();\\n\",\n       \"    // Re-enable the keyboard manager in IPython - without this line, in FF,\\n\",\n       \"    // the notebook keyboard shortcuts fail.\\n\",\n       \"    IPython.keyboard_manager.enable();\\n\",\n       \"    fig.parent_element.innerHTML =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"    fig.close_ws(fig, msg);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.close_ws = function (fig, msg) {\\n\",\n       \"    fig.send_message('closing', msg);\\n\",\n       \"    // fig.ws.close()\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\\n\",\n       \"    // Turn the data on the canvas into data in the output cell.\\n\",\n       \"    var width = this.canvas.width / this.ratio;\\n\",\n       \"    var dataURL = this.canvas.toDataURL();\\n\",\n       \"    this.cell_info[1]['text/html'] =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Tell IPython that the notebook contents must change.\\n\",\n       \"    IPython.notebook.set_dirty(true);\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"    var fig = this;\\n\",\n       \"    // Wait a second, then push the new image to the DOM so\\n\",\n       \"    // that it is saved nicely (might be nice to debounce this).\\n\",\n       \"    setTimeout(function () {\\n\",\n       \"        fig.push_to_output();\\n\",\n       \"    }, 1000);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'btn-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'btn-group';\\n\",\n       \"    var button;\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'btn-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        button = fig.buttons[name] = document.createElement('button');\\n\",\n       \"        button.classList = 'btn btn-default';\\n\",\n       \"        button.href = '#';\\n\",\n       \"        button.title = name;\\n\",\n       \"        button.innerHTML = '<i class=\\\"fa ' + image + ' fa-lg\\\"></i>';\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Add the status bar.\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message pull-right';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"\\n\",\n       \"    // Add the close button to the window.\\n\",\n       \"    var buttongrp = document.createElement('div');\\n\",\n       \"    buttongrp.classList = 'btn-group inline pull-right';\\n\",\n       \"    button = document.createElement('button');\\n\",\n       \"    button.classList = 'btn btn-mini btn-primary';\\n\",\n       \"    button.href = '#';\\n\",\n       \"    button.title = 'Stop Interaction';\\n\",\n       \"    button.innerHTML = '<i class=\\\"fa fa-power-off icon-remove icon-large\\\"></i>';\\n\",\n       \"    button.addEventListener('click', function (_evt) {\\n\",\n       \"        fig.handle_close(fig, {});\\n\",\n       \"    });\\n\",\n       \"    button.addEventListener(\\n\",\n       \"        'mouseover',\\n\",\n       \"        on_mouseover_closure('Stop Interaction')\\n\",\n       \"    );\\n\",\n       \"    buttongrp.appendChild(button);\\n\",\n       \"    var titlebar = this.root.querySelector('.ui-dialog-titlebar');\\n\",\n       \"    titlebar.insertBefore(buttongrp, titlebar.firstChild);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._remove_fig_handler = function (event) {\\n\",\n       \"    var fig = event.data.fig;\\n\",\n       \"    fig.close_ws(fig, {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (el) {\\n\",\n       \"    el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (el) {\\n\",\n       \"    // this is important to make the div 'focusable\\n\",\n       \"    el.setAttribute('tabindex', 0);\\n\",\n       \"    // reach out to IPython and tell the keyboard manager to turn it's self\\n\",\n       \"    // off when our div gets focus\\n\",\n       \"\\n\",\n       \"    // location in version 3\\n\",\n       \"    if (IPython.notebook.keyboard_manager) {\\n\",\n       \"        IPython.notebook.keyboard_manager.register_events(el);\\n\",\n       \"    } else {\\n\",\n       \"        // location in version 2\\n\",\n       \"        IPython.keyboard_manager.register_events(el);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (event, _name) {\\n\",\n       \"    var manager = IPython.notebook.keyboard_manager;\\n\",\n       \"    if (!manager) {\\n\",\n       \"        manager = IPython.keyboard_manager;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Check for shift+enter\\n\",\n       \"    if (event.shiftKey && event.which === 13) {\\n\",\n       \"        this.canvas_div.blur();\\n\",\n       \"        // select the cell after this one\\n\",\n       \"        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\\n\",\n       \"        IPython.notebook.select(index + 1);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    fig.ondownload(fig, null);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.find_output_cell = function (html_output) {\\n\",\n       \"    // Return the cell and output element which can be found *uniquely* in the notebook.\\n\",\n       \"    // Note - this is a bit hacky, but it is done because the \\\"notebook_saving.Notebook\\\"\\n\",\n       \"    // IPython event is triggered only after the cells have been serialised, which for\\n\",\n       \"    // our purposes (turning an active figure into a static one), is too late.\\n\",\n       \"    var cells = IPython.notebook.get_cells();\\n\",\n       \"    var ncells = cells.length;\\n\",\n       \"    for (var i = 0; i < ncells; i++) {\\n\",\n       \"        var cell = cells[i];\\n\",\n       \"        if (cell.cell_type === 'code') {\\n\",\n       \"            for (var j = 0; j < cell.output_area.outputs.length; j++) {\\n\",\n       \"                var data = cell.output_area.outputs[j];\\n\",\n       \"                if (data.data) {\\n\",\n       \"                    // IPython >= 3 moved mimebundle to data attribute of output\\n\",\n       \"                    data = data.data;\\n\",\n       \"                }\\n\",\n       \"                if (data['text/html'] === html_output) {\\n\",\n       \"                    return [cell, data, j];\\n\",\n       \"                }\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// Register the function which deals with the matplotlib target/channel.\\n\",\n       \"// The kernel may be null if the page has been refreshed.\\n\",\n       \"if (IPython.notebook.kernel !== null) {\\n\",\n       \"    IPython.notebook.kernel.comm_manager.register_target(\\n\",\n       \"        'matplotlib',\\n\",\n       \"        mpl.mpl_figure_comm\\n\",\n       \"    );\\n\",\n       \"}\\n\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.Javascript object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<img src=\\\"data:,\\\" width=\\\"0\\\">\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.HTML object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<matplotlib.legend.Legend at 0x7f6305de1820>\"\n      ]\n     },\n     \"execution_count\": 57,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Random Forests and predict_proba()\\n\",\n    \"from sklearn.ensemble import RandomForestClassifier\\n\",\n    \"rfc = RandomForestClassifier()\\n\",\n    \"y_probas_rfc = cross_val_predict(rfc,\\n\",\n    \"                                 X500,\\n\",\n    \"                                 y,\\n\",\n    \"                                 cv=3,\\n\",\n    \"                                 method='predict_proba',\\n\",\n    \"                                 n_jobs=3)\\n\",\n    \"\\n\",\n    \"y_scores_rfc = y_probas_rfc[:,1]\\n\",\n    \"fpr_rfc, tpr_rfc, thresholds_rfc = roc_curve(y,y_scores_rfc) \\n\",\n    \"\\n\",\n    \"# compare precision/recall tradeoff for SGD and RF classifiers\\n\",\n    \"plt.plot(fpr, tpr, label=\\\"SGD\\\")\\n\",\n    \"plt.plot(fpr_rfc, tpr_rfc, label=\\\"RF\\\")\\n\",\n    \"plt.legend()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 58,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.8887195711908356\"\n      ]\n     },\n     \"execution_count\": 58,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"roc_auc_score(y,y_scores_rfc)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Multinomial Classification\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 59,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"0.21744791666666666\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[('GINSBURG', 'GINSBURG'),\\n\",\n       \" ('STEVENS', 'STEVENS'),\\n\",\n       \" (\\\"O'CONNOR\\\", 'KENNEDY'),\\n\",\n       \" ('KENNEDY', 'SOUTER'),\\n\",\n       \" ('KENNEDY', 'KENNEDY'),\\n\",\n       \" ('SOUTER', 'SOUTER'),\\n\",\n       \" ('BREYER', 'SOUTER'),\\n\",\n       \" ('GINSBURG', 'GINSBURG')]\"\n      ]\n     },\n     \"execution_count\": 59,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"author = df['authorship']\\n\",\n    \"authpred = cross_val_predict(sgd_clf,\\n\",\n    \"                              X500,\\n\",\n    \"                              author,\\n\",\n    \"                              cv=7)\\n\",\n    \"print((authpred == author).mean())\\n\",\n    \"list(zip(author[:8],authpred[:8]))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 60,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/javascript\": [\n       \"/* Put everything inside the global mpl namespace */\\n\",\n       \"/* global mpl */\\n\",\n       \"window.mpl = {};\\n\",\n       \"\\n\",\n       \"mpl.get_websocket_type = function () {\\n\",\n       \"    if (typeof WebSocket !== 'undefined') {\\n\",\n       \"        return WebSocket;\\n\",\n       \"    } else if (typeof MozWebSocket !== 'undefined') {\\n\",\n       \"        return MozWebSocket;\\n\",\n       \"    } else {\\n\",\n       \"        alert(\\n\",\n       \"            'Your browser does not have WebSocket support. ' +\\n\",\n       \"                'Please try Chrome, Safari or Firefox ≥ 6. ' +\\n\",\n       \"                'Firefox 4 and 5 are also supported but you ' +\\n\",\n       \"                'have to enable WebSockets in about:config.'\\n\",\n       \"        );\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\\n\",\n       \"    this.id = figure_id;\\n\",\n       \"\\n\",\n       \"    this.ws = websocket;\\n\",\n       \"\\n\",\n       \"    this.supports_binary = this.ws.binaryType !== undefined;\\n\",\n       \"\\n\",\n       \"    if (!this.supports_binary) {\\n\",\n       \"        var warnings = document.getElementById('mpl-warnings');\\n\",\n       \"        if (warnings) {\\n\",\n       \"            warnings.style.display = 'block';\\n\",\n       \"            warnings.textContent =\\n\",\n       \"                'This browser does not support binary websocket messages. ' +\\n\",\n       \"                'Performance may be slow.';\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    this.imageObj = new Image();\\n\",\n       \"\\n\",\n       \"    this.context = undefined;\\n\",\n       \"    this.message = undefined;\\n\",\n       \"    this.canvas = undefined;\\n\",\n       \"    this.rubberband_canvas = undefined;\\n\",\n       \"    this.rubberband_context = undefined;\\n\",\n       \"    this.format_dropdown = undefined;\\n\",\n       \"\\n\",\n       \"    this.image_mode = 'full';\\n\",\n       \"\\n\",\n       \"    this.root = document.createElement('div');\\n\",\n       \"    this.root.setAttribute('style', 'display: inline-block');\\n\",\n       \"    this._root_extra_style(this.root);\\n\",\n       \"\\n\",\n       \"    parent_element.appendChild(this.root);\\n\",\n       \"\\n\",\n       \"    this._init_header(this);\\n\",\n       \"    this._init_canvas(this);\\n\",\n       \"    this._init_toolbar(this);\\n\",\n       \"\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    this.waiting = false;\\n\",\n       \"\\n\",\n       \"    this.ws.onopen = function () {\\n\",\n       \"        fig.send_message('supports_binary', { value: fig.supports_binary });\\n\",\n       \"        fig.send_message('send_image_mode', {});\\n\",\n       \"        if (fig.ratio !== 1) {\\n\",\n       \"            fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\\n\",\n       \"        }\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onload = function () {\\n\",\n       \"        if (fig.image_mode === 'full') {\\n\",\n       \"            // Full images could contain transparency (where diff images\\n\",\n       \"            // almost always do), so we need to clear the canvas so that\\n\",\n       \"            // there is no ghosting.\\n\",\n       \"            fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\\n\",\n       \"        }\\n\",\n       \"        fig.context.drawImage(fig.imageObj, 0, 0);\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onunload = function () {\\n\",\n       \"        fig.ws.close();\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.ws.onmessage = this._make_on_message_function(this);\\n\",\n       \"\\n\",\n       \"    this.ondownload = ondownload;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_header = function () {\\n\",\n       \"    var titlebar = document.createElement('div');\\n\",\n       \"    titlebar.classList =\\n\",\n       \"        'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\\n\",\n       \"    var titletext = document.createElement('div');\\n\",\n       \"    titletext.classList = 'ui-dialog-title';\\n\",\n       \"    titletext.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'width: 100%; text-align: center; padding: 3px;'\\n\",\n       \"    );\\n\",\n       \"    titlebar.appendChild(titletext);\\n\",\n       \"    this.root.appendChild(titlebar);\\n\",\n       \"    this.header = titletext;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_canvas = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var canvas_div = (this.canvas_div = document.createElement('div'));\\n\",\n       \"    canvas_div.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'border: 1px solid #ddd;' +\\n\",\n       \"            'box-sizing: content-box;' +\\n\",\n       \"            'clear: both;' +\\n\",\n       \"            'min-height: 1px;' +\\n\",\n       \"            'min-width: 1px;' +\\n\",\n       \"            'outline: 0;' +\\n\",\n       \"            'overflow: hidden;' +\\n\",\n       \"            'position: relative;' +\\n\",\n       \"            'resize: both;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    function on_keyboard_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.key_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keydown',\\n\",\n       \"        on_keyboard_event_closure('key_press')\\n\",\n       \"    );\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keyup',\\n\",\n       \"        on_keyboard_event_closure('key_release')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    this._canvas_extra_style(canvas_div);\\n\",\n       \"    this.root.appendChild(canvas_div);\\n\",\n       \"\\n\",\n       \"    var canvas = (this.canvas = document.createElement('canvas'));\\n\",\n       \"    canvas.classList.add('mpl-canvas');\\n\",\n       \"    canvas.setAttribute('style', 'box-sizing: content-box;');\\n\",\n       \"\\n\",\n       \"    this.context = canvas.getContext('2d');\\n\",\n       \"\\n\",\n       \"    var backingStore =\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        this.context.webkitBackingStorePixelRatio ||\\n\",\n       \"        this.context.mozBackingStorePixelRatio ||\\n\",\n       \"        this.context.msBackingStorePixelRatio ||\\n\",\n       \"        this.context.oBackingStorePixelRatio ||\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        1;\\n\",\n       \"\\n\",\n       \"    this.ratio = (window.devicePixelRatio || 1) / backingStore;\\n\",\n       \"    if (this.ratio !== 1) {\\n\",\n       \"        fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var rubberband_canvas = (this.rubberband_canvas = document.createElement(\\n\",\n       \"        'canvas'\\n\",\n       \"    ));\\n\",\n       \"    rubberband_canvas.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    var resizeObserver = new ResizeObserver(function (entries) {\\n\",\n       \"        var nentries = entries.length;\\n\",\n       \"        for (var i = 0; i < nentries; i++) {\\n\",\n       \"            var entry = entries[i];\\n\",\n       \"            var width, height;\\n\",\n       \"            if (entry.contentBoxSize) {\\n\",\n       \"                if (entry.contentBoxSize instanceof Array) {\\n\",\n       \"                    // Chrome 84 implements new version of spec.\\n\",\n       \"                    width = entry.contentBoxSize[0].inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize[0].blockSize;\\n\",\n       \"                } else {\\n\",\n       \"                    // Firefox implements old version of spec.\\n\",\n       \"                    width = entry.contentBoxSize.inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize.blockSize;\\n\",\n       \"                }\\n\",\n       \"            } else {\\n\",\n       \"                // Chrome <84 implements even older version of spec.\\n\",\n       \"                width = entry.contentRect.width;\\n\",\n       \"                height = entry.contentRect.height;\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            // Keep the size of the canvas and rubber band canvas in sync with\\n\",\n       \"            // the canvas container.\\n\",\n       \"            if (entry.devicePixelContentBoxSize) {\\n\",\n       \"                // Chrome 84 implements new version of spec.\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'width',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].inlineSize\\n\",\n       \"                );\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'height',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].blockSize\\n\",\n       \"                );\\n\",\n       \"            } else {\\n\",\n       \"                canvas.setAttribute('width', width * fig.ratio);\\n\",\n       \"                canvas.setAttribute('height', height * fig.ratio);\\n\",\n       \"            }\\n\",\n       \"            canvas.setAttribute(\\n\",\n       \"                'style',\\n\",\n       \"                'width: ' + width + 'px; height: ' + height + 'px;'\\n\",\n       \"            );\\n\",\n       \"\\n\",\n       \"            rubberband_canvas.setAttribute('width', width);\\n\",\n       \"            rubberband_canvas.setAttribute('height', height);\\n\",\n       \"\\n\",\n       \"            // And update the size in Python. We ignore the initial 0/0 size\\n\",\n       \"            // that occurs as the element is placed into the DOM, which should\\n\",\n       \"            // otherwise not happen due to the minimum size styling.\\n\",\n       \"            if (width != 0 && height != 0) {\\n\",\n       \"                fig.request_resize(width, height);\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    });\\n\",\n       \"    resizeObserver.observe(canvas_div);\\n\",\n       \"\\n\",\n       \"    function on_mouse_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.mouse_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousedown',\\n\",\n       \"        on_mouse_event_closure('button_press')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseup',\\n\",\n       \"        on_mouse_event_closure('button_release')\\n\",\n       \"    );\\n\",\n       \"    // Throttle sequential mouse events to 1 every 20ms.\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousemove',\\n\",\n       \"        on_mouse_event_closure('motion_notify')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseenter',\\n\",\n       \"        on_mouse_event_closure('figure_enter')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseleave',\\n\",\n       \"        on_mouse_event_closure('figure_leave')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener('wheel', function (event) {\\n\",\n       \"        if (event.deltaY < 0) {\\n\",\n       \"            event.step = 1;\\n\",\n       \"        } else {\\n\",\n       \"            event.step = -1;\\n\",\n       \"        }\\n\",\n       \"        on_mouse_event_closure('scroll')(event);\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    canvas_div.appendChild(canvas);\\n\",\n       \"    canvas_div.appendChild(rubberband_canvas);\\n\",\n       \"\\n\",\n       \"    this.rubberband_context = rubberband_canvas.getContext('2d');\\n\",\n       \"    this.rubberband_context.strokeStyle = '#000000';\\n\",\n       \"\\n\",\n       \"    this._resize_canvas = function (width, height, forward) {\\n\",\n       \"        if (forward) {\\n\",\n       \"            canvas_div.style.width = width + 'px';\\n\",\n       \"            canvas_div.style.height = height + 'px';\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    // Disable right mouse context menu.\\n\",\n       \"    this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\\n\",\n       \"        event.preventDefault();\\n\",\n       \"        return false;\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    function set_focus() {\\n\",\n       \"        canvas.focus();\\n\",\n       \"        canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    window.setTimeout(set_focus, 100);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'mpl-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var button = (fig.buttons[name] = document.createElement('button'));\\n\",\n       \"        button.classList = 'mpl-widget';\\n\",\n       \"        button.setAttribute('role', 'button');\\n\",\n       \"        button.setAttribute('aria-disabled', 'false');\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"\\n\",\n       \"        var icon_img = document.createElement('img');\\n\",\n       \"        icon_img.src = '_images/' + image + '.png';\\n\",\n       \"        icon_img.srcset = '_images/' + image + '_large.png 2x';\\n\",\n       \"        icon_img.alt = tooltip;\\n\",\n       \"        button.appendChild(icon_img);\\n\",\n       \"\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fmt_picker = document.createElement('select');\\n\",\n       \"    fmt_picker.classList = 'mpl-widget';\\n\",\n       \"    toolbar.appendChild(fmt_picker);\\n\",\n       \"    this.format_dropdown = fmt_picker;\\n\",\n       \"\\n\",\n       \"    for (var ind in mpl.extensions) {\\n\",\n       \"        var fmt = mpl.extensions[ind];\\n\",\n       \"        var option = document.createElement('option');\\n\",\n       \"        option.selected = fmt === mpl.default_extension;\\n\",\n       \"        option.innerHTML = fmt;\\n\",\n       \"        fmt_picker.appendChild(option);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\\n\",\n       \"    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\\n\",\n       \"    // which will in turn request a refresh of the image.\\n\",\n       \"    this.send_message('resize', { width: x_pixels, height: y_pixels });\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_message = function (type, properties) {\\n\",\n       \"    properties['type'] = type;\\n\",\n       \"    properties['figure_id'] = this.id;\\n\",\n       \"    this.ws.send(JSON.stringify(properties));\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_draw_message = function () {\\n\",\n       \"    if (!this.waiting) {\\n\",\n       \"        this.waiting = true;\\n\",\n       \"        this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    var format_dropdown = fig.format_dropdown;\\n\",\n       \"    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\\n\",\n       \"    fig.ondownload(fig, format);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_resize = function (fig, msg) {\\n\",\n       \"    var size = msg['size'];\\n\",\n       \"    if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\\n\",\n       \"        fig._resize_canvas(size[0], size[1], msg['forward']);\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\\n\",\n       \"    var x0 = msg['x0'] / fig.ratio;\\n\",\n       \"    var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\\n\",\n       \"    var x1 = msg['x1'] / fig.ratio;\\n\",\n       \"    var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\\n\",\n       \"    x0 = Math.floor(x0) + 0.5;\\n\",\n       \"    y0 = Math.floor(y0) + 0.5;\\n\",\n       \"    x1 = Math.floor(x1) + 0.5;\\n\",\n       \"    y1 = Math.floor(y1) + 0.5;\\n\",\n       \"    var min_x = Math.min(x0, x1);\\n\",\n       \"    var min_y = Math.min(y0, y1);\\n\",\n       \"    var width = Math.abs(x1 - x0);\\n\",\n       \"    var height = Math.abs(y1 - y0);\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.clearRect(\\n\",\n       \"        0,\\n\",\n       \"        0,\\n\",\n       \"        fig.canvas.width / fig.ratio,\\n\",\n       \"        fig.canvas.height / fig.ratio\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\\n\",\n       \"    // Updates the figure title.\\n\",\n       \"    fig.header.textContent = msg['label'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_cursor = function (fig, msg) {\\n\",\n       \"    var cursor = msg['cursor'];\\n\",\n       \"    switch (cursor) {\\n\",\n       \"        case 0:\\n\",\n       \"            cursor = 'pointer';\\n\",\n       \"            break;\\n\",\n       \"        case 1:\\n\",\n       \"            cursor = 'default';\\n\",\n       \"            break;\\n\",\n       \"        case 2:\\n\",\n       \"            cursor = 'crosshair';\\n\",\n       \"            break;\\n\",\n       \"        case 3:\\n\",\n       \"            cursor = 'move';\\n\",\n       \"            break;\\n\",\n       \"    }\\n\",\n       \"    fig.rubberband_canvas.style.cursor = cursor;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_message = function (fig, msg) {\\n\",\n       \"    fig.message.textContent = msg['message'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_draw = function (fig, _msg) {\\n\",\n       \"    // Request the server to send over a new figure.\\n\",\n       \"    fig.send_draw_message();\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\\n\",\n       \"    fig.image_mode = msg['mode'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\\n\",\n       \"    for (var key in msg) {\\n\",\n       \"        if (!(key in fig.buttons)) {\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"        fig.buttons[key].disabled = !msg[key];\\n\",\n       \"        fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\\n\",\n       \"    if (msg['mode'] === 'PAN') {\\n\",\n       \"        fig.buttons['Pan'].classList.add('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    } else if (msg['mode'] === 'ZOOM') {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.add('active');\\n\",\n       \"    } else {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Called whenever the canvas gets updated.\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// A function to construct a web socket function for onmessage handling.\\n\",\n       \"// Called in the figure constructor.\\n\",\n       \"mpl.figure.prototype._make_on_message_function = function (fig) {\\n\",\n       \"    return function socket_on_message(evt) {\\n\",\n       \"        if (evt.data instanceof Blob) {\\n\",\n       \"            /* FIXME: We get \\\"Resource interpreted as Image but\\n\",\n       \"             * transferred with MIME type text/plain:\\\" errors on\\n\",\n       \"             * Chrome.  But how to set the MIME type?  It doesn't seem\\n\",\n       \"             * to be part of the websocket stream */\\n\",\n       \"            evt.data.type = 'image/png';\\n\",\n       \"\\n\",\n       \"            /* Free the memory for the previous frames */\\n\",\n       \"            if (fig.imageObj.src) {\\n\",\n       \"                (window.URL || window.webkitURL).revokeObjectURL(\\n\",\n       \"                    fig.imageObj.src\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\\n\",\n       \"                evt.data\\n\",\n       \"            );\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        } else if (\\n\",\n       \"            typeof evt.data === 'string' &&\\n\",\n       \"            evt.data.slice(0, 21) === 'data:image/png;base64'\\n\",\n       \"        ) {\\n\",\n       \"            fig.imageObj.src = evt.data;\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var msg = JSON.parse(evt.data);\\n\",\n       \"        var msg_type = msg['type'];\\n\",\n       \"\\n\",\n       \"        // Call the  \\\"handle_{type}\\\" callback, which takes\\n\",\n       \"        // the figure and JSON message as its only arguments.\\n\",\n       \"        try {\\n\",\n       \"            var callback = fig['handle_' + msg_type];\\n\",\n       \"        } catch (e) {\\n\",\n       \"            console.log(\\n\",\n       \"                \\\"No handler for the '\\\" + msg_type + \\\"' message type: \\\",\\n\",\n       \"                msg\\n\",\n       \"            );\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        if (callback) {\\n\",\n       \"            try {\\n\",\n       \"                // console.log(\\\"Handling '\\\" + msg_type + \\\"' message: \\\", msg);\\n\",\n       \"                callback(fig, msg);\\n\",\n       \"            } catch (e) {\\n\",\n       \"                console.log(\\n\",\n       \"                    \\\"Exception inside the 'handler_\\\" + msg_type + \\\"' callback:\\\",\\n\",\n       \"                    e,\\n\",\n       \"                    e.stack,\\n\",\n       \"                    msg\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\\n\",\n       \"mpl.findpos = function (e) {\\n\",\n       \"    //this section is from http://www.quirksmode.org/js/events_properties.html\\n\",\n       \"    var targ;\\n\",\n       \"    if (!e) {\\n\",\n       \"        e = window.event;\\n\",\n       \"    }\\n\",\n       \"    if (e.target) {\\n\",\n       \"        targ = e.target;\\n\",\n       \"    } else if (e.srcElement) {\\n\",\n       \"        targ = e.srcElement;\\n\",\n       \"    }\\n\",\n       \"    if (targ.nodeType === 3) {\\n\",\n       \"        // defeat Safari bug\\n\",\n       \"        targ = targ.parentNode;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // pageX,Y are the mouse positions relative to the document\\n\",\n       \"    var boundingRect = targ.getBoundingClientRect();\\n\",\n       \"    var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\\n\",\n       \"    var y = e.pageY - (boundingRect.top + document.body.scrollTop);\\n\",\n       \"\\n\",\n       \"    return { x: x, y: y };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"/*\\n\",\n       \" * return a copy of an object with only non-object keys\\n\",\n       \" * we need this to avoid circular references\\n\",\n       \" * http://stackoverflow.com/a/24161582/3208463\\n\",\n       \" */\\n\",\n       \"function simpleKeys(original) {\\n\",\n       \"    return Object.keys(original).reduce(function (obj, key) {\\n\",\n       \"        if (typeof original[key] !== 'object') {\\n\",\n       \"            obj[key] = original[key];\\n\",\n       \"        }\\n\",\n       \"        return obj;\\n\",\n       \"    }, {});\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.mouse_event = function (event, name) {\\n\",\n       \"    var canvas_pos = mpl.findpos(event);\\n\",\n       \"\\n\",\n       \"    if (name === 'button_press') {\\n\",\n       \"        this.canvas.focus();\\n\",\n       \"        this.canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var x = canvas_pos.x * this.ratio;\\n\",\n       \"    var y = canvas_pos.y * this.ratio;\\n\",\n       \"\\n\",\n       \"    this.send_message(name, {\\n\",\n       \"        x: x,\\n\",\n       \"        y: y,\\n\",\n       \"        button: event.button,\\n\",\n       \"        step: event.step,\\n\",\n       \"        guiEvent: simpleKeys(event),\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    /* This prevents the web browser from automatically changing to\\n\",\n       \"     * the text insertion cursor when the button is pressed.  We want\\n\",\n       \"     * to control all of the cursor setting manually through the\\n\",\n       \"     * 'cursor' event from matplotlib */\\n\",\n       \"    event.preventDefault();\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (_event, _name) {\\n\",\n       \"    // Handle any extra behaviour associated with a key event\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.key_event = function (event, name) {\\n\",\n       \"    // Prevent repeat events\\n\",\n       \"    if (name === 'key_press') {\\n\",\n       \"        if (event.which === this._key) {\\n\",\n       \"            return;\\n\",\n       \"        } else {\\n\",\n       \"            this._key = event.which;\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"    if (name === 'key_release') {\\n\",\n       \"        this._key = null;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var value = '';\\n\",\n       \"    if (event.ctrlKey && event.which !== 17) {\\n\",\n       \"        value += 'ctrl+';\\n\",\n       \"    }\\n\",\n       \"    if (event.altKey && event.which !== 18) {\\n\",\n       \"        value += 'alt+';\\n\",\n       \"    }\\n\",\n       \"    if (event.shiftKey && event.which !== 16) {\\n\",\n       \"        value += 'shift+';\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    value += 'k';\\n\",\n       \"    value += event.which.toString();\\n\",\n       \"\\n\",\n       \"    this._key_event_extra(event, name);\\n\",\n       \"\\n\",\n       \"    this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onclick = function (name) {\\n\",\n       \"    if (name === 'download') {\\n\",\n       \"        this.handle_save(this, null);\\n\",\n       \"    } else {\\n\",\n       \"        this.send_message('toolbar_button', { name: name });\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\\n\",\n       \"    this.message.textContent = tooltip;\\n\",\n       \"};\\n\",\n       \"mpl.toolbar_items = [[\\\"Home\\\", \\\"Reset original view\\\", \\\"fa fa-home icon-home\\\", \\\"home\\\"], [\\\"Back\\\", \\\"Back to previous view\\\", \\\"fa fa-arrow-left icon-arrow-left\\\", \\\"back\\\"], [\\\"Forward\\\", \\\"Forward to next view\\\", \\\"fa fa-arrow-right icon-arrow-right\\\", \\\"forward\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Pan\\\", \\\"Left button pans, Right button zooms\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-arrows icon-move\\\", \\\"pan\\\"], [\\\"Zoom\\\", \\\"Zoom to rectangle\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-square-o icon-check-empty\\\", \\\"zoom\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Download\\\", \\\"Download plot\\\", \\\"fa fa-floppy-o icon-save\\\", \\\"download\\\"]];\\n\",\n       \"\\n\",\n       \"mpl.extensions = [\\\"eps\\\", \\\"jpeg\\\", \\\"pdf\\\", \\\"png\\\", \\\"ps\\\", \\\"raw\\\", \\\"svg\\\", \\\"tif\\\"];\\n\",\n       \"\\n\",\n       \"mpl.default_extension = \\\"png\\\";/* global mpl */\\n\",\n       \"\\n\",\n       \"var comm_websocket_adapter = function (comm) {\\n\",\n       \"    // Create a \\\"websocket\\\"-like object which calls the given IPython comm\\n\",\n       \"    // object with the appropriate methods. Currently this is a non binary\\n\",\n       \"    // socket, so there is still some room for performance tuning.\\n\",\n       \"    var ws = {};\\n\",\n       \"\\n\",\n       \"    ws.close = function () {\\n\",\n       \"        comm.close();\\n\",\n       \"    };\\n\",\n       \"    ws.send = function (m) {\\n\",\n       \"        //console.log('sending', m);\\n\",\n       \"        comm.send(m);\\n\",\n       \"    };\\n\",\n       \"    // Register the callback with on_msg.\\n\",\n       \"    comm.on_msg(function (msg) {\\n\",\n       \"        //console.log('receiving', msg['content']['data'], msg);\\n\",\n       \"        // Pass the mpl event to the overridden (by mpl) onmessage function.\\n\",\n       \"        ws.onmessage(msg['content']['data']);\\n\",\n       \"    });\\n\",\n       \"    return ws;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.mpl_figure_comm = function (comm, msg) {\\n\",\n       \"    // This is the function which gets called when the mpl process\\n\",\n       \"    // starts-up an IPython Comm through the \\\"matplotlib\\\" channel.\\n\",\n       \"\\n\",\n       \"    var id = msg.content.data.id;\\n\",\n       \"    // Get hold of the div created by the display call when the Comm\\n\",\n       \"    // socket was opened in Python.\\n\",\n       \"    var element = document.getElementById(id);\\n\",\n       \"    var ws_proxy = comm_websocket_adapter(comm);\\n\",\n       \"\\n\",\n       \"    function ondownload(figure, _format) {\\n\",\n       \"        window.open(figure.canvas.toDataURL());\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fig = new mpl.figure(id, ws_proxy, ondownload, element);\\n\",\n       \"\\n\",\n       \"    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\\n\",\n       \"    // web socket which is closed, not our websocket->open comm proxy.\\n\",\n       \"    ws_proxy.onopen();\\n\",\n       \"\\n\",\n       \"    fig.parent_element = element;\\n\",\n       \"    fig.cell_info = mpl.find_output_cell(\\\"<div id='\\\" + id + \\\"'></div>\\\");\\n\",\n       \"    if (!fig.cell_info) {\\n\",\n       \"        console.error('Failed to find cell for figure', id, fig);\\n\",\n       \"        return;\\n\",\n       \"    }\\n\",\n       \"    fig.cell_info[0].output_area.element.one(\\n\",\n       \"        'cleared',\\n\",\n       \"        { fig: fig },\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_close = function (fig, msg) {\\n\",\n       \"    var width = fig.canvas.width / fig.ratio;\\n\",\n       \"    fig.cell_info[0].output_area.element.off(\\n\",\n       \"        'cleared',\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    // Update the output cell to use the data from the current canvas.\\n\",\n       \"    fig.push_to_output();\\n\",\n       \"    var dataURL = fig.canvas.toDataURL();\\n\",\n       \"    // Re-enable the keyboard manager in IPython - without this line, in FF,\\n\",\n       \"    // the notebook keyboard shortcuts fail.\\n\",\n       \"    IPython.keyboard_manager.enable();\\n\",\n       \"    fig.parent_element.innerHTML =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"    fig.close_ws(fig, msg);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.close_ws = function (fig, msg) {\\n\",\n       \"    fig.send_message('closing', msg);\\n\",\n       \"    // fig.ws.close()\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\\n\",\n       \"    // Turn the data on the canvas into data in the output cell.\\n\",\n       \"    var width = this.canvas.width / this.ratio;\\n\",\n       \"    var dataURL = this.canvas.toDataURL();\\n\",\n       \"    this.cell_info[1]['text/html'] =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Tell IPython that the notebook contents must change.\\n\",\n       \"    IPython.notebook.set_dirty(true);\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"    var fig = this;\\n\",\n       \"    // Wait a second, then push the new image to the DOM so\\n\",\n       \"    // that it is saved nicely (might be nice to debounce this).\\n\",\n       \"    setTimeout(function () {\\n\",\n       \"        fig.push_to_output();\\n\",\n       \"    }, 1000);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'btn-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'btn-group';\\n\",\n       \"    var button;\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'btn-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        button = fig.buttons[name] = document.createElement('button');\\n\",\n       \"        button.classList = 'btn btn-default';\\n\",\n       \"        button.href = '#';\\n\",\n       \"        button.title = name;\\n\",\n       \"        button.innerHTML = '<i class=\\\"fa ' + image + ' fa-lg\\\"></i>';\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Add the status bar.\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message pull-right';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"\\n\",\n       \"    // Add the close button to the window.\\n\",\n       \"    var buttongrp = document.createElement('div');\\n\",\n       \"    buttongrp.classList = 'btn-group inline pull-right';\\n\",\n       \"    button = document.createElement('button');\\n\",\n       \"    button.classList = 'btn btn-mini btn-primary';\\n\",\n       \"    button.href = '#';\\n\",\n       \"    button.title = 'Stop Interaction';\\n\",\n       \"    button.innerHTML = '<i class=\\\"fa fa-power-off icon-remove icon-large\\\"></i>';\\n\",\n       \"    button.addEventListener('click', function (_evt) {\\n\",\n       \"        fig.handle_close(fig, {});\\n\",\n       \"    });\\n\",\n       \"    button.addEventListener(\\n\",\n       \"        'mouseover',\\n\",\n       \"        on_mouseover_closure('Stop Interaction')\\n\",\n       \"    );\\n\",\n       \"    buttongrp.appendChild(button);\\n\",\n       \"    var titlebar = this.root.querySelector('.ui-dialog-titlebar');\\n\",\n       \"    titlebar.insertBefore(buttongrp, titlebar.firstChild);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._remove_fig_handler = function (event) {\\n\",\n       \"    var fig = event.data.fig;\\n\",\n       \"    fig.close_ws(fig, {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (el) {\\n\",\n       \"    el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (el) {\\n\",\n       \"    // this is important to make the div 'focusable\\n\",\n       \"    el.setAttribute('tabindex', 0);\\n\",\n       \"    // reach out to IPython and tell the keyboard manager to turn it's self\\n\",\n       \"    // off when our div gets focus\\n\",\n       \"\\n\",\n       \"    // location in version 3\\n\",\n       \"    if (IPython.notebook.keyboard_manager) {\\n\",\n       \"        IPython.notebook.keyboard_manager.register_events(el);\\n\",\n       \"    } else {\\n\",\n       \"        // location in version 2\\n\",\n       \"        IPython.keyboard_manager.register_events(el);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (event, _name) {\\n\",\n       \"    var manager = IPython.notebook.keyboard_manager;\\n\",\n       \"    if (!manager) {\\n\",\n       \"        manager = IPython.keyboard_manager;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Check for shift+enter\\n\",\n       \"    if (event.shiftKey && event.which === 13) {\\n\",\n       \"        this.canvas_div.blur();\\n\",\n       \"        // select the cell after this one\\n\",\n       \"        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\\n\",\n       \"        IPython.notebook.select(index + 1);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    fig.ondownload(fig, null);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.find_output_cell = function (html_output) {\\n\",\n       \"    // Return the cell and output element which can be found *uniquely* in the notebook.\\n\",\n       \"    // Note - this is a bit hacky, but it is done because the \\\"notebook_saving.Notebook\\\"\\n\",\n       \"    // IPython event is triggered only after the cells have been serialised, which for\\n\",\n       \"    // our purposes (turning an active figure into a static one), is too late.\\n\",\n       \"    var cells = IPython.notebook.get_cells();\\n\",\n       \"    var ncells = cells.length;\\n\",\n       \"    for (var i = 0; i < ncells; i++) {\\n\",\n       \"        var cell = cells[i];\\n\",\n       \"        if (cell.cell_type === 'code') {\\n\",\n       \"            for (var j = 0; j < cell.output_area.outputs.length; j++) {\\n\",\n       \"                var data = cell.output_area.outputs[j];\\n\",\n       \"                if (data.data) {\\n\",\n       \"                    // IPython >= 3 moved mimebundle to data attribute of output\\n\",\n       \"                    data = data.data;\\n\",\n       \"                }\\n\",\n       \"                if (data['text/html'] === html_output) {\\n\",\n       \"                    return [cell, data, j];\\n\",\n       \"                }\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// Register the function which deals with the matplotlib target/channel.\\n\",\n       \"// The kernel may be null if the page has been refreshed.\\n\",\n       \"if (IPython.notebook.kernel !== null) {\\n\",\n       \"    IPython.notebook.kernel.comm_manager.register_target(\\n\",\n       \"        'matplotlib',\\n\",\n       \"        mpl.mpl_figure_comm\\n\",\n       \"    );\\n\",\n       \"}\\n\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.Javascript object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<img src=\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAHgCAYAAAB91L6VAAAgAElEQVR4Xu3de4xc5Z3m8Z8vMQaWNgPB5mKDvFzCAgqGcJmQCLAmJKwWRSRREAlSDNkhEndCSLBZIPYIMGAtIRduTiKClI2ARDisskIKaAYTLksgAwksw22ZYW0cAqOFxizjJrZ7dcrpri53Vb3vaVe5Lv0pyX8g3jrn1HOe3/vt5/e+p2rK8PDwcHhRgAIUoAAFKLBdFZgCwNtVbyejAAUoQAEKVBQAYEagAAUoQAEKdEABAO6A6E5JAQpQgAIUAGAeoAAFKEABCnRAAQDugOhOSQEKUIACFABgHqAABShAAQp0QAEA7oDoTkkBClCAAhQAYB6gAAUoQAEKdEABAO6A6E5JAQpQgAIUAGAeoAAFKEABCnRAAQDugOhOSQEKUIACFABgHqAABShAAQp0QAEA7oDoTkkBClCAAhQAYB6gAAUoQAEKdEABAO6A6E5JAQpQgAIUAGAeoAAFKEABCnRAAQDugOhOSQEKUIACFABgHqAABShAAQp0QAEA7oDoTkkBClCAAhQAYB6gAAUoQAEKdEABAO6A6E5JAQpQgAIUAGAeoAAFKEABCnRAAQDugOhOSQEKUIACFABgHqAABShAAQp0QAEA7oDoTkkBClCAAhQAYB6gAAUoQAEKdEABAO6A6E5JAQpQgAIUAGAeoAAFKEABCnRAAQDugOhOSQEKUIACFABgHqAABShAAQp0QAEA7oDoTkkBClCAAhQAYB6gAAUoQAEKdEABAO6A6E5JAQpQgAIUAGAeoAAFKEABCnRAAQDugOhOSQEKUIACFABgHqAABShAAQp0QAEA7oDoTkkBClCAAhQAYB6gAAUoQAEKdEABAO6A6E5JAQpQgAIUAGAeoAAFKEABCnRAAQDugOhOSQEKUIACFADgNnrg5ptvjhUrVsQbb7wRhx9+eHz/+9+PY445po1n7M5DL1++PO6999544YUXYscdd4zjjjsurr/++vjIRz7SnRe8Ha/quuuuiyVLlsRFF10UN91003Y8c/ec6vXXX4/LLrss7r///nj//ffjgAMOiDvuuCOOOuqo7rnI7XQlmzZtiqVLl8ZPf/rTyryx9957x5lnnhlXXHFFTJkyZTtdRedO8/DDD1fmzN/97nfxxz/+MVatWhWnnnrq6AUNDw/Ht7/97fjhD38Y77zzTnziE5+IW2+9NQ488MDOXfQ2nBmAt0G8Zm+9++674ytf+Urcdtttceyxx1Ym15///Ofx4osvxuzZs9t01u487Mknnxynn356HH300bFx48a4/PLL47nnnovnn38+dt555+686O1wVU8++WScdtppMTAwEAsXLpyUAH777bfjiCOOqHz+c845J/bYY494+eWXY//996/8m2yva6+9Nm688ca4884749BDD42nnnoqzjrrrLjmmmviwgsv7Hs5ij/CHn300fjYxz4Wn//858cBuPjDvfiDvtBn/vz5ceWVV8azzz5bmUtmzpzZc/oAcJtuWQHdAjg/+MEPKmfYvHlzzJs3Ly644IJYvHhxm87aG4d96623Kn+ErF69Oo4//vjeuOgWX+V7770XRx55ZNxyyy1x9dVXx4IFCyYlgItaKCbc3/zmNy1WuDcPd8opp8ScOXPixz/+8egH+MIXvlDpHBWpeDK9isQ/NgEX6bfoCHzjG9+ISy+9tCLF4OBgRa+f/OQnlT/ye+0FwG24Yx988EHstNNO8Ytf/KKmfbJo0aJK2+S+++5rw1l755CvvPJKpWVU/OV62GGH9c6Ft/BKCy/stttu8Z3vfCdOPPHESQvgQw45JD7zmc/E2rVrK3+Q7bPPPnHuuefG2Wef3UK1e+dQRQJeuXJl/PrXv46DDjoofv/738enP/3pSio+44wzeueDtOBKtwbwq6++WumKPP3005V6GXmdcMIJlf/+7ne/24Kzbt9DAHAb9F63bl1lInnsscfi4x//+OgZvvWtb1UmmSeeeKINZ+2NQxadgM9+9rOVP0QeeeSR3rjoFl/lXXfdVWkpFi3oom02mQE80ja85JJL4otf/GJFk2I9vFi6Kf5ImWyvoj6KJZobbrghpk2bFsWacOGVYp/AZHttDeBiPi3WfIv5da+99hqVo1jGKcYWy3699gLgNtwxAG4sarHOV6zzFPCdO3duG9Tv7kOuWbOmsrnogQceiI9+9KOVi53MAJ4xY0ZFj2JyHXkVa50FiB9//PHuvpltuLrij7NvfvOblY1IxRrwM888ExdffHElAU+2P0gAuA0GmwyH1IKuf5fPP//8Svu92OlYbKCYjK9f/vKX8bnPfa6SbkZeRcopJpupU6fG0NBQzf/rd43222+/OOmkk+JHP/rR6EctdrUW6+LF7ujJ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jyuvvDKeffbZeP7552PmzJlZKgEwAANwVqlUBgEwAANwfr30NIDHfswpU6bUALhIv3vvvXd84xvfiEsvvbQytPgFjDlz5sRPfvKTOP3007NUAmAABuCsUgHgrWSyBlwriBZ0/Trq2QTcDMCvvvpq7L///vH000/HggULRoeecMIJlf/+7ne/mzWrADAAA3BWqQAwADc1CgBPIgA/9thjlTXfdevWxV577TX6yU877bQo0vLdd99dV42hoaEo/o28CgDPmzcv/BxhVS67oKtaWAOuLSMtaC1oLej8P1j7tgU9UQAvXbo0li1bNk5BAAbgemUFwADcaLrVgtaCzkGxFvQYlSTgtGUkYAm4kUskYAlYAk7PoWNH9CWARzZhFRuwio1YxatoJ8+ePdsmrHL+GDcagAEYgNNFJAFLwGmX9PBjSO+991688sorlc94xBFHxI033hgLFy6M3XbbLfbdd98oHkO67rrrah5D+sMf/uAxpBxXNBkDwAAMwOkiAmAATrukhwH80EMPVYC79WvRokWVlDvyRRwrV66sfBHHJz/5ybjlllvioIMOytFlNDXPmjXLJqwxigEwAANwegoBYABOu6SHAZzz4bZ1jMeQxisIwAAMwOmZBYABOO0SAG6qEQADcDOD2AVdq45NWFU9ABiAAThHgSZjABiAATi/iAAYgBu5xRdx1FemL3ZB508R5UYCMAADcH7NADAAA3B+vRQjAVgCLuUYa8DWgK0Bp0tGC1oLOu0SALYGnOOSMWMAGIABOF00AAzAaZcAMADnuASA66pkE1atLFrQWtBa0OUmVC1oLehSjpGAJWAJOF0yErAEnHaJBCwB57hEApaAM3wiAUvAEnBGoYwZIgFLwKUcIwFLwBJwumQkYAk47RIJWALOcYkELAFn+EQCloAl4IxCkYDzRBocHIxdd901Tpz7tzF96oy8N7Vp1Ivn7d2mI5c77L9ftaHcG9owevq/vteGo5Y/5OY168q/qQ3vmDbnw204avlDDr+7vvyb2vCO4bl7tuGo5Q75we47lXtDm0bv8Ppgm45c7rD/fNrscm9ow+jNQxviX/7r31V+G6D4jv9ueGlBN7kLa9eujXnz5nXDfXINFKAABSjQAgXWrFkTc+fObcGRtv0QANxEw82bN8e6detil112iSlTpkxI7eLbtAqIFzd9YGBgQsfopzfRo3o3aVHrbHrwRqO5rhXeKH4hb/369bH33nvH1KlTu2JaBeA234aRr7Ms2tkAHEGP2km2aIXxxhZNeIM3mgG4H2sFgAG4zQqMTzn9WEgTERFweGOyAWciddLPf5wB8EQdkfk+k6xJ1iSbVyxqRQKebLUCwHlzw4RHDQ0NxfLly2PJkiWxww47TPg4/fJGelTvJC1qXU0P3mg0z/WrNwC4X8jmc1CAAhSgQE8pAMA9dbtcLAUoQAEK9IsCANwvd9LnoAAFKECBnlIAgHvqdrlYClCAAhToFwUAuF/upM9BAQpQgAI9pQAA99TtcrEUoAAFKNAvCgBwv9xJn4MCFKAABXpKAQDuqdvlYilAAQpQoF8UAOB+uZM+BwUoQAEK9JQCANxTt8vFUoACFKBAvygAwP1yJ30OClCAAhToKQUAuKdul4ulAAUoQIF+UQCA++VO+hwUoAAFKNBTCgBwT90uF0sBClCAAv2iAAD3y530OShAAQpQoKcUAOCeul0ulgIUoAAF+kUBAO6XO+lzUIACFKBATykAwD11u1wsBShAAQr0iwIA3C930uegAAUoQIGeUgCAe+p2uVgKUIACFOgXBQC4X+6kz0EBClCAAj2lAAD31O1ysRSgAAUo0C8KAHC/3EmfgwIUoAAFekoBAO6p2+ViKUABClCgXxQA4H65kz4HBShAAQr0lAIA3FO3y8VSgAIUoEC/KADA/XInfQ4KUIACFOgpBQC4p26Xi6UABShAgX5RAID75U76HBSgAAUo0FMKAHBP3S4XSwEKUIAC/aIAAPfLnfQ5KEABClCgpxQA4J66XS6WAhSgAAX6RQEA7pc76XNQgAIUoEBPKQDAPXW7XCwFKEABCvSLAgDcL3fS56AABShAgZ5SAIB76na5WApQgAIU6BcFALhf7qTPQQEKUIACPaXA/wdf6htPtj0jugAAAABJRU5ErkJggg==\\\" width=\\\"480\\\">\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.HTML object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# Multi-class confusion matrix\\n\",\n    \"conf_mx = confusion_matrix(author,authpred)\\n\",\n    \"conf_mx\\n\",\n    \"plt.matshow(conf_mx)\\n\",\n    \"plt.show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 61,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/javascript\": [\n       \"/* Put everything inside the global mpl namespace */\\n\",\n       \"/* global mpl */\\n\",\n       \"window.mpl = {};\\n\",\n       \"\\n\",\n       \"mpl.get_websocket_type = function () {\\n\",\n       \"    if (typeof WebSocket !== 'undefined') {\\n\",\n       \"        return WebSocket;\\n\",\n       \"    } else if (typeof MozWebSocket !== 'undefined') {\\n\",\n       \"        return MozWebSocket;\\n\",\n       \"    } else {\\n\",\n       \"        alert(\\n\",\n       \"            'Your browser does not have WebSocket support. ' +\\n\",\n       \"                'Please try Chrome, Safari or Firefox ≥ 6. ' +\\n\",\n       \"                'Firefox 4 and 5 are also supported but you ' +\\n\",\n       \"                'have to enable WebSockets in about:config.'\\n\",\n       \"        );\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\\n\",\n       \"    this.id = figure_id;\\n\",\n       \"\\n\",\n       \"    this.ws = websocket;\\n\",\n       \"\\n\",\n       \"    this.supports_binary = this.ws.binaryType !== undefined;\\n\",\n       \"\\n\",\n       \"    if (!this.supports_binary) {\\n\",\n       \"        var warnings = document.getElementById('mpl-warnings');\\n\",\n       \"        if (warnings) {\\n\",\n       \"            warnings.style.display = 'block';\\n\",\n       \"            warnings.textContent =\\n\",\n       \"                'This browser does not support binary websocket messages. ' +\\n\",\n       \"                'Performance may be slow.';\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    this.imageObj = new Image();\\n\",\n       \"\\n\",\n       \"    this.context = undefined;\\n\",\n       \"    this.message = undefined;\\n\",\n       \"    this.canvas = undefined;\\n\",\n       \"    this.rubberband_canvas = undefined;\\n\",\n       \"    this.rubberband_context = undefined;\\n\",\n       \"    this.format_dropdown = undefined;\\n\",\n       \"\\n\",\n       \"    this.image_mode = 'full';\\n\",\n       \"\\n\",\n       \"    this.root = document.createElement('div');\\n\",\n       \"    this.root.setAttribute('style', 'display: inline-block');\\n\",\n       \"    this._root_extra_style(this.root);\\n\",\n       \"\\n\",\n       \"    parent_element.appendChild(this.root);\\n\",\n       \"\\n\",\n       \"    this._init_header(this);\\n\",\n       \"    this._init_canvas(this);\\n\",\n       \"    this._init_toolbar(this);\\n\",\n       \"\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    this.waiting = false;\\n\",\n       \"\\n\",\n       \"    this.ws.onopen = function () {\\n\",\n       \"        fig.send_message('supports_binary', { value: fig.supports_binary });\\n\",\n       \"        fig.send_message('send_image_mode', {});\\n\",\n       \"        if (fig.ratio !== 1) {\\n\",\n       \"            fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\\n\",\n       \"        }\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onload = function () {\\n\",\n       \"        if (fig.image_mode === 'full') {\\n\",\n       \"            // Full images could contain transparency (where diff images\\n\",\n       \"            // almost always do), so we need to clear the canvas so that\\n\",\n       \"            // there is no ghosting.\\n\",\n       \"            fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\\n\",\n       \"        }\\n\",\n       \"        fig.context.drawImage(fig.imageObj, 0, 0);\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onunload = function () {\\n\",\n       \"        fig.ws.close();\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.ws.onmessage = this._make_on_message_function(this);\\n\",\n       \"\\n\",\n       \"    this.ondownload = ondownload;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_header = function () {\\n\",\n       \"    var titlebar = document.createElement('div');\\n\",\n       \"    titlebar.classList =\\n\",\n       \"        'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\\n\",\n       \"    var titletext = document.createElement('div');\\n\",\n       \"    titletext.classList = 'ui-dialog-title';\\n\",\n       \"    titletext.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'width: 100%; text-align: center; padding: 3px;'\\n\",\n       \"    );\\n\",\n       \"    titlebar.appendChild(titletext);\\n\",\n       \"    this.root.appendChild(titlebar);\\n\",\n       \"    this.header = titletext;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_canvas = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var canvas_div = (this.canvas_div = document.createElement('div'));\\n\",\n       \"    canvas_div.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'border: 1px solid #ddd;' +\\n\",\n       \"            'box-sizing: content-box;' +\\n\",\n       \"            'clear: both;' +\\n\",\n       \"            'min-height: 1px;' +\\n\",\n       \"            'min-width: 1px;' +\\n\",\n       \"            'outline: 0;' +\\n\",\n       \"            'overflow: hidden;' +\\n\",\n       \"            'position: relative;' +\\n\",\n       \"            'resize: both;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    function on_keyboard_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.key_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keydown',\\n\",\n       \"        on_keyboard_event_closure('key_press')\\n\",\n       \"    );\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keyup',\\n\",\n       \"        on_keyboard_event_closure('key_release')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    this._canvas_extra_style(canvas_div);\\n\",\n       \"    this.root.appendChild(canvas_div);\\n\",\n       \"\\n\",\n       \"    var canvas = (this.canvas = document.createElement('canvas'));\\n\",\n       \"    canvas.classList.add('mpl-canvas');\\n\",\n       \"    canvas.setAttribute('style', 'box-sizing: content-box;');\\n\",\n       \"\\n\",\n       \"    this.context = canvas.getContext('2d');\\n\",\n       \"\\n\",\n       \"    var backingStore =\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        this.context.webkitBackingStorePixelRatio ||\\n\",\n       \"        this.context.mozBackingStorePixelRatio ||\\n\",\n       \"        this.context.msBackingStorePixelRatio ||\\n\",\n       \"        this.context.oBackingStorePixelRatio ||\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        1;\\n\",\n       \"\\n\",\n       \"    this.ratio = (window.devicePixelRatio || 1) / backingStore;\\n\",\n       \"    if (this.ratio !== 1) {\\n\",\n       \"        fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var rubberband_canvas = (this.rubberband_canvas = document.createElement(\\n\",\n       \"        'canvas'\\n\",\n       \"    ));\\n\",\n       \"    rubberband_canvas.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    var resizeObserver = new ResizeObserver(function (entries) {\\n\",\n       \"        var nentries = entries.length;\\n\",\n       \"        for (var i = 0; i < nentries; i++) {\\n\",\n       \"            var entry = entries[i];\\n\",\n       \"            var width, height;\\n\",\n       \"            if (entry.contentBoxSize) {\\n\",\n       \"                if (entry.contentBoxSize instanceof Array) {\\n\",\n       \"                    // Chrome 84 implements new version of spec.\\n\",\n       \"                    width = entry.contentBoxSize[0].inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize[0].blockSize;\\n\",\n       \"                } else {\\n\",\n       \"                    // Firefox implements old version of spec.\\n\",\n       \"                    width = entry.contentBoxSize.inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize.blockSize;\\n\",\n       \"                }\\n\",\n       \"            } else {\\n\",\n       \"                // Chrome <84 implements even older version of spec.\\n\",\n       \"                width = entry.contentRect.width;\\n\",\n       \"                height = entry.contentRect.height;\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            // Keep the size of the canvas and rubber band canvas in sync with\\n\",\n       \"            // the canvas container.\\n\",\n       \"            if (entry.devicePixelContentBoxSize) {\\n\",\n       \"                // Chrome 84 implements new version of spec.\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'width',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].inlineSize\\n\",\n       \"                );\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'height',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].blockSize\\n\",\n       \"                );\\n\",\n       \"            } else {\\n\",\n       \"                canvas.setAttribute('width', width * fig.ratio);\\n\",\n       \"                canvas.setAttribute('height', height * fig.ratio);\\n\",\n       \"            }\\n\",\n       \"            canvas.setAttribute(\\n\",\n       \"                'style',\\n\",\n       \"                'width: ' + width + 'px; height: ' + height + 'px;'\\n\",\n       \"            );\\n\",\n       \"\\n\",\n       \"            rubberband_canvas.setAttribute('width', width);\\n\",\n       \"            rubberband_canvas.setAttribute('height', height);\\n\",\n       \"\\n\",\n       \"            // And update the size in Python. We ignore the initial 0/0 size\\n\",\n       \"            // that occurs as the element is placed into the DOM, which should\\n\",\n       \"            // otherwise not happen due to the minimum size styling.\\n\",\n       \"            if (width != 0 && height != 0) {\\n\",\n       \"                fig.request_resize(width, height);\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    });\\n\",\n       \"    resizeObserver.observe(canvas_div);\\n\",\n       \"\\n\",\n       \"    function on_mouse_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.mouse_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousedown',\\n\",\n       \"        on_mouse_event_closure('button_press')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseup',\\n\",\n       \"        on_mouse_event_closure('button_release')\\n\",\n       \"    );\\n\",\n       \"    // Throttle sequential mouse events to 1 every 20ms.\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousemove',\\n\",\n       \"        on_mouse_event_closure('motion_notify')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseenter',\\n\",\n       \"        on_mouse_event_closure('figure_enter')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseleave',\\n\",\n       \"        on_mouse_event_closure('figure_leave')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener('wheel', function (event) {\\n\",\n       \"        if (event.deltaY < 0) {\\n\",\n       \"            event.step = 1;\\n\",\n       \"        } else {\\n\",\n       \"            event.step = -1;\\n\",\n       \"        }\\n\",\n       \"        on_mouse_event_closure('scroll')(event);\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    canvas_div.appendChild(canvas);\\n\",\n       \"    canvas_div.appendChild(rubberband_canvas);\\n\",\n       \"\\n\",\n       \"    this.rubberband_context = rubberband_canvas.getContext('2d');\\n\",\n       \"    this.rubberband_context.strokeStyle = '#000000';\\n\",\n       \"\\n\",\n       \"    this._resize_canvas = function (width, height, forward) {\\n\",\n       \"        if (forward) {\\n\",\n       \"            canvas_div.style.width = width + 'px';\\n\",\n       \"            canvas_div.style.height = height + 'px';\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    // Disable right mouse context menu.\\n\",\n       \"    this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\\n\",\n       \"        event.preventDefault();\\n\",\n       \"        return false;\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    function set_focus() {\\n\",\n       \"        canvas.focus();\\n\",\n       \"        canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    window.setTimeout(set_focus, 100);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'mpl-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var button = (fig.buttons[name] = document.createElement('button'));\\n\",\n       \"        button.classList = 'mpl-widget';\\n\",\n       \"        button.setAttribute('role', 'button');\\n\",\n       \"        button.setAttribute('aria-disabled', 'false');\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"\\n\",\n       \"        var icon_img = document.createElement('img');\\n\",\n       \"        icon_img.src = '_images/' + image + '.png';\\n\",\n       \"        icon_img.srcset = '_images/' + image + '_large.png 2x';\\n\",\n       \"        icon_img.alt = tooltip;\\n\",\n       \"        button.appendChild(icon_img);\\n\",\n       \"\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fmt_picker = document.createElement('select');\\n\",\n       \"    fmt_picker.classList = 'mpl-widget';\\n\",\n       \"    toolbar.appendChild(fmt_picker);\\n\",\n       \"    this.format_dropdown = fmt_picker;\\n\",\n       \"\\n\",\n       \"    for (var ind in mpl.extensions) {\\n\",\n       \"        var fmt = mpl.extensions[ind];\\n\",\n       \"        var option = document.createElement('option');\\n\",\n       \"        option.selected = fmt === mpl.default_extension;\\n\",\n       \"        option.innerHTML = fmt;\\n\",\n       \"        fmt_picker.appendChild(option);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\\n\",\n       \"    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\\n\",\n       \"    // which will in turn request a refresh of the image.\\n\",\n       \"    this.send_message('resize', { width: x_pixels, height: y_pixels });\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_message = function (type, properties) {\\n\",\n       \"    properties['type'] = type;\\n\",\n       \"    properties['figure_id'] = this.id;\\n\",\n       \"    this.ws.send(JSON.stringify(properties));\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_draw_message = function () {\\n\",\n       \"    if (!this.waiting) {\\n\",\n       \"        this.waiting = true;\\n\",\n       \"        this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    var format_dropdown = fig.format_dropdown;\\n\",\n       \"    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\\n\",\n       \"    fig.ondownload(fig, format);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_resize = function (fig, msg) {\\n\",\n       \"    var size = msg['size'];\\n\",\n       \"    if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\\n\",\n       \"        fig._resize_canvas(size[0], size[1], msg['forward']);\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\\n\",\n       \"    var x0 = msg['x0'] / fig.ratio;\\n\",\n       \"    var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\\n\",\n       \"    var x1 = msg['x1'] / fig.ratio;\\n\",\n       \"    var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\\n\",\n       \"    x0 = Math.floor(x0) + 0.5;\\n\",\n       \"    y0 = Math.floor(y0) + 0.5;\\n\",\n       \"    x1 = Math.floor(x1) + 0.5;\\n\",\n       \"    y1 = Math.floor(y1) + 0.5;\\n\",\n       \"    var min_x = Math.min(x0, x1);\\n\",\n       \"    var min_y = Math.min(y0, y1);\\n\",\n       \"    var width = Math.abs(x1 - x0);\\n\",\n       \"    var height = Math.abs(y1 - y0);\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.clearRect(\\n\",\n       \"        0,\\n\",\n       \"        0,\\n\",\n       \"        fig.canvas.width / fig.ratio,\\n\",\n       \"        fig.canvas.height / fig.ratio\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\\n\",\n       \"    // Updates the figure title.\\n\",\n       \"    fig.header.textContent = msg['label'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_cursor = function (fig, msg) {\\n\",\n       \"    var cursor = msg['cursor'];\\n\",\n       \"    switch (cursor) {\\n\",\n       \"        case 0:\\n\",\n       \"            cursor = 'pointer';\\n\",\n       \"            break;\\n\",\n       \"        case 1:\\n\",\n       \"            cursor = 'default';\\n\",\n       \"            break;\\n\",\n       \"        case 2:\\n\",\n       \"            cursor = 'crosshair';\\n\",\n       \"            break;\\n\",\n       \"        case 3:\\n\",\n       \"            cursor = 'move';\\n\",\n       \"            break;\\n\",\n       \"    }\\n\",\n       \"    fig.rubberband_canvas.style.cursor = cursor;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_message = function (fig, msg) {\\n\",\n       \"    fig.message.textContent = msg['message'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_draw = function (fig, _msg) {\\n\",\n       \"    // Request the server to send over a new figure.\\n\",\n       \"    fig.send_draw_message();\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\\n\",\n       \"    fig.image_mode = msg['mode'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\\n\",\n       \"    for (var key in msg) {\\n\",\n       \"        if (!(key in fig.buttons)) {\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"        fig.buttons[key].disabled = !msg[key];\\n\",\n       \"        fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\\n\",\n       \"    if (msg['mode'] === 'PAN') {\\n\",\n       \"        fig.buttons['Pan'].classList.add('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    } else if (msg['mode'] === 'ZOOM') {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.add('active');\\n\",\n       \"    } else {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Called whenever the canvas gets updated.\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// A function to construct a web socket function for onmessage handling.\\n\",\n       \"// Called in the figure constructor.\\n\",\n       \"mpl.figure.prototype._make_on_message_function = function (fig) {\\n\",\n       \"    return function socket_on_message(evt) {\\n\",\n       \"        if (evt.data instanceof Blob) {\\n\",\n       \"            /* FIXME: We get \\\"Resource interpreted as Image but\\n\",\n       \"             * transferred with MIME type text/plain:\\\" errors on\\n\",\n       \"             * Chrome.  But how to set the MIME type?  It doesn't seem\\n\",\n       \"             * to be part of the websocket stream */\\n\",\n       \"            evt.data.type = 'image/png';\\n\",\n       \"\\n\",\n       \"            /* Free the memory for the previous frames */\\n\",\n       \"            if (fig.imageObj.src) {\\n\",\n       \"                (window.URL || window.webkitURL).revokeObjectURL(\\n\",\n       \"                    fig.imageObj.src\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\\n\",\n       \"                evt.data\\n\",\n       \"            );\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        } else if (\\n\",\n       \"            typeof evt.data === 'string' &&\\n\",\n       \"            evt.data.slice(0, 21) === 'data:image/png;base64'\\n\",\n       \"        ) {\\n\",\n       \"            fig.imageObj.src = evt.data;\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var msg = JSON.parse(evt.data);\\n\",\n       \"        var msg_type = msg['type'];\\n\",\n       \"\\n\",\n       \"        // Call the  \\\"handle_{type}\\\" callback, which takes\\n\",\n       \"        // the figure and JSON message as its only arguments.\\n\",\n       \"        try {\\n\",\n       \"            var callback = fig['handle_' + msg_type];\\n\",\n       \"        } catch (e) {\\n\",\n       \"            console.log(\\n\",\n       \"                \\\"No handler for the '\\\" + msg_type + \\\"' message type: \\\",\\n\",\n       \"                msg\\n\",\n       \"            );\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        if (callback) {\\n\",\n       \"            try {\\n\",\n       \"                // console.log(\\\"Handling '\\\" + msg_type + \\\"' message: \\\", msg);\\n\",\n       \"                callback(fig, msg);\\n\",\n       \"            } catch (e) {\\n\",\n       \"                console.log(\\n\",\n       \"                    \\\"Exception inside the 'handler_\\\" + msg_type + \\\"' callback:\\\",\\n\",\n       \"                    e,\\n\",\n       \"                    e.stack,\\n\",\n       \"                    msg\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\\n\",\n       \"mpl.findpos = function (e) {\\n\",\n       \"    //this section is from http://www.quirksmode.org/js/events_properties.html\\n\",\n       \"    var targ;\\n\",\n       \"    if (!e) {\\n\",\n       \"        e = window.event;\\n\",\n       \"    }\\n\",\n       \"    if (e.target) {\\n\",\n       \"        targ = e.target;\\n\",\n       \"    } else if (e.srcElement) {\\n\",\n       \"        targ = e.srcElement;\\n\",\n       \"    }\\n\",\n       \"    if (targ.nodeType === 3) {\\n\",\n       \"        // defeat Safari bug\\n\",\n       \"        targ = targ.parentNode;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // pageX,Y are the mouse positions relative to the document\\n\",\n       \"    var boundingRect = targ.getBoundingClientRect();\\n\",\n       \"    var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\\n\",\n       \"    var y = e.pageY - (boundingRect.top + document.body.scrollTop);\\n\",\n       \"\\n\",\n       \"    return { x: x, y: y };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"/*\\n\",\n       \" * return a copy of an object with only non-object keys\\n\",\n       \" * we need this to avoid circular references\\n\",\n       \" * http://stackoverflow.com/a/24161582/3208463\\n\",\n       \" */\\n\",\n       \"function simpleKeys(original) {\\n\",\n       \"    return Object.keys(original).reduce(function (obj, key) {\\n\",\n       \"        if (typeof original[key] !== 'object') {\\n\",\n       \"            obj[key] = original[key];\\n\",\n       \"        }\\n\",\n       \"        return obj;\\n\",\n       \"    }, {});\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.mouse_event = function (event, name) {\\n\",\n       \"    var canvas_pos = mpl.findpos(event);\\n\",\n       \"\\n\",\n       \"    if (name === 'button_press') {\\n\",\n       \"        this.canvas.focus();\\n\",\n       \"        this.canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var x = canvas_pos.x * this.ratio;\\n\",\n       \"    var y = canvas_pos.y * this.ratio;\\n\",\n       \"\\n\",\n       \"    this.send_message(name, {\\n\",\n       \"        x: x,\\n\",\n       \"        y: y,\\n\",\n       \"        button: event.button,\\n\",\n       \"        step: event.step,\\n\",\n       \"        guiEvent: simpleKeys(event),\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    /* This prevents the web browser from automatically changing to\\n\",\n       \"     * the text insertion cursor when the button is pressed.  We want\\n\",\n       \"     * to control all of the cursor setting manually through the\\n\",\n       \"     * 'cursor' event from matplotlib */\\n\",\n       \"    event.preventDefault();\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (_event, _name) {\\n\",\n       \"    // Handle any extra behaviour associated with a key event\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.key_event = function (event, name) {\\n\",\n       \"    // Prevent repeat events\\n\",\n       \"    if (name === 'key_press') {\\n\",\n       \"        if (event.which === this._key) {\\n\",\n       \"            return;\\n\",\n       \"        } else {\\n\",\n       \"            this._key = event.which;\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"    if (name === 'key_release') {\\n\",\n       \"        this._key = null;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var value = '';\\n\",\n       \"    if (event.ctrlKey && event.which !== 17) {\\n\",\n       \"        value += 'ctrl+';\\n\",\n       \"    }\\n\",\n       \"    if (event.altKey && event.which !== 18) {\\n\",\n       \"        value += 'alt+';\\n\",\n       \"    }\\n\",\n       \"    if (event.shiftKey && event.which !== 16) {\\n\",\n       \"        value += 'shift+';\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    value += 'k';\\n\",\n       \"    value += event.which.toString();\\n\",\n       \"\\n\",\n       \"    this._key_event_extra(event, name);\\n\",\n       \"\\n\",\n       \"    this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onclick = function (name) {\\n\",\n       \"    if (name === 'download') {\\n\",\n       \"        this.handle_save(this, null);\\n\",\n       \"    } else {\\n\",\n       \"        this.send_message('toolbar_button', { name: name });\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\\n\",\n       \"    this.message.textContent = tooltip;\\n\",\n       \"};\\n\",\n       \"mpl.toolbar_items = [[\\\"Home\\\", \\\"Reset original view\\\", \\\"fa fa-home icon-home\\\", \\\"home\\\"], [\\\"Back\\\", \\\"Back to previous view\\\", \\\"fa fa-arrow-left icon-arrow-left\\\", \\\"back\\\"], [\\\"Forward\\\", \\\"Forward to next view\\\", \\\"fa fa-arrow-right icon-arrow-right\\\", \\\"forward\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Pan\\\", \\\"Left button pans, Right button zooms\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-arrows icon-move\\\", \\\"pan\\\"], [\\\"Zoom\\\", \\\"Zoom to rectangle\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-square-o icon-check-empty\\\", \\\"zoom\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Download\\\", \\\"Download plot\\\", \\\"fa fa-floppy-o icon-save\\\", \\\"download\\\"]];\\n\",\n       \"\\n\",\n       \"mpl.extensions = [\\\"eps\\\", \\\"jpeg\\\", \\\"pdf\\\", \\\"png\\\", \\\"ps\\\", \\\"raw\\\", \\\"svg\\\", \\\"tif\\\"];\\n\",\n       \"\\n\",\n       \"mpl.default_extension = \\\"png\\\";/* global mpl */\\n\",\n       \"\\n\",\n       \"var comm_websocket_adapter = function (comm) {\\n\",\n       \"    // Create a \\\"websocket\\\"-like object which calls the given IPython comm\\n\",\n       \"    // object with the appropriate methods. Currently this is a non binary\\n\",\n       \"    // socket, so there is still some room for performance tuning.\\n\",\n       \"    var ws = {};\\n\",\n       \"\\n\",\n       \"    ws.close = function () {\\n\",\n       \"        comm.close();\\n\",\n       \"    };\\n\",\n       \"    ws.send = function (m) {\\n\",\n       \"        //console.log('sending', m);\\n\",\n       \"        comm.send(m);\\n\",\n       \"    };\\n\",\n       \"    // Register the callback with on_msg.\\n\",\n       \"    comm.on_msg(function (msg) {\\n\",\n       \"        //console.log('receiving', msg['content']['data'], msg);\\n\",\n       \"        // Pass the mpl event to the overridden (by mpl) onmessage function.\\n\",\n       \"        ws.onmessage(msg['content']['data']);\\n\",\n       \"    });\\n\",\n       \"    return ws;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.mpl_figure_comm = function (comm, msg) {\\n\",\n       \"    // This is the function which gets called when the mpl process\\n\",\n       \"    // starts-up an IPython Comm through the \\\"matplotlib\\\" channel.\\n\",\n       \"\\n\",\n       \"    var id = msg.content.data.id;\\n\",\n       \"    // Get hold of the div created by the display call when the Comm\\n\",\n       \"    // socket was opened in Python.\\n\",\n       \"    var element = document.getElementById(id);\\n\",\n       \"    var ws_proxy = comm_websocket_adapter(comm);\\n\",\n       \"\\n\",\n       \"    function ondownload(figure, _format) {\\n\",\n       \"        window.open(figure.canvas.toDataURL());\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fig = new mpl.figure(id, ws_proxy, ondownload, element);\\n\",\n       \"\\n\",\n       \"    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\\n\",\n       \"    // web socket which is closed, not our websocket->open comm proxy.\\n\",\n       \"    ws_proxy.onopen();\\n\",\n       \"\\n\",\n       \"    fig.parent_element = element;\\n\",\n       \"    fig.cell_info = mpl.find_output_cell(\\\"<div id='\\\" + id + \\\"'></div>\\\");\\n\",\n       \"    if (!fig.cell_info) {\\n\",\n       \"        console.error('Failed to find cell for figure', id, fig);\\n\",\n       \"        return;\\n\",\n       \"    }\\n\",\n       \"    fig.cell_info[0].output_area.element.one(\\n\",\n       \"        'cleared',\\n\",\n       \"        { fig: fig },\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_close = function (fig, msg) {\\n\",\n       \"    var width = fig.canvas.width / fig.ratio;\\n\",\n       \"    fig.cell_info[0].output_area.element.off(\\n\",\n       \"        'cleared',\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    // Update the output cell to use the data from the current canvas.\\n\",\n       \"    fig.push_to_output();\\n\",\n       \"    var dataURL = fig.canvas.toDataURL();\\n\",\n       \"    // Re-enable the keyboard manager in IPython - without this line, in FF,\\n\",\n       \"    // the notebook keyboard shortcuts fail.\\n\",\n       \"    IPython.keyboard_manager.enable();\\n\",\n       \"    fig.parent_element.innerHTML =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"    fig.close_ws(fig, msg);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.close_ws = function (fig, msg) {\\n\",\n       \"    fig.send_message('closing', msg);\\n\",\n       \"    // fig.ws.close()\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\\n\",\n       \"    // Turn the data on the canvas into data in the output cell.\\n\",\n       \"    var width = this.canvas.width / this.ratio;\\n\",\n       \"    var dataURL = this.canvas.toDataURL();\\n\",\n       \"    this.cell_info[1]['text/html'] =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Tell IPython that the notebook contents must change.\\n\",\n       \"    IPython.notebook.set_dirty(true);\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"    var fig = this;\\n\",\n       \"    // Wait a second, then push the new image to the DOM so\\n\",\n       \"    // that it is saved nicely (might be nice to debounce this).\\n\",\n       \"    setTimeout(function () {\\n\",\n       \"        fig.push_to_output();\\n\",\n       \"    }, 1000);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'btn-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'btn-group';\\n\",\n       \"    var button;\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'btn-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        button = fig.buttons[name] = document.createElement('button');\\n\",\n       \"        button.classList = 'btn btn-default';\\n\",\n       \"        button.href = '#';\\n\",\n       \"        button.title = name;\\n\",\n       \"        button.innerHTML = '<i class=\\\"fa ' + image + ' fa-lg\\\"></i>';\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Add the status bar.\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message pull-right';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"\\n\",\n       \"    // Add the close button to the window.\\n\",\n       \"    var buttongrp = document.createElement('div');\\n\",\n       \"    buttongrp.classList = 'btn-group inline pull-right';\\n\",\n       \"    button = document.createElement('button');\\n\",\n       \"    button.classList = 'btn btn-mini btn-primary';\\n\",\n       \"    button.href = '#';\\n\",\n       \"    button.title = 'Stop Interaction';\\n\",\n       \"    button.innerHTML = '<i class=\\\"fa fa-power-off icon-remove icon-large\\\"></i>';\\n\",\n       \"    button.addEventListener('click', function (_evt) {\\n\",\n       \"        fig.handle_close(fig, {});\\n\",\n       \"    });\\n\",\n       \"    button.addEventListener(\\n\",\n       \"        'mouseover',\\n\",\n       \"        on_mouseover_closure('Stop Interaction')\\n\",\n       \"    );\\n\",\n       \"    buttongrp.appendChild(button);\\n\",\n       \"    var titlebar = this.root.querySelector('.ui-dialog-titlebar');\\n\",\n       \"    titlebar.insertBefore(buttongrp, titlebar.firstChild);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._remove_fig_handler = function (event) {\\n\",\n       \"    var fig = event.data.fig;\\n\",\n       \"    fig.close_ws(fig, {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (el) {\\n\",\n       \"    el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (el) {\\n\",\n       \"    // this is important to make the div 'focusable\\n\",\n       \"    el.setAttribute('tabindex', 0);\\n\",\n       \"    // reach out to IPython and tell the keyboard manager to turn it's self\\n\",\n       \"    // off when our div gets focus\\n\",\n       \"\\n\",\n       \"    // location in version 3\\n\",\n       \"    if (IPython.notebook.keyboard_manager) {\\n\",\n       \"        IPython.notebook.keyboard_manager.register_events(el);\\n\",\n       \"    } else {\\n\",\n       \"        // location in version 2\\n\",\n       \"        IPython.keyboard_manager.register_events(el);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (event, _name) {\\n\",\n       \"    var manager = IPython.notebook.keyboard_manager;\\n\",\n       \"    if (!manager) {\\n\",\n       \"        manager = IPython.keyboard_manager;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Check for shift+enter\\n\",\n       \"    if (event.shiftKey && event.which === 13) {\\n\",\n       \"        this.canvas_div.blur();\\n\",\n       \"        // select the cell after this one\\n\",\n       \"        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\\n\",\n       \"        IPython.notebook.select(index + 1);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    fig.ondownload(fig, null);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.find_output_cell = function (html_output) {\\n\",\n       \"    // Return the cell and output element which can be found *uniquely* in the notebook.\\n\",\n       \"    // Note - this is a bit hacky, but it is done because the \\\"notebook_saving.Notebook\\\"\\n\",\n       \"    // IPython event is triggered only after the cells have been serialised, which for\\n\",\n       \"    // our purposes (turning an active figure into a static one), is too late.\\n\",\n       \"    var cells = IPython.notebook.get_cells();\\n\",\n       \"    var ncells = cells.length;\\n\",\n       \"    for (var i = 0; i < ncells; i++) {\\n\",\n       \"        var cell = cells[i];\\n\",\n       \"        if (cell.cell_type === 'code') {\\n\",\n       \"            for (var j = 0; j < cell.output_area.outputs.length; j++) {\\n\",\n       \"                var data = cell.output_area.outputs[j];\\n\",\n       \"                if (data.data) {\\n\",\n       \"                    // IPython >= 3 moved mimebundle to data attribute of output\\n\",\n       \"                    data = data.data;\\n\",\n       \"                }\\n\",\n       \"                if (data['text/html'] === html_output) {\\n\",\n       \"                    return [cell, data, j];\\n\",\n       \"                }\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// Register the function which deals with the matplotlib target/channel.\\n\",\n       \"// The kernel may be null if the page has been refreshed.\\n\",\n       \"if (IPython.notebook.kernel !== null) {\\n\",\n       \"    IPython.notebook.kernel.comm_manager.register_target(\\n\",\n       \"        'matplotlib',\\n\",\n       \"        mpl.mpl_figure_comm\\n\",\n       \"    );\\n\",\n       \"}\\n\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.Javascript object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<img src=\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAHgCAYAAAB91L6VAAAgAElEQVR4Xu3de7Cl873n8V9f0hrHJkR3tG6qxzWhxDUGOS7nnIipUSmSYoSZNKmTzBCXyI3uuHSfIk2cQiRxjRJVKUWigipV6iSqDhKUkCE4xi0yaM2QOWxt6E1376lndfZee9lrrd/32XutXpf9WlX9h/J7bp/n+/299+fze561pg0PDw8nHwpQgAIUoAAFNqgC0wB4g+rtYBSgAAUoQIGKAgCsEChAAQpQgAIdUACAOyC6Q1KAAhSgAAUAWA1QgAIUoAAFOqAAAHdAdIekAAUoQAEKALAaoAAFKEABCnRAAQDugOgOSQEKUIACFABgNUABClCAAhTogAIA3AHRHZICFKAABSgAwGqAAhSgAAUo0AEFALgDojskBShAAQpQAIDVAAUoQAEKUKADCgBwB0R3SApQgAIUoAAAqwEKUIACFKBABxQA4A6I7pAUoAAFKEABAFYDFKAABShAgQ4oAMAdEN0hKUABClCAAgCsBihAAQpQgAIdUACAOyC6Q1KAAhSgAAUAWA1QgAIUoAAFOqAAAHdAdIekAAUoQAEKALAaoAAFKEABCnRAAQDugOgOSQEKUIACFABgNUABClCAAhTogAIA3AHRHZICFKAABSgAwGqAAhSgAAUo0AEFALgDojskBShAAQpQAIDVAAUoQAEKUKADCgBwB0R3SApQgAIUoAAAqwEKUIACFKBABxQA4A6I7pAUoAAFKEABAFYDFKAABShAgQ4oAMAdEN0hKUABClCAAgCsBihAAQpQgAIdUACAOyC6Q1KAAhSgAAUAWA1QgAIUoAAFOqAAAHdAdIekAAUoQAEKALAaoAAFKEABCnRAAQDugOgOSQEKUIACFABgNUABClCAAhTogAIA3AHRHZICFKAABSgAwG2sgZ/85CfpkksuSa+99lr61Kc+lX70ox+lT3/60208Ynfuevny5elXv/pVevrpp9PGG2+cDjzwwHTxxRenXXbZpTtPeAOe1UUXXZQWL16czjjjjHT55ZdvwCN3z6FeeeWVdNZZZ6W77rorvfvuu2nHHXdMN9xwQ9p333275yQ30JmsXbs2LV26NP385z+vzBvz5s1LJ554YjrnnHPStGnTNtBZdO4w9913X2XO/MMf/pBeffXVdNttt6Wjjjpq9ISGh4fT+eefn6677rr01ltvpYMOOihdddVVaaeddurcSU/iyAA8CfGabXrLLbekL3/5y+nqq69O+++/f2Vy/eUvf5meeeaZNGfOnDYdtTt3e8QRR6Tjjjsu7bfffmnNmjVpyZIl6cknn0xPPfVU2nTTTbvzpDfAWT388MPp2GOPTQMDA+mwww6bkgB+880301577VW5/pNPPjltvfXW6bnnnks77LBD5d9U+3z/+99Pl156abrxxhvTbrvtlh555JF00kknpQsvvDCdfvrpfS9H8UfY/fffn/bZZ5/0hS98YRyAiz/ciz/oC30WLlyYzj333PTEE09U5pLZs2f3nD4A3KZbVkC3AM6Pf/zjyhHWrVuXFixYkE477bR09tlnt+movbHbN954o/JHyL333psOPvjg3jjpFp/lO++8k/bee+905ZVXpgsuuCDtueeeUxLARS8UE+5vf/vbFivcm7s78sgj09y5c9P1118/egFf/OIXK8lR4Yqn0qdw/GMdcOF+i0TgW9/6Vvr2t79dkWJwcLCi189+9rPKH/m99gHgNtyx999/P22yySbp1ltvrYlPFi1aVIlN7rjjjjYctXd2+fzzz1cio+Iv19133713TryFZ1rUwpZbbpkuu+yydOihh05ZAH/yk59Mn/vc59KKFSsqf5Btu+226ZRTTklf/epXW6h27+yqcMDXXntt+vWvf5123nnn9Mc//jEdfvjhFVd8wgkn9M6FtOBMPwzgF154oZKKPProo5V+Gfkccsghlf/+4Q9/2IKjbthdAHAb9F65cmVlInnggQfSAQccMHqE7373u5VJ5qGHHmrDUXtjl0US8PnPf77yh8jvfve73jjpFp/lzTffXIkUiwi6iM2mMoBHYsNvfvOb6ZhjjqloUqyHF0s3xR8pU+1T9EexRPODH/wgzZgxIxVrwkWtFM8JTLXPhwFczKfFmm8xv26zzTajchTLOMXYYtmv1z4A3IY7BsCNRS3W+Yp1ngK+8+fPb4P63b3Ll19+ufJw0W9+85u0xx57VE52KgN41qxZFT2KyXXkU6x1FiB+8MEHu/tmtuHsij/OvvOd71QeRCrWgB977LH0jW98o+KAp9ofJADchgKbCrsUQde/y6eeemolfi+edCweoJiKn9tvvz0dffTRFXcz8ilcTjHZTJ8+PQ0NDdX8v37XaPvtt0+f/exn009/+tPR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\\\" width=\\\"480\\\">\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.HTML object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<matplotlib.image.AxesImage at 0x7f62fe4bfa60>\"\n      ]\n     },\n     \"execution_count\": 61,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# normalize colors\\n\",\n    \"conf_mx_norm = conf_mx / conf_mx.sum(axis=1, keepdims=True)\\n\",\n    \"plt.matshow(conf_mx_norm)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Multinomial Logistic\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 64,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(0.09765625, 0.01390244564066577)\"\n      ]\n     },\n     \"execution_count\": 64,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"\\n\",\n    \"from sklearn.linear_model import LogisticRegression\\n\",\n    \"logistic = LogisticRegression(C=1, # default L2 penalty # .01, .1, 1, 2, 10\\n\",\n    \"                              class_weight='balanced')\\n\",\n    \"\\n\",\n    \"scores = cross_val_score(logistic,\\n\",\n    \"                         Xscale[:1000],\\n\",\n    \"                         author[:1000],\\n\",\n    \"                         cv=3,\\n\",\n    \"                         n_jobs=3)\\n\",\n    \"\\n\",\n    \"scores.mean(), scores.std()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Ensemble Learning\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 65,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.795586113233172\"\n      ]\n     },\n     \"execution_count\": 65,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"Y = df1['x_republican'] > 0\\n\",\n    \"\\n\",\n    \"# Bagging classifier\\n\",\n    \"\\n\",\n    \"from sklearn.ensemble import BaggingClassifier\\n\",\n    \"from sklearn.tree import DecisionTreeClassifier\\n\",\n    \"\\n\",\n    \"bag_clf = BaggingClassifier(\\n\",\n    \"        DecisionTreeClassifier(), n_estimators=50,\\n\",\n    \"        max_samples=100, bootstrap=True, n_jobs=-1\\n\",\n    \"    )\\n\",\n    \"\\n\",\n    \"cross_val_score(bag_clf, X500, Y).mean()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 66,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"array([[  2, 172],\\n\",\n       \"       [  0, 594]])\"\n      ]\n     },\n     \"execution_count\": 66,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# random forest\\n\",\n    \"from sklearn.ensemble import RandomForestClassifier\\n\",\n    \"rnd_clf = RandomForestClassifier(n_estimators=500, \\n\",\n    \"                                 max_leaf_nodes=16, \\n\",\n    \"                                 n_jobs=-1)\\n\",\n    \"y_pred_rf = cross_val_predict(rnd_clf, X500, Y)                              \\n\",\n    \"confusion_matrix(Y,y_pred_rf)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 67,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[(0.0009572418864364776, 'k'),\\n\",\n       \" (0.0010358544276956854, 'o'),\\n\",\n       \" (0.0011153699385341863, 'y'),\\n\",\n       \" (0.004262871674066923, 'r')]\"\n      ]\n     },\n     \"execution_count\": 67,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"rnd_clf.fit(X500,Y)\\n\",\n    \"feature_importances = rnd_clf.feature_importances_\\n\",\n    \"sorted(zip(feature_importances, word), reverse=False)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 68,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[18:15:13] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost_1607604574104/work/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'binary:logistic' was changed from 'error' to 'logloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\\n\",\n      \"[18:15:14] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost_1607604574104/work/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'binary:logistic' was changed from 'error' to 'logloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\\n\",\n      \"[18:15:14] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost_1607604574104/work/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'binary:logistic' was changed from 'error' to 'logloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\\n\",\n      \"[18:15:15] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost_1607604574104/work/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'binary:logistic' was changed from 'error' to 'logloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\\n\",\n      \"[18:15:15] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost_1607604574104/work/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'binary:logistic' was changed from 'error' to 'logloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.8749681690858161\"\n      ]\n     },\n     \"execution_count\": 68,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# XGBoost\\n\",\n    \"from xgboost import XGBClassifier, XGBRegressor\\n\",\n    \"dfX = pd.DataFrame(X500,columns=vocab)\\n\",\n    \"xgb_clf = XGBClassifier()\\n\",\n    \"cross_val_score(xgb_clf, dfX, Y).mean()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 69,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[18:15:18] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost_1607604574104/work/src/learner.cc:541: \\n\",\n      \"Parameters: { feature_names } might not be used.\\n\",\n      \"\\n\",\n      \"  This may not be accurate due to some parameters are only used in language bindings but\\n\",\n      \"  passed down to XGBoost core.  Or some parameters are not used but slip through this\\n\",\n      \"  verification. Please open an issue if you find above cases.\\n\",\n      \"\\n\",\n      \"\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[(0.033571467, 'analysis'),\\n\",\n       \" (0.031830117, 'new york'),\\n\",\n       \" (0.029660394, 'granted certiorari'),\\n\",\n       \" (0.026276005, 'sought'),\\n\",\n       \" (0.025258552, 'related'),\\n\",\n       \" (0.02393513, 'stated'),\\n\",\n       \" (0.023086436, 'internal quotation'),\\n\",\n       \" (0.021765428, 'require'),\\n\",\n       \" (0.021112507, 'light'),\\n\",\n       \" (0.021009024, 'added')]\"\n      ]\n     },\n     \"execution_count\": 69,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"xgb_reg = XGBRegressor(feature_names=vocab)\\n\",\n    \"xgb_reg.fit(dfX,Y)\\n\",\n    \"sorted(zip(xgb_reg.feature_importances_, vocab),reverse=True)[:10]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 70,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/javascript\": [\n       \"/* Put everything inside the global mpl namespace */\\n\",\n       \"/* global mpl */\\n\",\n       \"window.mpl = {};\\n\",\n       \"\\n\",\n       \"mpl.get_websocket_type = function () {\\n\",\n       \"    if (typeof WebSocket !== 'undefined') {\\n\",\n       \"        return WebSocket;\\n\",\n       \"    } else if (typeof MozWebSocket !== 'undefined') {\\n\",\n       \"        return MozWebSocket;\\n\",\n       \"    } else {\\n\",\n       \"        alert(\\n\",\n       \"            'Your browser does not have WebSocket support. ' +\\n\",\n       \"                'Please try Chrome, Safari or Firefox ≥ 6. ' +\\n\",\n       \"                'Firefox 4 and 5 are also supported but you ' +\\n\",\n       \"                'have to enable WebSockets in about:config.'\\n\",\n       \"        );\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\\n\",\n       \"    this.id = figure_id;\\n\",\n       \"\\n\",\n       \"    this.ws = websocket;\\n\",\n       \"\\n\",\n       \"    this.supports_binary = this.ws.binaryType !== undefined;\\n\",\n       \"\\n\",\n       \"    if (!this.supports_binary) {\\n\",\n       \"        var warnings = document.getElementById('mpl-warnings');\\n\",\n       \"        if (warnings) {\\n\",\n       \"            warnings.style.display = 'block';\\n\",\n       \"            warnings.textContent =\\n\",\n       \"                'This browser does not support binary websocket messages. ' +\\n\",\n       \"                'Performance may be slow.';\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    this.imageObj = new Image();\\n\",\n       \"\\n\",\n       \"    this.context = undefined;\\n\",\n       \"    this.message = undefined;\\n\",\n       \"    this.canvas = undefined;\\n\",\n       \"    this.rubberband_canvas = undefined;\\n\",\n       \"    this.rubberband_context = undefined;\\n\",\n       \"    this.format_dropdown = undefined;\\n\",\n       \"\\n\",\n       \"    this.image_mode = 'full';\\n\",\n       \"\\n\",\n       \"    this.root = document.createElement('div');\\n\",\n       \"    this.root.setAttribute('style', 'display: inline-block');\\n\",\n       \"    this._root_extra_style(this.root);\\n\",\n       \"\\n\",\n       \"    parent_element.appendChild(this.root);\\n\",\n       \"\\n\",\n       \"    this._init_header(this);\\n\",\n       \"    this._init_canvas(this);\\n\",\n       \"    this._init_toolbar(this);\\n\",\n       \"\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    this.waiting = false;\\n\",\n       \"\\n\",\n       \"    this.ws.onopen = function () {\\n\",\n       \"        fig.send_message('supports_binary', { value: fig.supports_binary });\\n\",\n       \"        fig.send_message('send_image_mode', {});\\n\",\n       \"        if (fig.ratio !== 1) {\\n\",\n       \"            fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\\n\",\n       \"        }\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onload = function () {\\n\",\n       \"        if (fig.image_mode === 'full') {\\n\",\n       \"            // Full images could contain transparency (where diff images\\n\",\n       \"            // almost always do), so we need to clear the canvas so that\\n\",\n       \"            // there is no ghosting.\\n\",\n       \"            fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\\n\",\n       \"        }\\n\",\n       \"        fig.context.drawImage(fig.imageObj, 0, 0);\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.imageObj.onunload = function () {\\n\",\n       \"        fig.ws.close();\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    this.ws.onmessage = this._make_on_message_function(this);\\n\",\n       \"\\n\",\n       \"    this.ondownload = ondownload;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_header = function () {\\n\",\n       \"    var titlebar = document.createElement('div');\\n\",\n       \"    titlebar.classList =\\n\",\n       \"        'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\\n\",\n       \"    var titletext = document.createElement('div');\\n\",\n       \"    titletext.classList = 'ui-dialog-title';\\n\",\n       \"    titletext.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'width: 100%; text-align: center; padding: 3px;'\\n\",\n       \"    );\\n\",\n       \"    titlebar.appendChild(titletext);\\n\",\n       \"    this.root.appendChild(titlebar);\\n\",\n       \"    this.header = titletext;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_canvas = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var canvas_div = (this.canvas_div = document.createElement('div'));\\n\",\n       \"    canvas_div.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'border: 1px solid #ddd;' +\\n\",\n       \"            'box-sizing: content-box;' +\\n\",\n       \"            'clear: both;' +\\n\",\n       \"            'min-height: 1px;' +\\n\",\n       \"            'min-width: 1px;' +\\n\",\n       \"            'outline: 0;' +\\n\",\n       \"            'overflow: hidden;' +\\n\",\n       \"            'position: relative;' +\\n\",\n       \"            'resize: both;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    function on_keyboard_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.key_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keydown',\\n\",\n       \"        on_keyboard_event_closure('key_press')\\n\",\n       \"    );\\n\",\n       \"    canvas_div.addEventListener(\\n\",\n       \"        'keyup',\\n\",\n       \"        on_keyboard_event_closure('key_release')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    this._canvas_extra_style(canvas_div);\\n\",\n       \"    this.root.appendChild(canvas_div);\\n\",\n       \"\\n\",\n       \"    var canvas = (this.canvas = document.createElement('canvas'));\\n\",\n       \"    canvas.classList.add('mpl-canvas');\\n\",\n       \"    canvas.setAttribute('style', 'box-sizing: content-box;');\\n\",\n       \"\\n\",\n       \"    this.context = canvas.getContext('2d');\\n\",\n       \"\\n\",\n       \"    var backingStore =\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        this.context.webkitBackingStorePixelRatio ||\\n\",\n       \"        this.context.mozBackingStorePixelRatio ||\\n\",\n       \"        this.context.msBackingStorePixelRatio ||\\n\",\n       \"        this.context.oBackingStorePixelRatio ||\\n\",\n       \"        this.context.backingStorePixelRatio ||\\n\",\n       \"        1;\\n\",\n       \"\\n\",\n       \"    this.ratio = (window.devicePixelRatio || 1) / backingStore;\\n\",\n       \"    if (this.ratio !== 1) {\\n\",\n       \"        fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var rubberband_canvas = (this.rubberband_canvas = document.createElement(\\n\",\n       \"        'canvas'\\n\",\n       \"    ));\\n\",\n       \"    rubberband_canvas.setAttribute(\\n\",\n       \"        'style',\\n\",\n       \"        'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    var resizeObserver = new ResizeObserver(function (entries) {\\n\",\n       \"        var nentries = entries.length;\\n\",\n       \"        for (var i = 0; i < nentries; i++) {\\n\",\n       \"            var entry = entries[i];\\n\",\n       \"            var width, height;\\n\",\n       \"            if (entry.contentBoxSize) {\\n\",\n       \"                if (entry.contentBoxSize instanceof Array) {\\n\",\n       \"                    // Chrome 84 implements new version of spec.\\n\",\n       \"                    width = entry.contentBoxSize[0].inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize[0].blockSize;\\n\",\n       \"                } else {\\n\",\n       \"                    // Firefox implements old version of spec.\\n\",\n       \"                    width = entry.contentBoxSize.inlineSize;\\n\",\n       \"                    height = entry.contentBoxSize.blockSize;\\n\",\n       \"                }\\n\",\n       \"            } else {\\n\",\n       \"                // Chrome <84 implements even older version of spec.\\n\",\n       \"                width = entry.contentRect.width;\\n\",\n       \"                height = entry.contentRect.height;\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            // Keep the size of the canvas and rubber band canvas in sync with\\n\",\n       \"            // the canvas container.\\n\",\n       \"            if (entry.devicePixelContentBoxSize) {\\n\",\n       \"                // Chrome 84 implements new version of spec.\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'width',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].inlineSize\\n\",\n       \"                );\\n\",\n       \"                canvas.setAttribute(\\n\",\n       \"                    'height',\\n\",\n       \"                    entry.devicePixelContentBoxSize[0].blockSize\\n\",\n       \"                );\\n\",\n       \"            } else {\\n\",\n       \"                canvas.setAttribute('width', width * fig.ratio);\\n\",\n       \"                canvas.setAttribute('height', height * fig.ratio);\\n\",\n       \"            }\\n\",\n       \"            canvas.setAttribute(\\n\",\n       \"                'style',\\n\",\n       \"                'width: ' + width + 'px; height: ' + height + 'px;'\\n\",\n       \"            );\\n\",\n       \"\\n\",\n       \"            rubberband_canvas.setAttribute('width', width);\\n\",\n       \"            rubberband_canvas.setAttribute('height', height);\\n\",\n       \"\\n\",\n       \"            // And update the size in Python. We ignore the initial 0/0 size\\n\",\n       \"            // that occurs as the element is placed into the DOM, which should\\n\",\n       \"            // otherwise not happen due to the minimum size styling.\\n\",\n       \"            if (width != 0 && height != 0) {\\n\",\n       \"                fig.request_resize(width, height);\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    });\\n\",\n       \"    resizeObserver.observe(canvas_div);\\n\",\n       \"\\n\",\n       \"    function on_mouse_event_closure(name) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            return fig.mouse_event(event, name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousedown',\\n\",\n       \"        on_mouse_event_closure('button_press')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseup',\\n\",\n       \"        on_mouse_event_closure('button_release')\\n\",\n       \"    );\\n\",\n       \"    // Throttle sequential mouse events to 1 every 20ms.\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mousemove',\\n\",\n       \"        on_mouse_event_closure('motion_notify')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseenter',\\n\",\n       \"        on_mouse_event_closure('figure_enter')\\n\",\n       \"    );\\n\",\n       \"    rubberband_canvas.addEventListener(\\n\",\n       \"        'mouseleave',\\n\",\n       \"        on_mouse_event_closure('figure_leave')\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    canvas_div.addEventListener('wheel', function (event) {\\n\",\n       \"        if (event.deltaY < 0) {\\n\",\n       \"            event.step = 1;\\n\",\n       \"        } else {\\n\",\n       \"            event.step = -1;\\n\",\n       \"        }\\n\",\n       \"        on_mouse_event_closure('scroll')(event);\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    canvas_div.appendChild(canvas);\\n\",\n       \"    canvas_div.appendChild(rubberband_canvas);\\n\",\n       \"\\n\",\n       \"    this.rubberband_context = rubberband_canvas.getContext('2d');\\n\",\n       \"    this.rubberband_context.strokeStyle = '#000000';\\n\",\n       \"\\n\",\n       \"    this._resize_canvas = function (width, height, forward) {\\n\",\n       \"        if (forward) {\\n\",\n       \"            canvas_div.style.width = width + 'px';\\n\",\n       \"            canvas_div.style.height = height + 'px';\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"\\n\",\n       \"    // Disable right mouse context menu.\\n\",\n       \"    this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\\n\",\n       \"        event.preventDefault();\\n\",\n       \"        return false;\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    function set_focus() {\\n\",\n       \"        canvas.focus();\\n\",\n       \"        canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    window.setTimeout(set_focus, 100);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'mpl-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'mpl-button-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var button = (fig.buttons[name] = document.createElement('button'));\\n\",\n       \"        button.classList = 'mpl-widget';\\n\",\n       \"        button.setAttribute('role', 'button');\\n\",\n       \"        button.setAttribute('aria-disabled', 'false');\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"\\n\",\n       \"        var icon_img = document.createElement('img');\\n\",\n       \"        icon_img.src = '_images/' + image + '.png';\\n\",\n       \"        icon_img.srcset = '_images/' + image + '_large.png 2x';\\n\",\n       \"        icon_img.alt = tooltip;\\n\",\n       \"        button.appendChild(icon_img);\\n\",\n       \"\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fmt_picker = document.createElement('select');\\n\",\n       \"    fmt_picker.classList = 'mpl-widget';\\n\",\n       \"    toolbar.appendChild(fmt_picker);\\n\",\n       \"    this.format_dropdown = fmt_picker;\\n\",\n       \"\\n\",\n       \"    for (var ind in mpl.extensions) {\\n\",\n       \"        var fmt = mpl.extensions[ind];\\n\",\n       \"        var option = document.createElement('option');\\n\",\n       \"        option.selected = fmt === mpl.default_extension;\\n\",\n       \"        option.innerHTML = fmt;\\n\",\n       \"        fmt_picker.appendChild(option);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\\n\",\n       \"    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\\n\",\n       \"    // which will in turn request a refresh of the image.\\n\",\n       \"    this.send_message('resize', { width: x_pixels, height: y_pixels });\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_message = function (type, properties) {\\n\",\n       \"    properties['type'] = type;\\n\",\n       \"    properties['figure_id'] = this.id;\\n\",\n       \"    this.ws.send(JSON.stringify(properties));\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.send_draw_message = function () {\\n\",\n       \"    if (!this.waiting) {\\n\",\n       \"        this.waiting = true;\\n\",\n       \"        this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    var format_dropdown = fig.format_dropdown;\\n\",\n       \"    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\\n\",\n       \"    fig.ondownload(fig, format);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_resize = function (fig, msg) {\\n\",\n       \"    var size = msg['size'];\\n\",\n       \"    if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\\n\",\n       \"        fig._resize_canvas(size[0], size[1], msg['forward']);\\n\",\n       \"        fig.send_message('refresh', {});\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\\n\",\n       \"    var x0 = msg['x0'] / fig.ratio;\\n\",\n       \"    var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\\n\",\n       \"    var x1 = msg['x1'] / fig.ratio;\\n\",\n       \"    var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\\n\",\n       \"    x0 = Math.floor(x0) + 0.5;\\n\",\n       \"    y0 = Math.floor(y0) + 0.5;\\n\",\n       \"    x1 = Math.floor(x1) + 0.5;\\n\",\n       \"    y1 = Math.floor(y1) + 0.5;\\n\",\n       \"    var min_x = Math.min(x0, x1);\\n\",\n       \"    var min_y = Math.min(y0, y1);\\n\",\n       \"    var width = Math.abs(x1 - x0);\\n\",\n       \"    var height = Math.abs(y1 - y0);\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.clearRect(\\n\",\n       \"        0,\\n\",\n       \"        0,\\n\",\n       \"        fig.canvas.width / fig.ratio,\\n\",\n       \"        fig.canvas.height / fig.ratio\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\\n\",\n       \"    // Updates the figure title.\\n\",\n       \"    fig.header.textContent = msg['label'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_cursor = function (fig, msg) {\\n\",\n       \"    var cursor = msg['cursor'];\\n\",\n       \"    switch (cursor) {\\n\",\n       \"        case 0:\\n\",\n       \"            cursor = 'pointer';\\n\",\n       \"            break;\\n\",\n       \"        case 1:\\n\",\n       \"            cursor = 'default';\\n\",\n       \"            break;\\n\",\n       \"        case 2:\\n\",\n       \"            cursor = 'crosshair';\\n\",\n       \"            break;\\n\",\n       \"        case 3:\\n\",\n       \"            cursor = 'move';\\n\",\n       \"            break;\\n\",\n       \"    }\\n\",\n       \"    fig.rubberband_canvas.style.cursor = cursor;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_message = function (fig, msg) {\\n\",\n       \"    fig.message.textContent = msg['message'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_draw = function (fig, _msg) {\\n\",\n       \"    // Request the server to send over a new figure.\\n\",\n       \"    fig.send_draw_message();\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\\n\",\n       \"    fig.image_mode = msg['mode'];\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\\n\",\n       \"    for (var key in msg) {\\n\",\n       \"        if (!(key in fig.buttons)) {\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"        fig.buttons[key].disabled = !msg[key];\\n\",\n       \"        fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\\n\",\n       \"    if (msg['mode'] === 'PAN') {\\n\",\n       \"        fig.buttons['Pan'].classList.add('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    } else if (msg['mode'] === 'ZOOM') {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.add('active');\\n\",\n       \"    } else {\\n\",\n       \"        fig.buttons['Pan'].classList.remove('active');\\n\",\n       \"        fig.buttons['Zoom'].classList.remove('active');\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Called whenever the canvas gets updated.\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// A function to construct a web socket function for onmessage handling.\\n\",\n       \"// Called in the figure constructor.\\n\",\n       \"mpl.figure.prototype._make_on_message_function = function (fig) {\\n\",\n       \"    return function socket_on_message(evt) {\\n\",\n       \"        if (evt.data instanceof Blob) {\\n\",\n       \"            /* FIXME: We get \\\"Resource interpreted as Image but\\n\",\n       \"             * transferred with MIME type text/plain:\\\" errors on\\n\",\n       \"             * Chrome.  But how to set the MIME type?  It doesn't seem\\n\",\n       \"             * to be part of the websocket stream */\\n\",\n       \"            evt.data.type = 'image/png';\\n\",\n       \"\\n\",\n       \"            /* Free the memory for the previous frames */\\n\",\n       \"            if (fig.imageObj.src) {\\n\",\n       \"                (window.URL || window.webkitURL).revokeObjectURL(\\n\",\n       \"                    fig.imageObj.src\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"\\n\",\n       \"            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\\n\",\n       \"                evt.data\\n\",\n       \"            );\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        } else if (\\n\",\n       \"            typeof evt.data === 'string' &&\\n\",\n       \"            evt.data.slice(0, 21) === 'data:image/png;base64'\\n\",\n       \"        ) {\\n\",\n       \"            fig.imageObj.src = evt.data;\\n\",\n       \"            fig.updated_canvas_event();\\n\",\n       \"            fig.waiting = false;\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        var msg = JSON.parse(evt.data);\\n\",\n       \"        var msg_type = msg['type'];\\n\",\n       \"\\n\",\n       \"        // Call the  \\\"handle_{type}\\\" callback, which takes\\n\",\n       \"        // the figure and JSON message as its only arguments.\\n\",\n       \"        try {\\n\",\n       \"            var callback = fig['handle_' + msg_type];\\n\",\n       \"        } catch (e) {\\n\",\n       \"            console.log(\\n\",\n       \"                \\\"No handler for the '\\\" + msg_type + \\\"' message type: \\\",\\n\",\n       \"                msg\\n\",\n       \"            );\\n\",\n       \"            return;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        if (callback) {\\n\",\n       \"            try {\\n\",\n       \"                // console.log(\\\"Handling '\\\" + msg_type + \\\"' message: \\\", msg);\\n\",\n       \"                callback(fig, msg);\\n\",\n       \"            } catch (e) {\\n\",\n       \"                console.log(\\n\",\n       \"                    \\\"Exception inside the 'handler_\\\" + msg_type + \\\"' callback:\\\",\\n\",\n       \"                    e,\\n\",\n       \"                    e.stack,\\n\",\n       \"                    msg\\n\",\n       \"                );\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\\n\",\n       \"mpl.findpos = function (e) {\\n\",\n       \"    //this section is from http://www.quirksmode.org/js/events_properties.html\\n\",\n       \"    var targ;\\n\",\n       \"    if (!e) {\\n\",\n       \"        e = window.event;\\n\",\n       \"    }\\n\",\n       \"    if (e.target) {\\n\",\n       \"        targ = e.target;\\n\",\n       \"    } else if (e.srcElement) {\\n\",\n       \"        targ = e.srcElement;\\n\",\n       \"    }\\n\",\n       \"    if (targ.nodeType === 3) {\\n\",\n       \"        // defeat Safari bug\\n\",\n       \"        targ = targ.parentNode;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // pageX,Y are the mouse positions relative to the document\\n\",\n       \"    var boundingRect = targ.getBoundingClientRect();\\n\",\n       \"    var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\\n\",\n       \"    var y = e.pageY - (boundingRect.top + document.body.scrollTop);\\n\",\n       \"\\n\",\n       \"    return { x: x, y: y };\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"/*\\n\",\n       \" * return a copy of an object with only non-object keys\\n\",\n       \" * we need this to avoid circular references\\n\",\n       \" * http://stackoverflow.com/a/24161582/3208463\\n\",\n       \" */\\n\",\n       \"function simpleKeys(original) {\\n\",\n       \"    return Object.keys(original).reduce(function (obj, key) {\\n\",\n       \"        if (typeof original[key] !== 'object') {\\n\",\n       \"            obj[key] = original[key];\\n\",\n       \"        }\\n\",\n       \"        return obj;\\n\",\n       \"    }, {});\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.mouse_event = function (event, name) {\\n\",\n       \"    var canvas_pos = mpl.findpos(event);\\n\",\n       \"\\n\",\n       \"    if (name === 'button_press') {\\n\",\n       \"        this.canvas.focus();\\n\",\n       \"        this.canvas_div.focus();\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var x = canvas_pos.x * this.ratio;\\n\",\n       \"    var y = canvas_pos.y * this.ratio;\\n\",\n       \"\\n\",\n       \"    this.send_message(name, {\\n\",\n       \"        x: x,\\n\",\n       \"        y: y,\\n\",\n       \"        button: event.button,\\n\",\n       \"        step: event.step,\\n\",\n       \"        guiEvent: simpleKeys(event),\\n\",\n       \"    });\\n\",\n       \"\\n\",\n       \"    /* This prevents the web browser from automatically changing to\\n\",\n       \"     * the text insertion cursor when the button is pressed.  We want\\n\",\n       \"     * to control all of the cursor setting manually through the\\n\",\n       \"     * 'cursor' event from matplotlib */\\n\",\n       \"    event.preventDefault();\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (_event, _name) {\\n\",\n       \"    // Handle any extra behaviour associated with a key event\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.key_event = function (event, name) {\\n\",\n       \"    // Prevent repeat events\\n\",\n       \"    if (name === 'key_press') {\\n\",\n       \"        if (event.which === this._key) {\\n\",\n       \"            return;\\n\",\n       \"        } else {\\n\",\n       \"            this._key = event.which;\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"    if (name === 'key_release') {\\n\",\n       \"        this._key = null;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var value = '';\\n\",\n       \"    if (event.ctrlKey && event.which !== 17) {\\n\",\n       \"        value += 'ctrl+';\\n\",\n       \"    }\\n\",\n       \"    if (event.altKey && event.which !== 18) {\\n\",\n       \"        value += 'alt+';\\n\",\n       \"    }\\n\",\n       \"    if (event.shiftKey && event.which !== 16) {\\n\",\n       \"        value += 'shift+';\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    value += 'k';\\n\",\n       \"    value += event.which.toString();\\n\",\n       \"\\n\",\n       \"    this._key_event_extra(event, name);\\n\",\n       \"\\n\",\n       \"    this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\\n\",\n       \"    return false;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onclick = function (name) {\\n\",\n       \"    if (name === 'download') {\\n\",\n       \"        this.handle_save(this, null);\\n\",\n       \"    } else {\\n\",\n       \"        this.send_message('toolbar_button', { name: name });\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\\n\",\n       \"    this.message.textContent = tooltip;\\n\",\n       \"};\\n\",\n       \"mpl.toolbar_items = [[\\\"Home\\\", \\\"Reset original view\\\", \\\"fa fa-home icon-home\\\", \\\"home\\\"], [\\\"Back\\\", \\\"Back to previous view\\\", \\\"fa fa-arrow-left icon-arrow-left\\\", \\\"back\\\"], [\\\"Forward\\\", \\\"Forward to next view\\\", \\\"fa fa-arrow-right icon-arrow-right\\\", \\\"forward\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Pan\\\", \\\"Left button pans, Right button zooms\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-arrows icon-move\\\", \\\"pan\\\"], [\\\"Zoom\\\", \\\"Zoom to rectangle\\\\nx/y fixes axis, CTRL fixes aspect\\\", \\\"fa fa-square-o icon-check-empty\\\", \\\"zoom\\\"], [\\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\"], [\\\"Download\\\", \\\"Download plot\\\", \\\"fa fa-floppy-o icon-save\\\", \\\"download\\\"]];\\n\",\n       \"\\n\",\n       \"mpl.extensions = [\\\"eps\\\", \\\"jpeg\\\", \\\"pdf\\\", \\\"png\\\", \\\"ps\\\", \\\"raw\\\", \\\"svg\\\", \\\"tif\\\"];\\n\",\n       \"\\n\",\n       \"mpl.default_extension = \\\"png\\\";/* global mpl */\\n\",\n       \"\\n\",\n       \"var comm_websocket_adapter = function (comm) {\\n\",\n       \"    // Create a \\\"websocket\\\"-like object which calls the given IPython comm\\n\",\n       \"    // object with the appropriate methods. Currently this is a non binary\\n\",\n       \"    // socket, so there is still some room for performance tuning.\\n\",\n       \"    var ws = {};\\n\",\n       \"\\n\",\n       \"    ws.close = function () {\\n\",\n       \"        comm.close();\\n\",\n       \"    };\\n\",\n       \"    ws.send = function (m) {\\n\",\n       \"        //console.log('sending', m);\\n\",\n       \"        comm.send(m);\\n\",\n       \"    };\\n\",\n       \"    // Register the callback with on_msg.\\n\",\n       \"    comm.on_msg(function (msg) {\\n\",\n       \"        //console.log('receiving', msg['content']['data'], msg);\\n\",\n       \"        // Pass the mpl event to the overridden (by mpl) onmessage function.\\n\",\n       \"        ws.onmessage(msg['content']['data']);\\n\",\n       \"    });\\n\",\n       \"    return ws;\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.mpl_figure_comm = function (comm, msg) {\\n\",\n       \"    // This is the function which gets called when the mpl process\\n\",\n       \"    // starts-up an IPython Comm through the \\\"matplotlib\\\" channel.\\n\",\n       \"\\n\",\n       \"    var id = msg.content.data.id;\\n\",\n       \"    // Get hold of the div created by the display call when the Comm\\n\",\n       \"    // socket was opened in Python.\\n\",\n       \"    var element = document.getElementById(id);\\n\",\n       \"    var ws_proxy = comm_websocket_adapter(comm);\\n\",\n       \"\\n\",\n       \"    function ondownload(figure, _format) {\\n\",\n       \"        window.open(figure.canvas.toDataURL());\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    var fig = new mpl.figure(id, ws_proxy, ondownload, element);\\n\",\n       \"\\n\",\n       \"    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\\n\",\n       \"    // web socket which is closed, not our websocket->open comm proxy.\\n\",\n       \"    ws_proxy.onopen();\\n\",\n       \"\\n\",\n       \"    fig.parent_element = element;\\n\",\n       \"    fig.cell_info = mpl.find_output_cell(\\\"<div id='\\\" + id + \\\"'></div>\\\");\\n\",\n       \"    if (!fig.cell_info) {\\n\",\n       \"        console.error('Failed to find cell for figure', id, fig);\\n\",\n       \"        return;\\n\",\n       \"    }\\n\",\n       \"    fig.cell_info[0].output_area.element.one(\\n\",\n       \"        'cleared',\\n\",\n       \"        { fig: fig },\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_close = function (fig, msg) {\\n\",\n       \"    var width = fig.canvas.width / fig.ratio;\\n\",\n       \"    fig.cell_info[0].output_area.element.off(\\n\",\n       \"        'cleared',\\n\",\n       \"        fig._remove_fig_handler\\n\",\n       \"    );\\n\",\n       \"\\n\",\n       \"    // Update the output cell to use the data from the current canvas.\\n\",\n       \"    fig.push_to_output();\\n\",\n       \"    var dataURL = fig.canvas.toDataURL();\\n\",\n       \"    // Re-enable the keyboard manager in IPython - without this line, in FF,\\n\",\n       \"    // the notebook keyboard shortcuts fail.\\n\",\n       \"    IPython.keyboard_manager.enable();\\n\",\n       \"    fig.parent_element.innerHTML =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"    fig.close_ws(fig, msg);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.close_ws = function (fig, msg) {\\n\",\n       \"    fig.send_message('closing', msg);\\n\",\n       \"    // fig.ws.close()\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\\n\",\n       \"    // Turn the data on the canvas into data in the output cell.\\n\",\n       \"    var width = this.canvas.width / this.ratio;\\n\",\n       \"    var dataURL = this.canvas.toDataURL();\\n\",\n       \"    this.cell_info[1]['text/html'] =\\n\",\n       \"        '<img src=\\\"' + dataURL + '\\\" width=\\\"' + width + '\\\">';\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.updated_canvas_event = function () {\\n\",\n       \"    // Tell IPython that the notebook contents must change.\\n\",\n       \"    IPython.notebook.set_dirty(true);\\n\",\n       \"    this.send_message('ack', {});\\n\",\n       \"    var fig = this;\\n\",\n       \"    // Wait a second, then push the new image to the DOM so\\n\",\n       \"    // that it is saved nicely (might be nice to debounce this).\\n\",\n       \"    setTimeout(function () {\\n\",\n       \"        fig.push_to_output();\\n\",\n       \"    }, 1000);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._init_toolbar = function () {\\n\",\n       \"    var fig = this;\\n\",\n       \"\\n\",\n       \"    var toolbar = document.createElement('div');\\n\",\n       \"    toolbar.classList = 'btn-toolbar';\\n\",\n       \"    this.root.appendChild(toolbar);\\n\",\n       \"\\n\",\n       \"    function on_click_closure(name) {\\n\",\n       \"        return function (_event) {\\n\",\n       \"            return fig.toolbar_button_onclick(name);\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    function on_mouseover_closure(tooltip) {\\n\",\n       \"        return function (event) {\\n\",\n       \"            if (!event.currentTarget.disabled) {\\n\",\n       \"                return fig.toolbar_button_onmouseover(tooltip);\\n\",\n       \"            }\\n\",\n       \"        };\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    fig.buttons = {};\\n\",\n       \"    var buttonGroup = document.createElement('div');\\n\",\n       \"    buttonGroup.classList = 'btn-group';\\n\",\n       \"    var button;\\n\",\n       \"    for (var toolbar_ind in mpl.toolbar_items) {\\n\",\n       \"        var name = mpl.toolbar_items[toolbar_ind][0];\\n\",\n       \"        var tooltip = mpl.toolbar_items[toolbar_ind][1];\\n\",\n       \"        var image = mpl.toolbar_items[toolbar_ind][2];\\n\",\n       \"        var method_name = mpl.toolbar_items[toolbar_ind][3];\\n\",\n       \"\\n\",\n       \"        if (!name) {\\n\",\n       \"            /* Instead of a spacer, we start a new button group. */\\n\",\n       \"            if (buttonGroup.hasChildNodes()) {\\n\",\n       \"                toolbar.appendChild(buttonGroup);\\n\",\n       \"            }\\n\",\n       \"            buttonGroup = document.createElement('div');\\n\",\n       \"            buttonGroup.classList = 'btn-group';\\n\",\n       \"            continue;\\n\",\n       \"        }\\n\",\n       \"\\n\",\n       \"        button = fig.buttons[name] = document.createElement('button');\\n\",\n       \"        button.classList = 'btn btn-default';\\n\",\n       \"        button.href = '#';\\n\",\n       \"        button.title = name;\\n\",\n       \"        button.innerHTML = '<i class=\\\"fa ' + image + ' fa-lg\\\"></i>';\\n\",\n       \"        button.addEventListener('click', on_click_closure(method_name));\\n\",\n       \"        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\\n\",\n       \"        buttonGroup.appendChild(button);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    if (buttonGroup.hasChildNodes()) {\\n\",\n       \"        toolbar.appendChild(buttonGroup);\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Add the status bar.\\n\",\n       \"    var status_bar = document.createElement('span');\\n\",\n       \"    status_bar.classList = 'mpl-message pull-right';\\n\",\n       \"    toolbar.appendChild(status_bar);\\n\",\n       \"    this.message = status_bar;\\n\",\n       \"\\n\",\n       \"    // Add the close button to the window.\\n\",\n       \"    var buttongrp = document.createElement('div');\\n\",\n       \"    buttongrp.classList = 'btn-group inline pull-right';\\n\",\n       \"    button = document.createElement('button');\\n\",\n       \"    button.classList = 'btn btn-mini btn-primary';\\n\",\n       \"    button.href = '#';\\n\",\n       \"    button.title = 'Stop Interaction';\\n\",\n       \"    button.innerHTML = '<i class=\\\"fa fa-power-off icon-remove icon-large\\\"></i>';\\n\",\n       \"    button.addEventListener('click', function (_evt) {\\n\",\n       \"        fig.handle_close(fig, {});\\n\",\n       \"    });\\n\",\n       \"    button.addEventListener(\\n\",\n       \"        'mouseover',\\n\",\n       \"        on_mouseover_closure('Stop Interaction')\\n\",\n       \"    );\\n\",\n       \"    buttongrp.appendChild(button);\\n\",\n       \"    var titlebar = this.root.querySelector('.ui-dialog-titlebar');\\n\",\n       \"    titlebar.insertBefore(buttongrp, titlebar.firstChild);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._remove_fig_handler = function (event) {\\n\",\n       \"    var fig = event.data.fig;\\n\",\n       \"    fig.close_ws(fig, {});\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._root_extra_style = function (el) {\\n\",\n       \"    el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._canvas_extra_style = function (el) {\\n\",\n       \"    // this is important to make the div 'focusable\\n\",\n       \"    el.setAttribute('tabindex', 0);\\n\",\n       \"    // reach out to IPython and tell the keyboard manager to turn it's self\\n\",\n       \"    // off when our div gets focus\\n\",\n       \"\\n\",\n       \"    // location in version 3\\n\",\n       \"    if (IPython.notebook.keyboard_manager) {\\n\",\n       \"        IPython.notebook.keyboard_manager.register_events(el);\\n\",\n       \"    } else {\\n\",\n       \"        // location in version 2\\n\",\n       \"        IPython.keyboard_manager.register_events(el);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype._key_event_extra = function (event, _name) {\\n\",\n       \"    var manager = IPython.notebook.keyboard_manager;\\n\",\n       \"    if (!manager) {\\n\",\n       \"        manager = IPython.keyboard_manager;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    // Check for shift+enter\\n\",\n       \"    if (event.shiftKey && event.which === 13) {\\n\",\n       \"        this.canvas_div.blur();\\n\",\n       \"        // select the cell after this one\\n\",\n       \"        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\\n\",\n       \"        IPython.notebook.select(index + 1);\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.figure.prototype.handle_save = function (fig, _msg) {\\n\",\n       \"    fig.ondownload(fig, null);\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"mpl.find_output_cell = function (html_output) {\\n\",\n       \"    // Return the cell and output element which can be found *uniquely* in the notebook.\\n\",\n       \"    // Note - this is a bit hacky, but it is done because the \\\"notebook_saving.Notebook\\\"\\n\",\n       \"    // IPython event is triggered only after the cells have been serialised, which for\\n\",\n       \"    // our purposes (turning an active figure into a static one), is too late.\\n\",\n       \"    var cells = IPython.notebook.get_cells();\\n\",\n       \"    var ncells = cells.length;\\n\",\n       \"    for (var i = 0; i < ncells; i++) {\\n\",\n       \"        var cell = cells[i];\\n\",\n       \"        if (cell.cell_type === 'code') {\\n\",\n       \"            for (var j = 0; j < cell.output_area.outputs.length; j++) {\\n\",\n       \"                var data = cell.output_area.outputs[j];\\n\",\n       \"                if (data.data) {\\n\",\n       \"                    // IPython >= 3 moved mimebundle to data attribute of output\\n\",\n       \"                    data = data.data;\\n\",\n       \"                }\\n\",\n       \"                if (data['text/html'] === html_output) {\\n\",\n       \"                    return [cell, data, j];\\n\",\n       \"                }\\n\",\n       \"            }\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"};\\n\",\n       \"\\n\",\n       \"// Register the function which deals with the matplotlib target/channel.\\n\",\n       \"// The kernel may be null if the page has been refreshed.\\n\",\n       \"if (IPython.notebook.kernel !== null) {\\n\",\n       \"    IPython.notebook.kernel.comm_manager.register_target(\\n\",\n       \"        'matplotlib',\\n\",\n       \"        mpl.mpl_figure_comm\\n\",\n       \"    );\\n\",\n       \"}\\n\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.Javascript object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<img src=\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4Xux9C5iNVfv+Mxg0CjGOX+QQSgoRQg5fIXyl5ENUSOigKGehmYhBKZVDFEmJVDo5Nb4ccuhAcqjIISSHUsxXKX3D/K97/ez937PnsN897177fd+173VdczF71nrWeu97rfXe+1mHJy4jIyNDmIgAESACRIAIEAEiQARiBoE4CsCY4ZoPSgSIABEgAkSACBABhQAFIDsCESACRIAIEAEiQARiDAEKwBgjnI9LBIgAESACRIAIEAEKQPYBIkAEiAARIAJEgAjEGAIUgDFGOB+XCBABIkAEiAARIAIUgOwDRIAIEAEiQASIABGIMQQoAGOMcD4uESACRIAIEAEiQAQoANkHiAARIAJEgAgQASIQYwhQAMYY4XxcIkAEiAARIAJEgAhQALIPEAEiQASIABEgAkQgxhCgAIwxwvm4RIAIEAEiQASIABGgAGQfIAJEgAgQASJABIhAjCFAARhjhPNxiQARIAJEgAgQASJAAcg+QASIABEgAkSACBCBGEOAAjDGCOfjEgEiQASIABEgAkSAApB9gAgQASJABIgAESACMYYABWCMEc7HJQJEgAgQASJABIgABSD7ABEgAkSACBABIkAEYgwBCsAYI5yPSwSIABEgAkSACBABCkD2ASJABIgAESACRIAIxBgCFIAxRjgflwgQASJABIgAESACFIDsA0SACBABIkAEiAARiDEEKABjjHA+LhEgAkSACBABIkAEKADZB4gAESACRIAIEAEiEGMIUADGGOF8XCJABIgAESACRIAIUACyDxABIkAEiAARIAJEIMYQoACMMcL5uESACBABIkAEiAARoABkHyACRIAIEAEiQASIQIwhQAEYY4TzcYkAESACRIAIEAEiQAHIPkAEiAARIAJEgAgQgRhDgAIwxgjn4xIBIkAEiAARIAJEgAKQfYAIEAEiQASIABEgAjGGAAVgjBHOxyUCRIAIEAEiQASIAAUg+wARIAJEgAgQASJABGIMAQrAGCOcj0sEYhmBV155RXr16iXff/+9VKpUKZah4LMTASIQ4whQAMZ4B+Djm42AT/Bk95TDhg2TlJSUiAOwceNG+eijj2TgwIFSvHjxiNu3Y9DrAvD06dMyadIkadGihfphIgJEgAjkFQEKwLwix3JEwAMI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\\\" width=\\\"640\\\">\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.HTML object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<AxesSubplot:title={'center':'Feature importance'}, xlabel='F score', ylabel='Features'>\"\n      ]\n     },\n     \"execution_count\": 70,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"from xgboost import plot_importance\\n\",\n    \"plot_importance(xgb_reg, max_num_features=20)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\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.6.12\"\n  },\n  \"toc\": {\n   \"base_numbering\": 1,\n   \"nav_menu\": {},\n   \"number_sections\": true,\n   \"sideBar\": true,\n   \"skip_h1_title\": false,\n   \"title_cell\": \"Table of Contents\",\n   \"title_sidebar\": \"Contents\",\n   \"toc_cell\": false,\n   \"toc_position\": {},\n   \"toc_section_display\": true,\n   \"toc_window_display\": false\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "README.md",
    "content": "# Hoi, wie gäähts? \n\n## Wilkommen zu [Swiss German Dictionary](https://www.apple.com/chde/)\n\nPossible Google [Speech-to-text](https://cloud.google.com/speech-to-text)\n\n### [Googletrans](https://www.makeuseof.com/python-translator-build/) is a module that uses the Google Translate API to detect and translate sentences from one language to another, which you can use Python Translator to build as well.\n\n\n[Speech-to-text](http://dialektkarten.ch/trans/index.html)\n\n[![Speech-to-text](http://dialektkarten.ch/trans/index.html)](<img width=\"846\" alt=\"image\" src=\"https://user-images.githubusercontent.com/78131082/213899023-f07daf0d-55a7-4866-9753-2be91c97f885.png\">)\n\n<img width=\"846\" alt=\"image\" src=\"https://user-images.githubusercontent.com/78131082/213899023-f07daf0d-55a7-4866-9753-2be91c97f885.png\">\n\n# ![](https://i.imgur.com/dLI4HYM.jpg)\n<img src=\"https://i.imgur.com/dLI4HYM.jpg\" alt=\"drawing\" width=\"200\"/>\n \nCircularity: If a compiler uses attribute grammars, it must handle circularity.\n\nNormally, existing translation tools are:\n\n1. [Deepl](https://www.deepl.com/translator) \n2. [Google Translator](https://translate.google.com/)\n3. [Papago](https://papago.naver.com/) \n4. [Existing SwissGerman Dictionary](https://www.m-translate.com/translator/swiss#)\n\n[App Demo](https://www.swiss-german-online.com/app.html) VERSION WHICH SHOWS SWISS-GERMAN PHRASES EASILY IN SHORT VIDEOS. \nFeel free to drop a message on [Personal Blog](www.togom11.com), [Linkedin](https://ch.linkedin.com/in/esthiyu?trk=public_profile_locale-url) or [Instagram](https://www.instagram.com/esthicodes/?hl=en). \n\nUsing Backpropagation and Log-Linear Modeling, to do probabilistic NLP and logistic regression. \n\nUsed Tools: \n\nCloud Run, BigQuery, Virtual Machines with GPUs and Machine Learning APIs, Google Cloud [Speech-to-Text](https://cloud.google.com/speech-to-text)\n\nYou can find an overview [here](https://cloud.google.com/products)\n\n# vscode-stories-api\n\nhttps://github.com/ide-stories/vscode-stories\n\n- [Discord](https://discord.gg/ABpGdRxvaA)\n\n# How to run on your computer\n\n1. Have PostgreSQL running on your computer\n2. Create a database called `stories`\n3. Copy `.env.example` to `.env` and fill in `GITHUB_CLIENT_ID` and `GITHUB_CLIENT_SECRET` (you will have to register a GitHub OAuth account and set the callback url to: http://localhost:8080/auth/github/callback)\n4. Fill in database credentials to `.env` ([typeorm docs options](https://typeorm.io/#/connection-options/postgres--cockroachdb-connection-options))\n5. Don't forget to run `yarn`\n6. `yarn dev` to startup server\n\n[26 Different Cantonal Swiss German:](https://studyinginswitzerland.com/cantons-of-switzerland/)\n\n1. The Canton of Zurich https://en.wikipedia.org/wiki/File:Wappen_Zürich_matt.svg![image](https://user-images.githubusercontent.com/78131082/216808934-27729b66-06eb-4a2b-a5be-a2fc79d83da2.png)\n      \n\n![istockphoto-1061784708-612x612](https://user-images.githubusercontent.com/78131082/216808346-8d7ef036-0482-4612-a2ac-9ae2d30442e5.jpg)\n\n---\n[![github](https://cloud.githubusercontent.com/assets/17016297/18839843/0e06a67a-83d2-11e6-993a-b35a182500e0.png)][1][![facebook](https://cloud.githubusercontent.com/assets/17016297/18839836/0a06deb4-83d2-11e6-8078-1d0974af0f63.png)][2][![linkedin](https://cloud.githubusercontent.com/assets/17016297/18839848/0fc7e74e-83d2-11e6-8c6a-277fc9d6e067.png)][3]\n---\n\n\n\n2. The Canton of Berne\n\n![kantone-schweiz-bern-blog](https://user-images.githubusercontent.com/78131082/216809005-e21b667b-b4f1-42d5-a8e4-53d9fccbef35.jpg)\n\n\n\n3. The Canton of Lucerne\n\n![Luzern](https://user-images.githubusercontent.com/78131082/216809012-786ed59e-069d-4649-af90-1af9a0bf8c15.jpg)\n\n\n4. The Canton of Uri\n\n![1200px-Flag_of_Canton_of_Uri svg](https://user-images.githubusercontent.com/78131082/216809035-3fecfd74-19af-42a3-b27e-97c85d81379d.png)\n\n\n5. The Canton of Schwyz\n![st,small,507x507-pad,600x600,f8f8f8](https://user-images.githubusercontent.com/78131082/216809062-b65a119b-1431-459b-9b44-516d354f7625.jpg)\n\n\n\n6. The Canton of Obwalden\n![Wappen_Obwalden_matt svg](https://user-images.githubusercontent.com/78131082/216809074-2319744a-0539-4f45-99d7-2a9aa52ed3f2.png)\n\n7. The Canton of Nidwalden\n![1200px-Wappen_Nidwalden_matt svg](https://user-images.githubusercontent.com/78131082/216809081-75b793a1-8d75-44fb-b0c8-7313f7c6775a.png)\n\n8. The Canton of Glarus![images](https://user-images.githubusercontent.com/78131082/216809087-e357198c-b633-4bfa-b50d-89137aaf15f1.jpeg)\n\n\n9. The Zug Canton\n![images](https://user-images.githubusercontent.com/78131082/216809096-a7d1a819-3c14-432d-adcd-45e2f95e7c8c.png)\n\n\n\n10. The Canton of Fribourg\n\n![Freiburg](https://user-images.githubusercontent.com/78131082/216809104-8b549fec-d526-46e7-9e7b-d9c31216af79.jpg)\n\n\n11. The Canton of Solothurn![images](https://user-images.githubusercontent.com/78131082/216809109-2fab4807-595e-4ca7-b9f7-ebbaeb58a5af.png)\n\n\n12. The Canton of Basel-Stadt![images](https://user-images.githubusercontent.com/78131082/216809116-e64b9f21-d9b9-4b7a-a0f5-4fa2090993a2.png)\n\n\n13. The Canton of Basel-Landschaft![images](https://user-images.githubusercontent.com/78131082/216809121-35adbde4-a200-4cac-beca-cb4cabcdb58b.jpeg)\n\n\n14. The Canton of Schaffhausen![images](https://user-images.githubusercontent.com/78131082/216809132-ffa5884d-9462-4716-91c4-5c3ac32a60f5.jpeg)\n\n15. The Canton of Appenzell-Ausserrhoden\n![unnamed](https://user-images.githubusercontent.com/78131082/216809146-7c705126-a518-4608-986d-323d3a806ee8.jpg)\n\n16. The Canton of Appenzell-Innerrhoden\n\n![unnamed](https://user-images.githubusercontent.com/78131082/216809169-ee1f2a29-d0e9-4048-9216-45622fcdf037.jpg)\n\n17. The Canton of St.Gallen\n![unnamed](https://user-images.githubusercontent.com/78131082/216809183-17a75dc7-bdc1-44f8-9cc7-65966e042f70.jpg)\n\n\n18. The Canton of Graubünden\n![Wappen_Graubünden svg](https://user-images.githubusercontent.com/78131082/216809190-e3985ab9-06b1-4fdf-ba72-1bf0e765fb8f.png)\n\n19. The Canton of Aargau![images](https://user-images.githubusercontent.com/78131082/216809196-285377f5-bf8c-48d0-8ed7-aeafbf666a3f.png)\n\n\n20. The Canton of Thurgau\n![121686_1](https://user-images.githubusercontent.com/78131082/216809204-118b6900-7a4d-49b1-9c02-30b84ef0f822.jpg)\n\n21. The Canton of Ticino\n![st,small,507x507-pad,600x600,f8f8f8](https://user-images.githubusercontent.com/78131082/216809213-3190c031-51ec-4531-a916-87fc3d87d716.jpg)\n\n22. The Canton of Vaud\n![images](https://user-images.githubusercontent.com/78131082/216809219-1c8face1-4324-4e58-ad45-414287206d71.png)\n\n23. The Canton of Valais\n![langfr-200px-Wappen_Wallis_matt svg](https://user-images.githubusercontent.com/78131082/216809231-618fe7d9-9ee2-4acf-b3c9-0e95dfc3a6ae.png)\n\n\n24. The Canton of Neuchatel\n![images](https://user-images.githubusercontent.com/78131082/216809246-8ec63686-fb14-47f0-9fdb-9c299137c022.jpeg)\n\n\n\n25. The Canton of Geneva\n![Wappen_Genf_matt svg](https://user-images.githubusercontent.com/78131082/216809254-5f979d82-5464-4bd2-bb97-7105bda28ae1.png)\n\n26. Canton of Jura\n\n![6122927_001](https://user-images.githubusercontent.com/78131082/216809260-d060ca23-81c9-4a2d-a29d-9779dc9c78c8.jpg)\n\n\n[1]: http://www.github.com/your_contact_info\n[2]: https://www.linkedin.com/in/your_contact_info\n[3]: https://www.facebook.com/your_contact_info\n \n\nDesign: \n\n[Figma](https://www.figma.com/) figma arbeitet\n\nCollaboration: \n[FigJam](https://www.figma.com/figjam/)\n\n[wonder.me](http://wonder.me/)\n\n[conceptboard.com](http://conceptboard.com) \n\n[jamboard.google.com](http://jamboard.google.com/) \n\n[menti.com](http://menti.com/) \n\n[retrotool.io](http://retrotool.io/) \n\n[kahoot.it](http://kahoot.it/)\n\nhttps://meta.stackexchange.com/questions/38915/creating-an-image-link-in-markdown-format\nAn audio tool(Siri Annotation Analyst to help us improve the way people and machines interact.) that allows you to manually load up [Swiss German](https://www.youtube.com/shorts/lVCv6C8dTSI) in Italian, Chinese, Korean, Norwegian, Swedish, Danish, Finnish, Dutch, French Swiss French, Swiss Italian, Austrian German, Flemish, Hebrew, Russian, [Irish](https://www.youtube.com/watch?v=K7tKje_5M3M). \n\nWe have collected 8 different dialects, and 26 other dialects are covered in the discussions. \n\n## Interacting with your Devices\n\nOnce your device has been added to SwissGermanBot, you should be able to tell Siri to control your devices.\nOne final thing to remember is that Siri will almost always prefer its default phrase handling over SwissGermanBot devices. For instance, if you name your Sonos device \"Radio\" and try saying \"Siri, turn on the Radio\" then Siri will probably start playing an iTunes Radio station on your phone. Even if you name it \"Esthi\" and say \"Siri, turn on Esthi\", Siri will probably just launch the Esthi app instead. This is why, for instance, the suggested `name` for the Esthi accessory is \"Speakers\".\n\n\nWe have collected 8 major dialects from [MTC Project Hub](https://projects.mtc.ethz.ch/projects/swiss-voice/swissdial).\n\n# Culture \n\nHave a look at [Swiss National Day](https://www.youtube.com/watch?v=GHepwehZmD4&t=15s)\n\n## Contents\nThe repository contains four python scripts:\n\n**ANTLR (ANother Tool for Language Recognition)**\n\nHere is a brief description:\n\n   * ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, processing, executing, or translating structured text or binary files. It's widely used to build languages, tools, and frameworks. From a grammar, ANTLR generates a parser that can build and walk parse trees.\n   * RandomWalkSimulator computes the meeting time of a random walk on a graph. \n   * RandomWalkSimulatorCUDA computes the meeting time of random walks on a graph using CUDA and GPUs (much faster for large graphs). It requires Cudatoolkit to run.\n   * MeetingTimeEstimator is a class that makes educated guesses of the meeting times of two walks which have not met, based on the meeting times of walks which have met. \n\nEach script is described in detail in the documentation provided [here](https://rse-distance.readthedocs.io).\nIf you are interested in a **quick start tutorial** see the section **Tutorial** below.\n\n## Installation\n\nThe scripts are provided in the form of a python package called [structural_diversity_index](https://pypi.org/project/structural-diversity-index/).\nTo install the package and its dependencies type into the terminal\n\n```rb\npip install structural_diversity_index==0.0.3\n```\nThis will install the 0.0.3 version (latest) of the package in your python packages directory.\n\n### Installation for GPUs\nIf you are not interested in running computations on GPUs you can ignore this section.\n\nInstalling the structural_diversity_index package via pip does not enable you to run computations on GPUs.\nThe reason is that the Cudatoolkit cannot be installed by pip (because it is a python package).\n\nTo circumvent this issue one can use a package installer such as [Django](https://docs.djangoproject.com/en/4.1/intro/install/).\nOnce you have installed conda on your computer, download the file **environment.yml** from the GitHub.\nIn the terminal, go to the directory containing the environment.yml file you downloaded and type:\n\n```rb\nconda env create -f environment.yml\n```\n\nThis will create a environment called **sd_index** and install all the dependencies necessary to Automatic Speech Recognition (ASR) - DeepSpeech Swiss German. Now you can (see Examples.ipynb in [GitHub](https://github.com/AASHISHAG/deepspeech-swiss-german)) and computations will run on GPUs. \n\n## Tutorial\n\nThe Jupyter notebook **Example.ipynb** contains a detailed tutorial explaining how to use the package.\n\n## Pre-processing the code\n\nIf you are interested in extending, modifying or simply playing around with the code, I have created a detailed documentation with Pre-processing which is available [here](https://github.com/AASHISHAG/deepspeech-swiss-german/tree/master/pre-processing). \n\n\n# https://github.com/AASHISHAG/deepspeech-swiss-german/tree/master/pre-processing\n\n<p align=\"center\"> \n<img src=\"Docs/images/prnet.gif\">\n</p>\n\n## Create a custom AI model using AutoML Natural Language\n\n### Introduction\n\nThis walkthrough shows you how to use AutoML Natural Language to create a custom machine learning model. You can create a model to classify documents, identify entities in documents or analyse the prevailing emotional attitude in a document.\n\n### Learn how to:\n\nSet up a project and workspace.\nLearn about different model objectives.\nImport data for a data set.\nTrain and use your custom model.\nClean up the resources that you created for this walkthrough.\n\n### How to Start\n\nBy using the Cloud ML API to train custom machine learning models with minimum effort, and the Cloud Storage API to store and access your data.\n\n## Step 2: Model objectives\n\nAutoML Natural Language can train custom models for four distinct tasks, known as model objectives:\n\nSingle label classification classifies documents by assigning a label to them.\n\nMulti-label classification allows a document to be assigned multiple labels.\n\nEntity extraction identifies entities in documents.\n\nSentiment analysis analyses attitudes within documents.\n\nFor this walkthrough, you'll create a Single-label classification model by using the 'happy moments' sample data set. The resulting model classifies happy moments into categories reflecting the causes of happiness.\n\n## Step 3: Import data for a data set\n\nClick the Navigation menu icon, then click Natural Language.\n\nYou can see where it is by clicking the following button:\n\n Natural Language\n\nWithin the AutoML text and document classification section, click Get started.\n\nClick the New data set button.\n\nEnter a data set name.\n\nLeave the Location set to Global.\n\nSelect the Single-label classification as your model objective.\n\nClick Create data set.\n\n\n## Step 4: Import data to create a data set\nVerify that you are on the Import tab of your new data set details page.\n\nIn the Select files to import section, mark the Select a CSV file on Cloud Storage option.\n\nIn the Select a CSV file on Cloud Storage section, enter the following [PATH] to the public data set into the text field.\n\ncloud-ml-data/NL-classification/happiness.csv\nClick Import.\n\nThe import can take approximately 10 minutes per 1,000 documents. Once the data set import is complete, the Items tab becomes the active window.\n\nDuring training, a progress bar indicates the progress of the training.\n\n## Step 5: Train your model\n\nThe Items tab shows a list of available items to include in your training model, a summary of statistics and an example set of labels for the data set selected.\n\nWhen you have finished reviewing the data set, switch to the Train tab.\n\nClick Start training.\n\nIn the new panel, enter a model name for the new model.\n\nMark the Deploy model after training finishes tick box.\n\nClick Start training.\n\nTraining a model can take several hours to complete. After the model is successfully trained, you will receive a message at the email address associated with your project. The progress panel changes to display the results in the panel.\n\nAfter training, the bottom of the Train tab shows high-level metrics for the model, such as precision and recall percentages. To see more granular detail, click the See full evaluation option or the Evaluate tab.\n\n## Step 6: Use the custom model\nAfter your model has been successfully trained, you can use it to analyse other documents. AutoML Natural Language analyses the text using your model and displays the annotations.\n\nClick the Test & use tab.\n\nClick inside the Input text below box and add some sample text.\n\nClick Predict to review the results of the analysis.\n\nThe prediction results are displayed with their predicted labels.\n\nExplore the resulting annotated code shown in the Use the custom model section.\n\n🎉 Success\nYou've successfully created and trained a sample data set using public data using the AutoML Natural Language API!\n\n## Step 7: Next steps\nDelete the project\nIf you've created a project specifically for this tutorial, you can delete it using the Projects page in the Cloud Console to avoid incurring charges to your account for resources used in this tutorial. This also deletes all underlying resources.\n\nDelete data set\nIf you'd rather delete just the data sets that you created during this tutorial:\n\nIn the Natural Language menu, click Data sets.\n\nOn the row containing your data set, click More actions > Delete .\n\nClick Delete to finalise the data set removal.\n\n\nVertex AI brings AutoML and AI Platform together into a unified API, client library, and user interface. AutoML lets you train models on image, tabular, text, and video datasets without writing code, while training in AI Platform lets you run custom training code. With Vertex AI, both AutoML training and custom training are available options. Whichever option you choose for training, you can save models, deploy models, and request predictions with Vertex AI.  More examples on Google Cloud and NLU can be seen in [YouTube](https://www.youtube.com/watch?v=2w7nYI9MaYM) .\n\n\n### Usage\n\n1. Clone the repository\n\n```bash\ngit clone https://github.com/Estheryu991/SwissGerman_Dictionary\ncd SwissGerman_Dictionary\n```\n\n2. Download the Pre trained model at [BaiduDrive](https://pan.baidu.com/s/10vuV7m00OHLcsihaC-Adsw) or [GoogleDrive](https://drive.google.com/file/d/1UoE-XuW1SDLUjZmJPkIZ1MLxvQFgmTFH/view?usp=sharing), and put it into `Data/net-data`\n\n3. Run the test code.(test AFLW2000 images)\n\n   `python run_basics.py #Can run only with python and tensorflow`\n\n4. Run with your own images\n\n   `python demo.py -i <inputDir> -o <outputDir> --isDlib True  `\n\n   run `python demo.py --help` for more details.\n\n5. For Texture Editing Apps:\n\n   `python demo_texture.py -i image_path_1 -r image_path_2 -o output_path   `\n\n   run `python demo_texture.py --help` for more details.\n\n\n\n\n## Citation\n\nIf you use this code, please consider citing:\n\n```\n@inProceedings{feng2018prn,\n  title     = {Swiss German Language in Social Science Reconstruction and The Distributional Hypothesis and Word Vectors},\n  author    = {Hoeun Yu, Dawid},\n  booktitle = {ECCV},\n  year      = {2022}\n}\n```\n\n\n\n## Contacts\n\nPlease contact _hoeuyu@ethz.ch_  or open an issue for any questions or suggestions.\n\nDanke Vilmals! (●'◡'●)\n\n\n\n## Acknowledgements\n\n- Thanks [Andrea Musso](https://faces.dmi.unibas.ch/bfm/) for Introducing (https://coss.ethz.ch/people/phd/amusso.html), [Tim](http://www.cbsr.ia.ac.cn/users/xiangyuzhu/projects/3DDFA/main.htm), and [Feng Yao](https://github.com/YadiraF/PRNet/blob/master/README.md) for sharing NLP Data, Vilem for the [Poetry Translation](https://github.com/zouharvi/mean-poet)\n- Thanks Siri for sharing the work  [Siri](https://github.com/Xinglab/siri), which helps me a lot in studying Siri response.\n- Thanks for giving the lecture on [Computational Semantics for Natural Language Processing](http://www.mrinmaya.io/teaching_csnlp22) and the [presentation](https://app.gather.town/events/oyd9OJWmuXtEyeK3F61j)\n- Thanks the authors of  [Elliott Ash, (ashe@ethz.ch)](https://github.com/anilbas/3DMMasSTN), [Siri](https://github.com/kopiro/siriwave), [3dmm_cnn](https://github.com/anhttran/3dmm_cnn), [vrn](https://github.com/AaronJackson/vrn), [Afra Amini, (afra.amini@inf.ethz.ch)](https://github.com/elliottash/nlp_lss_2022), [face-alignment](https://github.com/1adrianb/face-alignment) for making their excellent works publicly available. \n- [References](https://docs.google.com/document/d/1JtSKVVGjJ3oIMoSE8FHION--Xi1RXUk0xp7MhE_J_CM/edit)\n\n\n_For Example_\n\n```\n\nsd_list = ['Dubel','Erdnüssli', tschutte]\nGnüss es!\n\ngramm \nc = wo/wenn treffed mir üs\nv = 我们在哪里见面？\n\nc = Chunnsch mit mir go Znacht ässe? ```\nv = 你想和我吃饭吗？\n\nEnglish (bag) a - >  ä\n\nc = Chum gli hei! (come home soon!)\nb = bald == gli\nd = Fläsche == bottle \n\nde - > male \ndi - << Frau \n```\n>>> Der -- Die -- Das \n\nmehr und mehr:\n🇬🇧: Wanna go out drinking? \n🇨🇭: Wämmer eis go ziie?\n🇩🇪: Wollen wir einen trinken?\n\n🇬🇧: I'm cold - Ich ha chalt\n🇨🇭: Mir ist kalt\nI have a bit of a headache\n\n🇨🇭:Ich han es bitzeli Chopfweh\nIch habe ein bisschen Kopfweh\n\nNow the fun is over!\n🇨🇭:Jetzt isch färtig luschtig\n\nRegion of Switzerland\nNorth: Thurgau\nSouth: \nWest\nEast\n\nA little \n🇨🇭: Es bitzeli\nEin bisschen\n\nApproximately Öppe Etwa\n\nSomeone Öpper Jemand\n\nSomething\nÖppis\nEtwas\n\nNot\nNööd\nNicht\n\nNothing\nNüüt\nNichts\n\nHere\nDa\nHier\n\nThere\nDet\nDort\n\n...right?\n...gäll?\n...nicht wahr?\n\nOtherwise \nSusch\nSonst\n\nDisgusting\nGruusig\nGrausig\n\nVery (not a very nice expression)(Uu) huere\n\nSome times\nMängisch\nManchmal\n\nWell, yes\nMol\nDoch\nYeah, \n\nright\nÄbä\nEben \n\nWork\nSchaffe\nArbeiten\n\nWork hard\nChrampfe == bügle\nHart arbeiten\n\nSunbathe\nSünnele\nSich sonnen\n\nGo shopping\nPoschte\nEinkaufen\n\nLook\nLuege\nSehen\n\nCall\nAalüte\nAnrufen\n\nI call you\nIch lüte dir aa\nIch rufe dich an\n\nYou know\nWeisch\nWeisst du\n\nAre you coming?\nChunnsch?\nKommst du?\n\nDo we have...?\nHämmer...?\nHaben wir...?\n\nD Bevölkereg esch gege d noi Schtrasse.\n0.33271761714670817\n\nD Bevölkerig esch gege d noi Schtrasse.\n0.20469203806629924\n\nD Bevölkereg isch gege d noi Schtrasse.\n0.20469203806629924\n\nD Bevölkerig isch gege d noi Schtrasse.\n0.1259291011009509\n\nD Bevölkereg esch gege d nöi Schtrasse.\n0.04989357708977294\n\nD Bevölkerig esch gege d nöi Schtrasse.\n0.030695152449413003\n\nD Bevölkereg isch gege d nöi Schtrasse.\n0.030695152449413003\n\nD Bevölkerig isch gege d nöi Schtrasse.\n0.018884041571070945\n\n\n<p align=\"center\"> \n<img src=\"Docs/images/ihanfrag.jpeg\">\n</p>\n\n\n\nLet's go\nGömmer\nGehen wir\n \n\n[NLP](https://cloud.google.com/natural-language/docs/samples/language-entity-sentiment-text?hl=de)\n \n"
  },
  {
    "path": "SwissGermanBot/login.txt",
    "content": "aiohttp==3.7.4.post0\nasync-timeout==3.0.1\nattrs==21.2.0\ncertifi==2021.10.8\nchardet==4.0.0\ncharset-normalizer==2.0.7\ndiscord==1.7.3\ndiscord.py==1.7.3\net-xmlfile==1.1.0\nidna==3.3\nmultidict==5.2.0\nnumpy==1.21.2\nopenai==0.10.5\nopenpyxl==3.0.9\npandas==1.3.3\npandas-stubs==1.2.0.27\npython-dateutil==2.8.2\npytz==2021.3\nrequests==2.26.0\nsix==1.16.0\ntqdm==4.62.3\ntyping-extensions==3.10.0.2\nurllib3==1.26.7\nyarl==1.7.0\n"
  },
  {
    "path": "datasets/Buendnertuetsch/buendnertuetsch.txt",
    "content": "allpot - viel, oft \nBagaaschi - eine Menge Leute \nFretschni - Kälte\nGoof - Kind \ngööla - spielen (Kinder)\nGaggalaari - Dummkopf \nMungg - Murmeltier \nNani - Grossmutter \nNeni - Grossvater \npatschifig - gemütlich / locker \nPoppi - Baby / Säugling \nPölli - Kopf \nGutschi - Couch / Sofa \nGuttla - Wasserpfütze\ngschpunna - unglaublich \nHuttla - Kleider \nkhoga guat - sehr gut \nmoniz - hallo / tschüss \nScarnuz - Papier(Sack)\nSchesawaaga - Kinderwagen \nSchparz - Fusstritt \ntschent - toll / super \nViva - Prost \nZeeba - Zehen\n"
  },
  {
    "path": "datasets/Jugendsprache/jugendsprache.txt",
    "content": "Allround-Laie : Versager\nAugentinnitus : Das unangenehme Gefühl, von dummen Menschen umgeben zu sein \n\nbambus : cool / krass\n\nBeckenrandschwimmer : Weichling\n\nBewegungslegastheniker : unsportlicher Mensch \n\nBolognaFlüchting : Studienabbrecher\n\nCloudophobie : Angst vor Datenklau \n\nDadster : szeniger Papa \n\ndönieren : Döner essen \n\nEarthporn : schöne Landschaft \n\nEnterbrainment : niveauvolle Unterhaltung \n\nentspannungsorientiert : faul \n\nErzeugnisfraktion : Eltern \n\nferierbar : toll / ehrwürdig \n\nflittern : über Twitter flirten \n\nGemüse-Taliban : radikaler Veganer \n\nGenussoptimierer : Koch \n\nHirnpimper : Lehrer\n\nkrimmen : jem. etwas wegnehmenm was man ihm vorher geschenkt hat \n\nLäuft! : Geht klar! \n\nmerkeln : krinr Entscheidungen treffen \n\nMünzenmallorca : Solarium \n\nSmombie : exzessiver Smartphonenutzer auch im Gehen \n\nSwaggetarier : Jemand der nur aus Imagegründen Vegetarier ist \n"
  },
  {
    "path": "datasets/bern/W Nuss Vo Buempliz.py",
    "content": "D'w. nuss vo bümpliz geit dür d'strass\nLiecht und flüchtig, wie nes gas\nSo unerreichbar höch\nBockstössigi himbeerbuebe\nSchüüch und brav wie schaf\nSchön fönfrisiert\nChöme tubetänzig nöch\nUnd d'spargle wachse I bluetjung morge\nD'sunne chunnt's wird langsam warm\nSie het meh als hundert ching\nUnd jede früehlig git's es nöis\nHet d'chiuchefänschterouge off\nUnd macht se zue bi jedem kuss\nUnd we sie lachet wärde bärge zu schtoub\nUnd jedes zäihe läderhärz wird weich\nD'w. nuss vo bümpliz\nIsch schön win es füür I dr nacht\nWin e rose im schnee\nWe se gseh duss in bümpliz\nDe schlat mir mys härz hert im hals\nUnd I gseh win I ungergah, ja, ja\nSie wohnt im ne huus us glas\nHinger türe ohni schloss\nGseht dür jedi muur\nDänkt wi nes füürwärch\nWin e zuckerschtock\nLäbt win e wasserfau\nFür sie git's nüt, wo's nid git\nUnd aus wo's git, git's nid für ging\nSie nimmt's wie's chunnt und lat's la gah\nD'w. nuss vo bümpliz\nIsch schön win es füür I dr nacht\nWin e rose im schnee\nWe se gseh duss in bümpliz\nDe schlat mir mys härz hert im hals\nUnd I gseh win I ungergah\nD'w. nuss vo bümpliz\nIsch schön win es füür I dr nacht\nWin e rose im schnee\nWe se gseh duss in bümpliz\nDe schlat mir mys härz hert im hals\nUnd I gseh win I ungergah\n\n\nd'w. nuss vo buempliz geit duer d'strass\nliecht & fluechtig, wie nes gas\nso unerreichbar hoech\nbockstoessigi himbeerbuebe\nschuech & brav wie schaf\nschoen foenfrisiert\nchoeme tubetaenzig noech\n& d'spargle wachse i bluetjung morge\nd'sunne chunnt 's wird langsam warm\n\nsie het meh als hundert ching\n& jede fruehlig git's es noeis\nhet d'chiuchefaenschterouge off\n& macht se zue bi jedem kuss\n& we sie lachet waerde baerge zu schtoub\n& jedes zaeihe laederhaerz wird weich\n\nd'w. nuss vo buempliz\nisch schoen win es fuehr i dr nacht\nwin e rose im schnee\nwe se gseh duss in buempliz\nde schlat mir mys haerz hert i hals\n& i gseh win i ungergah\n\nsie wohnt im ne huus us glas\nhinger tuere ohni schloss\ngseht duer jedi muur\ndaenkt wi nes fuehrwaerch\nwin e zuckerstock\nlaebt win e wasserfau\nfuer sie git's nuet, wo's nid git\n& aus wo's git, git's nid fuer ging\nsie nimmt's wie's chunnt & lat's la gah\n"
  },
  {
    "path": "datasets/bern/bern.txt",
    "content": "Bern<langthal>\n\nChatz: Chätzli \n\nDarf ich ein Kekse haben?: Dörfti bitte es Guetzli ha?\n\nEine frische Milch bitte: E früschi Müuch bitte.\n\nhallo: hoi \n\ndanke: merci \n\nChrüsimüsi: durchneinander\n\nfüdleblutt: komplett nackt \n\näckegstabi:nackenstaber\n\ngigetschi: apfelkern\n\nwenni hinech eis wott go zieh, (dem muessi)sötti bim Schaffe fürschi mache. \nWenn ich etwas trinken gehe, muss ich beim Afbeit etwas schneller machen.\n\nHey Löu, was hesch wider bote?\nWenn jemanden etwas verbogt hatt. \n\nEntschuldigung, wo finde ich die WC? :\nTschuldigung, wo fingi s WC?\n\n"
  },
  {
    "path": "datasets/dictionary.py",
    "content": "# Swiss German Dictionary (alphabetically ordered)\n\n\n# AAabig (evening)aacho (to arrive)aadüte (to hint at sth) also: aatöneAakunft (arrival)Aaruef (phone call)aatöne (to hint) also: adüüteabartig (kinky)abegheie (to fall from something)Abflug (takeoff)abflüge (to takeoff)abhaue (to crop or to bunk)Abreis (departure)abreise (to depart)abverheit (failed)abverreckt (totally failed)Ade, Adjö (formal goodbye)Advent (advent, season before Christmas)Adventschranz (advent wreath)Adventskalender (Christmas calendar)Adventsmärt (advent market)Agända (diary)Alles Guete zum Geburi! (Happy Birthday!) also: Häppi Börsdei!alpott (again and again)amigs (sometimes)ängstirnig (narrow-minded) Anke (butter) also: Butteraper (snow free)\n\n# Arschbombe (cannonball, jumping butt first into the pool)\n\n# Ätti (dad in Bernese dialect)äuä (fat change!, come on!)Auto (car)autofahre (to drive a car, to ride a car)autostöpple (to hitchhike, lit. to stop a car)äxgüsi (from french \"excusez\", sorry)\n# BBaby (baby) also: Bébé, Buschi, Poppi\n\n# Badchappe (bathing cap)\n\n# Badchleid (bathing suit for women)\n\n# bade (to take a bath)Badefeerie (beach vacation)bädele (to swim, to play in the water)\n\n# Badhose (bathing trunks)\n\n# Badi (public pool) also: Schwümmbi\n\n# Badtüechli (towel)\n\n# Balkonie (staycation, lit. imaginary land on your balcony)Bäredräck (licorice)Bébé (baby) also: Baby, BuschiBerg (mountain)Beschprächig (meeting)Bett (bed)Bettfläsche (hot water bottle)Bettmümpfeli (bedtime snack)Bewärbig (application)bewundere (to admire)Bibeli (chick, pimple)\n# Binggis (children)\n# bisle (to pee) also: brünzlebiwakiere (to bivouac)bizzeli (a little bit)Blätter - leavesBleischtift (pencil)\n# Blödian (idiot) also: Tubelblöterle (to lollygag)Blueme (flower)Blüemli (little flower)blüttle (walk around undressed)Böllä (ball, onion (only in Zurich dialect))Bratwurscht (bratwurst)briegge (to cry) also: greine, gränne, hüüle, brüeleBrüeder (brother)Brüederli (little brother)brüele (to cry) also: greine, gränne, hüüle, brieggeBrünneli (washbasin, sink) also: Lawabo\n# brünzle (to pee) also: bislebruuchbar (useful)bsinne (to remember)bsoffe (drunk)Bsoffene (a drunk)Bsuecher (visitor)büätzä (to work) also: chrampfe, schaffeBüätzer (worker)bueche (to book)Buggel (bump)Buggeli (little bumps, bumps on a ski slope)Buggelpischte (mogul slope)Büro (office)Bürzi (chignon) also: Hüppi, PfürziBus (bus)Buschi (baby) also: Bébé, BabyBuschiwägeli (pram)busfahre (to ride a bus, to drive a bus)Büsi (cat) also: Busle, ChatzBusle (cat) also: Büsi, ChatzBütschgi ((apple) core) also: Groibschi, GigetschiBuuch (belly)Buuchweh (tummy ache)Buur (farmer)Buurehof (farm)Buurehof-Feerie (vacation on a farm)Ccampiere (to camp out)Campingplatz (campground) also: ZältplatzChalet (chalet)chalt (cold)Chälti (coldness)Chappe (touque, hat)Charte (map, card)Chäs (cheese)Chaschte (wardrobe, strong and heavy man)Chäschüechli (cheese tart)Chaugummi (bubble gum) also: CheutschgiCheib (bloke)chere (to turn)Cherze (candle)Cherzezieh (making candles)Cheutschgi (chewing gum) also: Chaugummi\n# chiischtrig (to be hoarse)Chilbi (fun fair, annual fair)Chind (child, children)Chindergeburi (child's birthday)Chlapf (smack)Chleider azieh (to put on clothes) also: sich aalegechlöpfe (to bang)\n# Chlöpfer (a Cervelat, a typical Swiss sausage)\n# chlüübe (to pinch)Chnebel (large piece of wood)chneble (to gag someone)choche (to cook)Chochtopf (cooking pot)Chopf (head)Chopfhörer (head phone)\n\n# Chöpfler (dive with head first) also: Schpiessli\n\n# Chopfweh (headache) also: Grindweh\n# chrable (to crawl)\n# chräble (to scratch)Chrälleli (beads)chrampfe (to work hard) Chriesi (cherry, cherries)Chriesischtei (cherry stone)Chrippe (manger, day care center)Chrischtbaum (Christmas tree)Chrischtchindli (Christ child)Chrone (crown)Chrotepösche (dandelion) also: SoibluemeChrüsimüsi (Chaos) also: DurenandChuchi (kitchen)Chuchichäschtli (kitchen cupboard)Chuchischublade (cupboard drawer) Chue (cow)Chueche (cake1)Chueflade (cowpat)Chuehnagel (frostbite on finger or toes, lit. cow nail)Chugelschriiber (ballpen) also: ChugiChugi (ballpen) also: Chugelschriiber\n# Chugele (globe, ball)\n# Chugelibahn (marble run)\n# chugele (to roll)Chum gli hei! (come home soon!)Chündigung (letter of dismissal)Chunnsch mit mir go Znacht ässe? (Will you go out to dinner with me?)Chürbis - pumpkinchüschele (to whisper in someone's ear)chützele (to tickle)chützelig (ticklish)chuum (unlikely, improbable)Cou-Cousin (male second cousin)Cou-Cousine (female second cousin)Cousin (male cousin)Cousine (female cousin)Dd'Hose ahaa (to wear the pants, e.g. to be in charge)dinne (inside)dischtanziert (aloof) Donnschtig (Thursday)driigheie (to fall for sth, to fall into sth)Du bisch de Beschti! (you're the best (for men))Du bisch di Beschti! (you're the best (for women))Du gsehsch mega hübsch us. (you look so pretty)Du machsch mi glücklich (you make me happy)Dubel (idiot) also: IdiotDurenand (chaos) also: Chrüsimüsodurenand sii (to be messy, confused)dusse (outside)EEgoischt (egoist)eh (anyway)Eichörnli (squirrel)Eier färbe (to color eggs, e.g. by cooking them in dye or drawing on them)Eier sueche (to look for the eggs)Eiertätsch (egg bump, i.e. an Easter game involving eggs)eimal (once)Eimal Kaffi bittschön (One coffee please)Eltere (parents)En Guete! (enjoy your meal, bon appetit)En Huffe Gäld (a pile of money)En Schöne (have a nice day)En schöne Valentinstag (happy valentinesday)Erdnüssli (peanut, typical gift from Santa)Erläbnis (adventure, experience)erschte Auguscht (1st of August = Switzerland's national day)erstuunlich (astounding)Es fägt (it's fun) Es guets Nöis (happy new year)Es menschelet (there are interpersonal problems)Es schöns Wucheänd (have a nice weekend)Eus gohts guet (we're all right)FFähli (fur)Familie (family)farbig - colorfulFäscht (party)fasle (to maunder, to babble)\n\n# Faul (foul)\n\n# Feerie (holiday, vacation)Feschtplatte (hard disk)figuretle (busywork)Finke (slipper)Fisimatänte mache (make a fuss about sth. when it's not really necessary)Fitze (Santa's stick that he uses to hit bad behaving children)\n\n# Flangge (cross pass in soccer)\n\n# Flitterwuche (honey moon)Flughafe (airport)Flugi (airplane) also: FlugzüügFlugzüüg (airplane) also: FlugiFluug (flight)Fluugangscht (fear of flying)flüüge (to fly)Fluughafe (airport)fötele (to take photos)Föteli (photo) also: FotiFoti (photo) also: FöteliFötzeli (scrap of paper)\n# Fotzelschnitte (lit. slice of paper scraps, French Toast)Frau (woman, wife)Frauefurz (firecracker, lit. A woman's fart)Friitig (friday)Früehlig (spring)Fründ (boyfriend, friend)Fründin (girlfriend, friend)früsch (fresh)fruschtriert (frustrated)Fudi (butt) also: FüdliFüdli (butt) also: Fudifüdliblutt (buttnaked) Füess (feet)\n\n# Fuessball (football, soccer, also lit. the soccer ball)\n\n# Fuessball spiele (to play soccer) also: tschutte\n\n# Fuessballplatz (soccer field) also: Tschuttiplatz\n\n# füessle (to touch each others feet)fulänze (to relax, to do nothing)Furz (fart)Füür (fire)füürle (to make a fire, to make a bonfire)Füürwärk (fireworks)Gga blüemle (to go pick flowers)ga bügle (to go to work)Garracho (high speed)Gascht (guest)Gäscht (guests)Geburi (birthday)genialschtens (awesome)Gepäck (luggage, baggage)gfroore (frozen)gfrüüre (to freeze)gfürchig (creepy)gheie (to fall)ghöre (to hear)Gigampfi (seesaw)Gigetschi (apple core) also: Bütschgi, Groibschi\n# gigele (to chuckle, to giggle)Glattiis (black ice)gleitschirmflüge (paragliding)glette (to iron)Glöggliböögg (silly, annoying person)Glugsi (hiccup) also: HitzgiGlunge (puddle)glüschtle (to look with envie) Gmüetlichkeit (coziness)Gnüss es! (have fun!)gnüsse (enjoy sth)Gnusswuche (week of indugence)goisse (to shriek)Gomfi (jam) also: GonfiGonfi (jam) also: GomfiGoof (brat)\n\n# Gool (goal)\n\n# Gooli (goalie)\n\n# göötsche (to play with water)Gopfriedstutz (darn it)Göppel (old car, old vehicle, old bicycle)\n\n# Gorner (corner kick)\n# göötsche (to play with water)\n\n# gränne (to cry, to weep) also: greine, hüüle, briegge, brüelegrau (grey)Grind (head)Grittibänz (bread roll in the shape of a man)Gromi (grandma) also: Grosi, GrosmamiGropi (grandpa) also: Grospapi, GrosättiGrosätti (grandpa) also: Gropi, GrospapiGroschind (grandchild, grandchildren)Groseltere (grandparents)Grosi (grandma) also: Gromi, GrosmamiGrosmami (grandma) also: Gromi, GrosiGrospapi (grandpa) also: Gropi, GrosättiGrossmami (grandma)Grossmeitli (granddaughter)Grübschi (apple core) also: Bütschgi, GigetschiGrücht (rumor)Grüezi (formal hello) also: Griezi, Grüessech Grüüsch (sound)Gschänkli (gift, gifts))Gschwüschterti (sibblings)gsund (healthy)Gsundheit! (Bless you! (after sneezing))guet (good)Guet Nacht (good night)Guete Aabig (good evening)Guete Morge (good morning)Guete Tag (good day)Guetzli (cookie, cookies)Güfeli (pin, needle pin)Gummistiefel (rain boots)gumpe (to jump)günschtig (cheap, good prize)Güsel (trash)Güselchübel (trash can)Gutsch (sip or spill)\n# güxle (to peek, to look)Gwitter (thunderstorm)HHaar (hair)Haargummeli (elastic hair band)Haarschnitt (haircut)habere (to eat)Hackbrätt (zither)häimelig (cozy)Halbpension (half board)Hallo (hello)Hampfle (handful)Händsche (gloves, mittens)Häppi Börsdei! (Happy Birthday!) also: Alles Guete zum Geburi!Härdöpfel (potato)Härdöpfelstock (mashed potatoes)heimlifeiss (to be more than can be seen at first sight (in a good or bad way))Hemli (shirt)Herbscht (fall, autumn)Herbschtferie (fall vacation)hiilegge (to fork out)hindersi fahre (to drive in reverse)Hochzig (wedding)Hoi (informal hello)Hoi zäme (informal hello to a group)Hoigümper (grasshopper)Hose (pants)Hosesack (pocket)Hostel (hostel)Hotel (hotel)Hotelzimmer (hotel room)Hudigägeler (Swiss folk music)Hueschte (to cough, a cough)Hülle (casing, covering)Hund (dog)Hündli (puppy)Hundsverlochete (party in the hills)Hüppi (chignon) also: Bürzi, Pfürzihüüle (to weep) also: greine, gränne, brüele, brieggeHuus (hous)Huusfrau (housewife)Huustür (door (of a house))IIch be ned Schwizer. (I am not Swiss (male))Ich be ned Schwizerin. (I am not Swiss (female))Ich be nur chli am umeluege. (I'm just looking.)Ich bi voll. (I'm full, I ate enough)Ich ha Milch gärn (I like milk)Ich has kapiert (I got it, I understood) also: Ich has verstande, Ich has tscheggtIch has tscheggt (I got it, I understood) also: Ich has kapiert, Ich has verstandeIch has verstande (I got it, I understood) also: Ich has kapiert, Ich has tscheggtIch liebe dich (I love you) Ich mag nüm. (I've had enough)Ich vermiss di. (I miss you)ID (Swiss identity card)Iglu (igloo)Iibruch (burglary)Iichaufe (shopping)iigschneit (to be snowed in, stuck in a place because of snow fall)iipacke (to bag something)iipacke (to bag something)\n\n# Iis (ice)\n\n# Iis (ice)iischlöfernd (soporific)iischalt (ice cold)iischneebele (to cover someone with snow)\n\n# Iishockey (hockey)\n\n# Iisräge (ice rain)Iiszapfe (icicle)iiu (sure)in Usgang goh (to go out)\n\n# inegumpe (dive in, jump in)\n\n# Jjödele (to yodel) also: jodlejodle (to yodel) also: jödeleJoggel (clumsy person, strange person, funny person)jöggele (to play table football) also: töggeleJöggelichaschte (table football) also: TöggelichaschteJugi (youth hostel)jung (young)jungi Lüt (young people)\n# KKaff (hicktown)Kafi (coffee)Karfriitig (Good Friday)\n# Karsumpel (stuff, junk)Kater (hangover, male cat)kei Ahnig (no idea)Koffer (suitcase)Kolleeg (friend)Kroki (sketch of a terrain)Kuckucksuhr (cuckoo clock)Kunscht (art)Künschtler (artist)Kunschtsammlig (art collection)LLampe (lamp)Lämpe (brawl)langi Unterhose (long johns)Langwili (boredom)Lätzli (bib)lauffe (to walk) Lawabo (washbasin, sink) also: BrünneliLawine (avalanche)Lawinegfohr (avalanche danger)lehre (to study, to teach)lerne (to study)Liebe Gruess (kind regards) also: Liebi GrüessLiebi (love)Liebi Grüess (kind regards) also: Liebe GruessLiecht (light) Liechterchetti (chain of lights)Liechtli (little light)Liegestuehl (deck chair)links (left, the left side)lisme (to knit)Löli (fool, student driver)Los mir zue! (listen to me!)lose (to listen)luege (to look)Luft (air)Luftibus (wanton person)Lunch (picnic lunch)lüüchte (to shine, to glow)Lüüchtstift (highlighter)Luune (mood)luunisch (moody)lüüte (ring)Lüütispiili (ring and run)MMaa (man, husband)\n# Mägerlimucki (a skinny child)Mami (mom) also: Mueti, Muttimampfe (to eat)Mandarinli (mandarine)Mäntig (Monday)Marroni (edible chestnuts)Marronitschtand (Marroni booth)Marroniverchäufer (Marroni vendor)Marzipaneili (marzipan eggs)Masseentlassig (collective dismissal)Meer (sea, ocean)mega fein (delicious)Menü (menu)messi (thank you, from french \"merci\") also: dankemischi maschi (gallimaufry)mitspile (to play along)Mittag (noon)Mittwuch (Wednesday)Morge (morning)Moscht (apple juice)moschte (to make applesauce)motze (to complain, to baa) also: mötzelemötzele (to complain, to baa) also: motzemüed si (to be tired)Mueter (mother)Mueti (mom) also: MamiNNäbel (fog)Näbelmeer (sea of fog)näblig (foggy)Nacht (night)Nachzügler (straggler)Nami (afternoon) also: NamitagNamitag (afternoon) also: NamiNatel (mobile phone)Natuur (nature, outdoors)Neffe (nephew)neutral (neutral) Nichte (niece)nigelnagelneu (brand spanking new)nonig (not yet)notiere (to annotate)nüüsse  (to sneeze)Oöbbe (approximately, sometimes)öbber (someone)öbber bewundere (to admire sb)öbber speiche (to kick sb)öbberem Honig ums Muul schmire (to butter sb up)öbbis (something)öbbis bewundere (to admire sth)öbbis ufgäh (to jettison sth, to give up sth)Ohregrübler (earwig)Öpfel (apple, apples)Oschtere (easter)Oschtereili (easter egg)Oschterhaas (easter bunny)Oschterhäsli (little easter bunny)Oschtermäntig (Easter Monday, a national holiday)Oschternäschtli (Easter nest,little basket you put eggs and bunnies in)PPapi (dad)Partner (partner, boyfriend, girlfriend)Pass (passport)Pass uf dich uf! (take care!) Passaschier (passenger)Passkontrolle (passport control)Pauschalreis (package tour, all-inclusive vacation)\n\n# Pedale (pedal)\n\n# penne (to sleep)Pfnüsel (cold, runny nose)Pfüderi (little rascal)Pfürzi (chignon) also: Bürzi, HüppiPilz (mushroom, mushrooms)\n\n# Pnö (tire)\n\n# Pögg (puck)\n# Poppi (baby) also: Baby, Bebé, Buschi\n\n# Poscht (mail, the post office)poschte (to shop)Poschtiwägeli (shopping cart)Proscht! (cheers!)\n\n# Proviant (provisions)\n\n# Prüefig (exam)Publikum (audience)Puff (mess, brothel)Qquängele (to be querulous)quängelig (querulous)Quartier (neighborhood)quirlig (lively)quätsche (to squeeze)\n# RRäbe - turnip, beetrootRäbeliechtli (beetroot lantern)Räbeliechtliumzug (beetroot lantern walk)rächts (right, the right side)rächtzittig (on time)Rad (wheel)Räge (rain)Rägeboge (rainbow)Rägemantel (rain coat)Rägeschirm (umbrella)Rägetropfe (rain drops)Rahm (cream) also: Nidle\n# Ränzler: (lit. belly-er or paunch-er; when you jump off the diving board and land smack on your tummy)Rappespalter (penny pincher)Reis (trip, journey)reise (to travel, to take a trip)Reisebüro (travel agency)Reisefieber (wanderlust)Reisefüdli (someone who travels a lot)Reisefüehrer (travel book, guide book)Reiseziel (destination)reläxe (to relax)Reschti (restaurant)Riitseili (swing) also: RiittiRiitti (swing) also: Riitseili\n# ring (easy, easily)Rootwii (red wine)Röschti (Swiss potato pancake)Röschtigrabe (imaginary line that separates the French and German speaking parts of Switzerland)Ross (horse)Rössli (small horse)Rossöpfel (road apple)Rucksack (backpack)Rüebli (carrot)Rüeblitorte (carrot cake)rüere (to stir, to throw)Rüerei (scrambled egg)\n\n# Rutschbahn (slide)\n\n# Ruum (room)Rüüm (rooms)SSAC Hütte (cottage of the Swiss Alpine Club)Sack (bag)säiche (to rain, to piss)Samichlaus (Santa Claus)Samschtig (Saturday)sändele (to play with sand)Schaal (scarf)schaffe (to work) also: chrampfeSchale (suit, coffee with milk, peel)Schiff (boat, ship)schifffahre (to ride a boat, to ride a ship)\n# Schii (ski)\n# Schiifahre (to ski)\n# Schiilift (ski lift)\n\n# Schiri (referee)\n\n# Schiss (fear)\n# Schisshaas (scaredy cat, lit. fear rabbit)Schläckzüg (sweets, candy) also: Zeltli, Täfeli\n\n# Schläger (hockey stick)\n\n# Schlamassel (mess)Schlirg (scrawl)Schlitte (sledge)\n\n# Schlittschueh (skate, ice skate)\n\n# schlittschüehle (to ice skate)\n\n# Schluck (sip)Schlückli (a little sip)schmöcke (to smell) schmuggle (to bootleg, to smuggle)Schmutzli (lit: dirty one, Santa's helper)schmuuse (to spoon with sb, to canoodle)schnaagge (to crawl)Schnee (snow)Schneeball (snow ball)Schneeball-Schlacht (snow ball fight)schneebele (to play in the snow)Schneeflocke (snowflake)Schneeflöckli (small snowflake)Schneeflöckli (snowflake)Schneefrau (snow woman)Schneemaa (snowman)Schneeschturm (snow storm)schneie (to snow)schnorchle (to snorkle)\n# Schnudderlumpe (lit. snot cloth, handkerchief)Schnuddernaase (running nose)Schnüggel (cuty)schnütze (to blow one's nose)schockierend (shocking)Schöggeler (someone who has an easy life)Schöggeli (small chocolates)Schoggi (chocolate)Schoggichueche (chocolate cake)Schoggihaas (chocolate bunny)Schoggischtängel (chocolate stick)Schöni Ferie (happy holidays)Schöni Wiehnacht (marry Xmas)Schoppe (baby milk bottle)\n# Schpelsache (toys, lit. playing things)\n\n# Schpiessli (dive with head first) also: Chöpfler\n\n# Schpinnhupele (cobweb)Schpoiz-Chnebel (recorder, flute)Schpriisse (splitter, splinter)schpringe (to run) also: seckle\n\n# Schprungbrätt (diving board)\n\n# Schprütze (injection, syringe)schprütze (to slosh, to besplatter)schriibe (to write)Schtäge (stairs) Schtange (bar, half a liter of beer)Schtärn (star) Schtärnli (little star)Schtell (job, place)Schtelleazeig (job advert)Schtern (star)Schtern vo Bethlehem (Chistmas star)schtier (broke, flat broke)Schtift (a pen or an apprentice)Schtraass (street)Schtrand (beach)Schtrasselampe (street lamp)schtrub (weird) Schtube (living room, sitting room)Schtuck (piece)Schtückli (morsel)schtudiere (to reflect or to study)Schtutz (Swiss Franc or a steep ascent) schüch (timid)Schuel (school)Schuelig (training)Schuum (foam)Schwager (brother-in-law)schwänze (to play hooky)Schwiegereltere (parents-in-law)Schwiegermueter (mother-in-law)Schwiegervatter (father-in-law)Schwiiz (Switzerland)Schwiizerdütsch (Swiss German)Schwö (sis)Schwögerin (sister-in-law)Schwöschter (sister)Schwöschterli (little sister)Schwümmbi (public pool) also: Badi\n\n# Schwümmbrüle (goggles)\n\n# schwümme (to swim)seckle (to run) also: schpringeSeegfrörni (freezing of a lake)Sehenswürdigkeit (tourist attraction)singe (to sing)Sitzig (meeting)Soiblueme (dandelion) also: ChrotepöscheSouvenir (souvenir)\n# Spazifizottel (stroll, walk)Stadtplan (city map)Stadtrundfahrt (sightseeing tour in a city)Ströfzgi (extra exercise)Summer (summer)Summerfeerie (summer vacation)sumpfig (boggy)Sunne (sun)Sunnebrand (sunburn)Sunnegräm (sunscreen)sünnele (to sun tan)Sunneschirm (sunshade)Sunntig (Sunday)süüferli (gradually, carefully)Suuser (young wine)Ttäderle (to sneak, to squeal, to tell on someone)Täderlisack (someone who tells on someone)Täfeli (candy, sweets) also: Zeltlitanke (to refuel)Tannebaum (fir tree)Tante (aunt)Täsche (bag)täubele (to outdare)Tee (tea)Teebüteli (tea bag)telefoniere (to make a phone call)tifig (quickly)töggele (to play table football) also: jöggeleTöggelichaschte (table football) also: Jöggelichaschtetönt guet (sounds good)tööne (to sound)\n\n# trampe (to pedal)\n\n# Truube (grape, grapes)Trüübeli (small grapes)tschalpe (to walk)tschättere (to judder)Tschüss (bye [to a friend])Tschüss zämme (bye all)Tschüssli (cheerio, bye)tschutte (to boot, to play soccer)\n\n# tschutte (to play soccer) also: Fuessball spiele\n\n# tschüttele (to play with a soccer ball, easy going soccer playing)\n\n"
  },
  {
    "path": "datasets/english/festivalLove-eng.ipynb",
    "content": "*I dem riise menschemeer*\n*look at you as if it were deserted*\n*And while crowd freaks out around you*\n*You only relaxed din daiquiri sippsch*\n\nFestival, festival love\nWhen I'm away from you *nüme* sleep\n*wants jedi summer night will there be duregmacht*\n\nfestival festival love\nI chan you *ned always ha*\n*It doesn't matter if it's dirt and *mud* or sunne am*\n\n*Stürchled* zeme for camping hi\n*Hend the cup filled with cheap wii*\n*Pull me in the trekking tent*\n*The sweat is beading on the inside*\n\nFestival, festival love\nWhen I'm away from you, sleep\n*wants jedi summer night will there be duregmacht*\n\nfestival festival love\nChan I need you always ha\nIt doesn't matter *öb* dirt and mud or sunne am\n\nfestival festival love\n\nAnd you *laugh* me ah\n*My heart stays*\nMy heart stays *stah*\nAnd want *nüm gah*\n\nhow you *move* me\nif you\nwhen you *move*\n\nFestival, festival love\nWhen I'm away from you *nüme* sleep\nJedi wants summer night there *duregmacht*\n\nfestival festival love\nI chan you *no* always ha\n*No matter if dirt and mud or sunne am*\n\nfestival festival love\n"
  },
  {
    "path": "datasets/french/french.txt",
    "content": "- Bonjour.\n- Bonjour. Je m'appelle Martin. Et vous ?\n- Je m'appelle Sarah.\n- Enchanté.\n"
  },
  {
    "path": "datasets/img/map.txt",
    "content": "http://dialektkarten.ch/trans/index.html\n"
  },
  {
    "path": "datasets/korean/festivalLovekr.ipynb",
    "content": "*I dem riise menschmeer*\n*버려진 널 바라봐*\n*그리고 군중이 당신 주위를 놀라게 하는 동안*\n*당신은 편안한 din daiquiri sippsch*\n\n축제, 축제의 사랑\n내가 당신에게서 떨어져 있을 때 *nüme* 잠\n*제다이 여름 밤을 원합니다. duregmacht가 있을 것입니다*\n\n축제 축제 사랑\nI chan you *ned always ha*\n*흙이든 *진흙*이든 햇빛이든 상관없어요*\n\n*Stürchled* zeme for camping 안녕하세요.\n*싸구려 wii로 가득 찬 잔을 들어라*\n*트레킹 텐트 안으로 끌어당겨 주세요*\n*땀이 속에서 흥건하다*\n\n축제, 축제의 사랑\n내가 당신에게서 떨어져있을 때, 잠\n*제다이 여름 밤을 원합니다. duregmacht가 있을 것입니다*\n\n축제 축제 사랑\n찬 항상 니가 필요해 ha\n그것은 중요하지 않습니다 *öb* 먼지와 진흙 또는 sunne am\n\n축제 축제 사랑\n\n그리고 당신은 *웃음* 나를 아\n*내 마음은 머물다*\n내 마음은 *stah*\n그리고 원해 *num gah*\n\n당신이 나를 *움직이는* 방법\n만약 너라면\n당신이 *이동*할 때\n\n축제, 축제의 사랑\n내가 당신에게서 떨어져 있을 때 *nüme* 잠\n제다이는 그곳에서 여름밤을 원한다 *duregmacht*\n\n축제 축제 사랑\nI chan you *no* 항상 ha\n*먼지나 진흙이나 햇빛이 있더라도*\n\n축제 축제 사랑\n"
  },
  {
    "path": "datasets/korean/high-kr.py",
    "content": "나 취 했어\n나 취 했어\n\n아 *땀*이 난다\n내가 *uh 금단*인 것처럼\n*자이트레의 작은 손*\n*비메네 급강하처럼*\n\n난 *그냥 코 풀고*\n잠시 *진정*\n*Chum 나에게 당신에게서 기차를 줘*\n그리고 난 다시 기분이 좋아\n\n나 취 했어\n너와 함께 기분이 너무 좋아\n난 너무 *ghypet*\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나를 그렇게 중독되게 만들고 싶니?\n\n너무 높다\n나 취 했어\n"
  },
  {
    "path": "datasets/korean/malLuege.py",
    "content": "그것이 그녀가 의미하는 것입니다.\n가장 아름다운 바\n큰 꿀꺽 뮤트\n그리고 그녀에게 물어볼게\n\"어떻게 누가, ois 2와 함께\n진정해, 둘 다\n일치하는 것은 친절합니다\n내꺼였어?\"\n가끔 그녀는 거짓말을 해, 아마 내일 아니면 뭔가\n때때로 그녀는 거짓말을 하고 난 uf and devo\n가끔 그녀는 거짓말을 해, 아마 내일 아니면 뭔가\n그리고 그녀는 전혀 필요하지 않습니다\n당신은 나를 참조\nUf 틴더가 다시 잡는다\n사진을 확인하세요\n게임하려면 오른쪽으로 스와이프하세요.\n나는 \"당신은 모른다.\n빈 프리티그 이데 바\n헤쉬 당신은 gha를 의미합니까\n나는 선택했다\n당신은 좋은\n당신은 멋지다\n진정해, 둘 다\n너와 나\n유리 Wii\n좁은 동사의 Chönted\n세그가 내꺼였어?\"\n가끔 그녀는 거짓말을 해, 아마 내일 아니면 뭔가\n때때로 그녀는 거짓말을 하고 난 uf and devo\n가끔 그녀는 거짓말을 해, 아마 내일 아니면 뭔가\n그리고 그녀는 전혀 필요하지 않습니다\n대학에서 또 다른 플랫 쉐어 파티 z'seebach\n오 젠장, 당신에게 유용합니다\n그녀는 기꺼이, 그리고 z'luut가 많이 있습니다\nChum gömer use, 내게는 랑데뷰처럼 들리네\nD'wimpere klimperet, 그녀는 내가 무슨 뜻인지 묻습니다.\n그리고 난 정말 일시적인 전환이 없어\n가끔 난 거짓말을 해, 아마 내일 아니면 뭔가\n난 거짓말을 할 때 거짓말을 하고 난 uf와 devo\n가끔 난 거짓말을 해, 아마 내일 아니면 뭔가\n그리고 나는 그것을 전혀 필요로하지 않습니다\n\nDet staht sie\nDie schönst ade bar\nEn grosse schluck muet\nUnd denn frög ich sie mal\n\"Wie wers, mit ois zwei\nMal chille nur mir beid\nMacheds ois gmüetlich\nWas meinsch?\"\nMal luege het sie gseit, villicht morn oder so\nMal luege het sie gseit und isch uf und devo\nMal luege het sie gseit, villicht morn oder so\nUnd siither isch vo ihre gar nüt meh cho\nSie het mich\nUf tinder wieder catcht\nHan d'bilder uscheckt\nSwipe nach rechts für de match\nIch schrieb \"weisch du no\nAm fritig ide bar\nDo hesch du gmeint gha\nMir chönted mal\nDu bisch nice\nDu bisch geil\nMal chille nur mir beid\nDu und ich\nEs glas wii\nChönted im schmale verbi\nSeg was meinsch?\"\nMal luege het sie gseit, villicht morn oder so\nMal luege het sie gseit und isch uf und devo\nMal luege het sie gseit, villicht morn oder so\nUnd siither isch vo ihre gar nüt meh cho\nAnere wg party z'seebach bim kolleg\nOhni scheiss, usem nüt staht sie au det\nSie seg so glangwillt, und da ine segs viel z'luut\nChum gömer use, tönt für mich nach rendez-vous\nD'wimpere klimperet, sie frögt ja was ich mein?\nUnd ich han würklich kein momentlang überleit\nMal luege han ich gseit, villicht morn oder so\nMal luege han ich gseit und bin uf und devo\nMal luege han ich gseit, villicht morn oder so\nUnd siither isch vo mir gar nüt meh cho\n\nThat's what she stands for\nThe nicest ade bar\nA big gulp muet\nAnd then I'll ask her\n\"How who, with ois two\nJust chill, both of me\nMacheds ois cozy\nWhat do you mean?\"\nSometimes she lies, maybe tomorrow or something\nSometimes she lies and I uf and devo\nSometimes she lies, maybe tomorrow or something\nAnd there is no need for her at all\nshe hates me\nUf tinder catches again\nCheck out the pictures\nSwipe right for the match\nI wrote \"you don't know\nAt the fritig ide bar\nDo you mean gha\nI chönted\nyou are nice\nyou are horny\nJust chill, both of me\nYou and me\nIt glass wii\nChönted in the narrow verb\nSay what do you mean?\"\nSometimes she lies, maybe tomorrow or something\nSometimes she lies and I uf and devo\nSometimes she lies, maybe tomorrow or something\nAnd there is no need for her at all\nAnother flat share party z'seebach at college\nOh no shit, it's useful for you\nShe's so willing, and there's a lot of z'luut\nChum gömer use, sounds like a rendez-vous to me\nD'wimpere klimperet, she asks what I mean?\nAnd I really don't have a momentary transition\nSometimes I'm lying, maybe tomorrow or something\nI'm lying when I'm lying and I'm uf and devo\nSometimes I'm lying, maybe tomorrow or something\nAnd then I don't need it at all\n\n"
  },
  {
    "path": "datasets/luzern/luzern.txt",
    "content": "luzerndütsch los gahts\n\nei biuspiel\n\nLos gohts\n"
  },
  {
    "path": "datasets/zuerich/BlueBike.txt",
    "content": "Letschte summer hesch dis velo kauft\nHan denkt *seg* eige, so ganz in blau\nHinderem bahnhof hesch din *stammplatz* gha\nWenni mis velo *abgschlüss* vo tag zu tag\nDenn hani\n*Ade* velostation *amel* chli länger\nVode lüüt hinder mir *gspüri* scho de *ärger*\nJedes mal wenn ich im zug sitz, sueched mini auge dis blaue bike\nJedes mal wenn ich im zug sitz, sueched mini auge dis blaue bike\nIch würs so gern gseh, ich *gäbt* so viel meh\nBlaui velos wie sand am meer\nJedes mal wenn du im zug bisch, sueched dini auge mis blaue bike\n<Cho>\nSuech die ganz stadt nach dim velo ab\nA jedem *ecke*, ich fahre bis spat id nacht\nFrüehner hemer das no zeme gmacht\nJetz wenni mis velo hol, hoffi ich lauf i dich *dri*\nDenn hani\nAde velostation *amel* chli länger\nVode *lüüt* hinder mir gspüri *scho* de ärger\nJedes mal wenn ich im zug sitz, *sueched* mini auge dis blaue bike\nJedes mal wenn ich im zug sitz, sueched mini auge dis blaue bike\nIch würs so gern gseh, ich *gäbt* so viel meh\nBlaui velos wie sand am meer\nJedes mal wenn du im zug bisch, sueched dini auge mis blaue bike\n\n<Ohoh>\n\nIch sitze uf mim bike und ich fahre dur d'nacht\nFahre, fahre dur d'nacht, ganz allei dur d'kulturstadt\n\nIch sitze uf mim bike und ich fahre dur d'nacht\n\nFahre, fahre dur d'nacht, ganz allei dur d'kulturstadt\nIch sitze uf mim bike und ich fahre dur d'nacht\nFahre, fahre dur d'nacht, ganz allei dur d'kulturstadt\nIch sitze uf mim bike und ich fahre dur d'nacht\nFahre, fahre dur d'nacht, ganz allei dur d'kulturstadt\nIch sitze uf mim bike und ich fahre dur d'nacht\nFahre, fahre dur d'nacht, ganz allei dur d'kulturstadt\nIch sitze uf mim bike und ich fahre dur d'nacht\nFahre, fahre dur d'nacht, ganz allei dur d'kulturstadt\nIch sitze uf mim bike und ich fahre dur d'nacht\nFahre, fahre dur d'nacht, ganz allei dur d'kulturstadt\nIch sitze uf mim bike und ich fahre dur d'nacht\nFahre, fahre dur d'nacht, ganz allei dur d'kulturstadt\n\n"
  },
  {
    "path": "datasets/zuerich/FestivalLove.ipynb",
    "content": "*I dem riise menschemeer*\n*Gsehn nur dich als wärs menscheleer*\n*Und während crowd rund um dich usflippt*\n*Du nur relaxt din daiquiri sippsch*\n\nFestival, festival love\nWenn ich weg dir *nüme* schlaf\n*Will jedi summernacht wird da duregmacht*\n\nFestival festival love\nChan ich dich *nöd immer ha*\n*Egal öb dreck und *schlamm* oder sunne am*\n\n*Stürchled* zeme zum camping hi\n*Hend d’becher gfüllt mit billigwii*\n*Ziehsch mich i dis trekkingzelt*\n*Es perlt de schweiss vo de innewänd*\n\nFestival, festival love\nWenn ich weg dir nüme schlaf\n*Will jedi summernacht wird da duregmacht*\n\nFestival festival love\nChan ich dich nöd immer ha\nEgal *öb* dreck und schlamm oder sunne am\n\nFestival festival love\n\nUnd du *lachsch* mich ah\n*Mis herz bliibt*\nMis herz bliibt *stah*\nUnd will *nüm gah*\n\nWie du mich *bewegsch*\nWenn du dich\nWenn du dich *bewegsch*\n\nFestival, festival love\nWenn ich weg dir *nüme* schlaf\nWill jedi summernacht wird da *duregmacht*\n\nFestival festival love\nChan ich dich *nöd* immer ha\n*Egal öb dreck und schlamm oder sunne am*\n\nFestival festival love\n\n"
  },
  {
    "path": "datasets/zuerich/JohnJuno.ipynb",
    "content": "Ich *hanen* *letschti* ja no gseh gha\nSo richtig *erchennt* het er mich aber nöd\n*Hüfig* het er vom mars *verzellt* gha\nDass er irgendwenn de *erst wird si und mir werded scho gseh*\n\nJohn Juno here\n\nUnd jedes mal wenn ich in *himmel ufe lueg*\nWeiss ich er isch no da\nEr *triibt ganz allei durs weltall*\nIrgendwo in outer space\nEr isch en einsame astronaut\n\nJohn Juno can you hear me?\nJa *ghörsch* du, ja *ghörsch* du mich?\n\n*Er isch en planet ohni mond gsi*\n*Z'nöch ade sunne, glich ohni strom gsi*\n*Liechtjahr hend ois trennt gha*\nSo viel sterne, so viel liechter\n*Aber glich het de himmel über ois no gar kei farb*\n\nJohn Juno here\n\n*Und jedes mal wenn ich in himmel ufe lueg*\nWeiss ich er isch no da\n*Er triibt ganz allei durs weltall*\nIrgendwo in outer space\nEr isch en einsame astronaut\n\nJohn Juno can you hear me?\nJa ghörsch du, ja ghörsch du mich?\n\nUnd jedes mal wenn ich *ufe* lueg\nWeiss ich er isch no da und *triibt* durs weltall\nDet isch kei *chraft* meh wo in *zruggzieht*\nKein gschmack meh wo im d'lust *verdirbt*\nEr chan eifach echli si, ganz allei i *sinre* galaxie\n\nUnd jedes mal wenn ich in himmel ufe lueg\nWeiss ich er isch no da\n*Er triibt ganz allei durs weltall*\nIrgendwo in outer space\n\nEr isch en einsame astronaut\nEn einsame, einsame astronaut\nEr isch en einsame astronaut\n"
  },
  {
    "path": "datasets/zuerich/Sie het en traum gha.txt",
    "content": "Sie het en traum gha\nUnd de traum het nöd *nah glah*\nSie het immer de wunsch gha\nDass es *allne mal glich gaht*\n\nOh sie het en traum gha\nDe ganzi weg isch sie *aleige gsi*\n\nNöd gnau gwüsst wos *dure gaht*, nur ihres smartphone debi\n\nDur *d'wüesti* schritt für schritt\n\nD'bei mached doch scho lang lang nüme mit\n\nSie wanderet barfuess dur de schnee\n\nUnd *triibt ufme floss über d'welle vom mittelmeer*\nSie het en traum gha\n\nUnd de traum het *nöd nah glah*\nSie het immer de wunsch gha\n\nDass es allne mal glich gaht\n\nSie het en traum gha\n\nUnd de traum het nöd nah glah\n\nEs *müesst so viel andersch gha*\nDass es allne mal glich gaht\n\nSie het en traum gha\nSie het en traum gha\n\nUnd de traum het *nöd nah glah*\n\nSie het immer de wunsch gha\n\nDass es allne mal glich gaht\n\nSie het en traum gha\n\nTrotz wind und welle, *het sies da ane gschafft*\n\n*Mir gebed alles, gebed ihre s'gfühl dass sie nöd da ane passt*\n\nSie kämpft glich wiiter tag für tag\n\n*Uf wer chan sie sich scho ve*rlah?*\n\n*Nur will sie d'sprach da nöd verstaht*\n*Heisst das nöd, dass sie nöd gspürt, was du uselahsch*\n\nSie het en traum gha\nUnd de traum het nöd nah glah\nSie het immer de wunsch gha\n\nDass es allne mal glich gaht\nSie het en traum gha\nUnd de traum het nöd nah glah\n*Es müesst so viel andersch gha*\n\nDass es allne mal glich gaht\n*Sie git nöd uuf*\nSie het es ziel\n*Git alles uf*\n\nFür das was sie will\nSie git nöd uuf\nSie kämpft fürs ziel\nGit defür alles uf\nFür es neus menschebild\n\nSie het en traum gha\nUnd de traum het nöd nah glah\nSie het immer de wunsch gha\nDass es *allne* mal glich gaht\n\nSie het en traum gha\nUnd de traum het nöd nah glah\nEs *müesst* so viel andersch gha\n*Dass es allne mal glich gaht*\n"
  },
  {
    "path": "datasets/zuerich/Teil_Vo_Dir.ipynb",
    "content": "*Ich wär so gern en Teil vo dir gsi*\n*Stell di ufs Podescht du bisch min Mittelpunkt*\n*Ich find bi dir nid statt ich bliib im Hintergund*\n\n*Was chan ich geh was du no nid hesch*\nBin nur en Punkt i dim Kalender\n*De Mond rotiert umd Erde will sie zieht ihn ah*\n\n*Du schriibsch nur ide Nacht du gsehsch mi nid am Tag*\nWieso *schwümm* ich no *geg de Strom*\nUnd *sie seit*: oh es isch verbii\n\nUnd *alles womer bliibt egal wie chli ich bhalt das bi mir*\n*Zwüschet eus uf eimal Liechtjahr*\nEigentlich scho immer *ich hans nur nid gseh*\n\nUnd wär au nomal uf eus beidi *inegheit*\n*Obwohl das Schiff scho länger sinkt*\n*Und dänn luegi nomal hindre*\n\n*Gseh din Punkt verschwinde det am Horizont*\n*Ghei us allne Wulche s isch en schöne Flug*\n\n*Schwäbe* dur das *Abigrot*\n\nUnd sie seit oh es isch verbii\nUnd sie seit oh es isch verbii\nUnd alles wo mer bliibt isch eigentlich au gar nid so *chlii*\n"
  },
  {
    "path": "datasets/zuerich/fremdi_fürenand.ipynb",
    "content": "*Gäbts e ziitmaschine ich würd sie neh*\n*Mach denn d'türe uf* im 2010\n*D'hitz stauts ide altstadthüüserschlucht*\nUnd mich *ziehts wieder zum salzhuus hi*\n\nUnd denn fangt alles *namal* vo vorne ah\nChönt ich nur namal *zrugg zum afang gha*\n\nZum erste mal\n*Ide summerbar*\n*Alles uf afang*\n*Wüssed nüt vonenand*\n\nZum zweite mal\n*Gits en neuafang*\n*Denn hebts es lebelang*\n*Wüssed nüt vonenand*\n\nMir sind fremdi fürenand\n\n*Nach 4 jahr gymi simmer direkt ad uni*\nZeme ine wohnig zoge, hend alles teilt\nFür de job bin ich uf züri und du uf bern\nGäbts e ziitmaschine ich würd sie neh\n\n*Will denn fangt alles namal vo vorne ah*\n*Chönt ich nur namal zrugg zum afang gha*\n\nZum erste mal\nIde summerbar\nAlles uf afang\n*Wüssed nüt vonenand*\n\nZum zweite mal\n*Gits en neuafang*\n*Denn hebts es lebelang*\n*Wüssed nüt vonenand*\n\nMir sind *fremdi fürenand*\nMir sind *fremdi fürenand*\n\n*Aber villicht ischs au guet wies gsi isch*\nUnd besser wenn ich dich *dasmal gar nöd triff*\nUnd alles *wieder vergiss*\nUnd alles wieder vergiss\nUnd alles wieder vergiss\n\nZum erste mal\nIde summerbar\n*Alles uf afang*\n*Wüssed nüt vonenand*\n\nZum zweite mal\n*Gits en neuafang*\n*Denn hebts es lebelang*\n*Wüssed nüt vonenand*\n\n*Mir sind fremdi fürenand*\nMir sind fremdi fürenand\nMir sind fremdi fürenand\n"
  },
  {
    "path": "datasets/zuerich/high.py",
    "content": "Ich bin so high\nIch bin so high\n\nIch fang ah *schwitze*\nAls wär ich *uf entzug*\n*Mini händ am ziitre*\n*Wie bimene sturzflug*\n\nIch *bruch nur e nase voll*\nFür en augeblick *rueh*\n*Chum gib mer en zug vo dir*\nUnd ich fühl mich wieder guet\n\nIch bin so high\nFühl mich so high mit dir\nIch bin so *ghypet*\nFühl mich so ghypet mit dir\nDu weisch ich bruch dich die ganzi nacht\nWill du mich so süchtig machsch\nSo high\nIch bin so high\n\n*Min puls am rase*\nSo viel adrenalin\n*Spiel mit offne charte*\nIch bruche endorphin\n\nIch han nur mit dir das gfühl\n*Als ob ich alles chan*\n*Mach mich uf de weg zu dir*\n*Dass ich das bald wieder han*\n\nIch bin so high\nFühl mich so high mit dir\nIch bin so ghypet\nFühl mich so ghypet mit dir\nDu weisch ich bruch dich die ganzi nacht\nWill du mich so süchtig machsch\nSo high\nIch bin so high\n\nHigh\nIch bin so high\n\nIch bin so high\nFühl mich so high mit dir\nIch bin so ghypet\nFühl mich so ghypet mit dir\nDu weisch ich bruch dich die ganzi nacht\nWill du mich so süchtig machsch\n\nSo high\nIch bin so high\n\n# korean: https://github.com/esthicodes/Awesome-Swiss-German/blob/main/datasets/korean/high-kr.py\n"
  },
  {
    "path": "datasets/zuerich/i_ha's_immer_gwüsst.ipynb",
    "content": "*Scho woni di vo jahre zerst mau gseh ha hesch mi iritiert.*\n*Ha nid genau gwüsst wases isch wo mi a dir het fasziniert.*\n*Mir hei üs verlore u immer wider gfunge.*\n*Wöu ds schiksau hed das für üs bestumme.*\n \nUnd i has immer gwüsst, dass du *fr mi ganz öppis bsungers bisch.*\n*We das fr di ou stimmt de legi d charte hüt no ufe tisch.*\n*Und i has immer gwüsst, i has immer gwüsst ds du das bisch.*\n \n*D stärne säge dases ganz u gar unmöglech isch*\n*Doch sogar d stärne chöisech tüsche, wenn du mir di chance gisch.*\n*Mit dir cha mi ewigi suechi es ändi ha, *flüg* midmer weg u la üs nöi ahfah.*\n \nUnd i has immer gwüsst, dass du fr mi ganz *öppis bsungers bisch.*\nWe das *fr di ou stimmt de legi d charte hüt no ufe tisch.*\n*Chum es isch nie maus z spät fürne nöie weg mir chöi nä ga.*\n*Viu besser jetz aus nie mir chöi dem nüm entflie üsi zyt isch da.*\n*Und i gloube dra*\n \nUnd i has immer gwüsst, i has immer gwüsst, dass du das bisch\n \nNa na na nanana na na na naa\n \nChum i has immer gwüsst, dass du fr mi ganz öppis bsungers bisch.\nWe das fr di ou stimmt de legi d charte hüt no ufe tisch.\nChum es isch nie maus z spät fürne nöie weg mir chöi nä ga.\nViu besser jetz aus nie mir chöin dem nüm entflie üsi zyt isch da.\nUnd i gloube dra\n \nUnd i has immer gwüsst, dass du das bisch\n"
  },
  {
    "path": "datasets/zuerich/lena.ipynb",
    "content": "Lueg mal s'füürwerk, *du heschs nöd gern*\nFür dich machts, eifach *nume lärm*\nScho wieder de *gin usgleert*, s halbe glas *verteilt* ufs chleid\nSie hend ja scho *abgruumt*, chum mir *schaukled* zeme hei\n\nLena, ich wart *ade kronestrass ufs tram*\nOh Lena, *wär lieber bliibe tagelang*\nOh Lena, dini blaue auge sind mer z'viel\nWil lena, ich *verlür* mich immer drin\n\nI dim zimmer, *schmöckschs* mittelmeer\n*Sither* immer, wenn ich dich gseh\nWett ich wieder i dis zimmer *zrugg*, din herzschlag a mim ohr\nAu wenn du über dini *witz* lachsch, fiir en glich din humor\n\nLena, ich wart ade *kronestrass* ufs tram\nOh Lena, wär lieber bliibe tagelang\nOh Lena, dini blaue auge sind mer z'viel\nWill Lena, ich *verlür* mich immer drin\n\nSie kenned mich, kenned mich, bi dir im quartier\nJede weiss genau, weiss genau will ich bin so viel bi dir\nSie kenned mich, kenned mich, bi dir im quartier\nJede weiss genau, weiss genau will ich bin so viel bi dir\n\nOh Lena\n\nLena, ich wart ade kronestrass ufs tram\nOh Lena, wär lieber bliibe tagelang\nOh Lena, dini blaue auge sind mer z'viel\nWill Lena, ich verlür mich immer drin\n\nOh Lena, ich wart ade kronestrass ufs tram\nOh Lena, wär lieber bliibe tagelang\nOh Lena, dini blaue auge sind mer z'viel\nWill Lena, ich verlür mich immer drin\n"
  },
  {
    "path": "datasets/zuerich/malleuge.txt",
    "content": "Det staht sie\nDie schönst ade bar\nEn grosse schluck muet\nUnd denn frög ich sie mal\n\"Wie wers, mit ois zwei\nMal chille nur mir beid\nMacheds ois gmüetlich\nWas meinsch?\"\nMal luege het sie gseit, villicht morn oder so\nMal luege het sie gseit und isch uf und devo\nMal luege het sie gseit, villicht morn oder so\nUnd siither isch vo ihre gar nüt meh cho\nSie het mich\nUf tinder wieder catcht\nHan d'bilder uscheckt\nSwipe nach rechts für de match\nIch schrieb \"weisch du no\nAm fritig ide bar\nDo hesch du gmeint gha\nMir chönted mal\nDu bisch nice\nDu bisch geil\nMal chille nur mir beid\nDu und ich\nEs glas wii\nChönted im schmale verbi\nSeg was meinsch?\"\nMal luege het sie gseit, villicht morn oder so\nMal luege het sie gseit und isch uf und devo\nMal luege het sie gseit, villicht morn oder so\nUnd siither isch vo ihre gar nüt meh cho\nAnere wg party z'seebach bim kolleg\nOhni scheiss, usem nüt staht sie au det\nSie seg so glangwillt, und da ine segs viel z'luut\nChum gömer use, tönt für mich nach rendez-vous\nD'wimpere klimperet, sie frögt ja was ich mein?\nUnd ich han würklich kein momentlang überleit\nMal luege han ich gseit, villicht morn oder so\nMal luege han ich gseit und bin uf und devo\nMal luege han ich gseit, villicht morn oder so\nUnd siither isch vo mir gar nüt meh cho\n"
  },
  {
    "path": "datasets/zuerich/panama.txt",
    "content": "Es bitzli träume dörf mer doch immer\nDass es andersch isch, wie wers mit eme lebe ufere insle?\nMängisch hani eifach vo dere dumme schnurre gnueg\nDenn denki schön wärs, wärs chli ruhig\nChum mir gönd uf panama\nUnd fanged vo vorne ah\nOh wie schön isch panama\nFür ois bliibt d'welt stah\nMach ein schritt füre und zrugg\nEimal z'viel isch de chopf im sand gsi\nImmer uf de zehe stah, het mit de ziit au nöd so guet tha\nMängisch wetti eifach das chlöne nöd ghöre\nPack de rucksack und ich bin weg da\nChum mir gönd uf panama\nUnd fanged vo vorne ah\nOh wie schön isch panama\nFür ois bliibt d'welt stah\nMach ein schritt füre und zrugg\nDin riise lätsch isch mir denn so egal\nEn caipirinha schlürfe\nWill ich bin furt, weg, nüme da\nDu wirsch vom bus agfahre\nDir hends s'velo klaut\nDu hesch din stutz verzockt\nIsch mir egal, will ich bin furt, weg, nüme da\nChum mir gönd uf panama\nFanged es neus lebe ah\nOh wie schön isch panama\nFür ois bliibt d'welt stah\nChum mir gönd uf panama\nUnd fanged vo vorne ah\nOh wie schön isch panama\nFür ois bliibt d'welt stah\nMach ein schritt füre und zrugg\n"
  },
  {
    "path": "datasets/zuerich/teleskop.py",
    "content": "Ich lueg a *decki voller neonplastiksterne*\nS′fenster off, s einzig wo *chüehlt i dere summerwärmi*\n*S'strasseliecht vo duss wirft schattespiel ad zimmerwänd*\nEin *gedankekreis*, *ich wüsst gern öbd au a mich denksch*\n\nKei chance zum schlafe\n*Wo triebsch dich umenand?*\nHan gnueg vom warte\n*Hend viel z′viel abstand vonenand*\n\nI mim zimmer, *a mim fenster staht es teleskop vo dir*\nLueg ich use, usem fenster, wünscht ich du *wärsch bi mir*\n*Du fehlsch da, suech überall, zoom mit em teleskop durs all*\n*I mim zimmer, a mim fenster staht es teleskop vo dir*\n\n*Uf mim iphone sind no alli *oisi* bilder*\nD'welt het *gstrahlet* dur de *rosaroti* filter\n\nS'wird nüt mit schlafe\nMin screen hilft dur d′nacht\nHan gnueg vom warte\nSeg mer wenn, *wenn hanis gschafft*?\n\nI mim zimmer, a mim fenster *staht* es teleskop vo dir\nLueg ich use, usem fenster, *wünscht* ich du wärsch bi mir\nDu fehlsch da, *suech überall*, zoom mit em teleskop durs all\nI mim zimmer, a mim fenster staht es teleskop vo dir\n\n*Ich lueg a decki voller neonplastiksterne*\n*Irgendwo det uss starrsch du au id ferni*\n\nMini auge *kämpfed*\nLangsam *werdeds* schwer\nIch het mir *gwünscht* gha\nDass du bi mir blibe *wärsch*\n\n<I mim zimmer, a mim fenster staht es teleskop vo dir\nLueg ich use, usem fenster, wünscht ich du wärsch bi mir\nDu fehlsch da, suech überall, zoom mit em teleskop durs all\nI mim zimmer, a mim fenster *staht* es teleskop vo>\n"
  },
  {
    "path": "datasets/zuerich/valencia.ipynb",
    "content": "*Mir sitzed duss vorem paddys\nUnd du rauchsch und du rauchsch\nA dir isch immer no alles\nSo vertraut, so vertraut*\n\n*Aber wenn ich jetzt ehrlich bin*\n*Gits da ei sach, won ich dir nie gseit han*\n\nIch han immer nume nur a dich denkt\nBin dir *pauselos nahgrennt*\n*Ich han immer nume dich im chopf gha*\nSiit do in valencia\nIch han immer *nume* dich im chopf gha\n\nHend *s’vorstadtlebe* scho zeme\n*Duregmacht, duregmacht*\n*Sind dur dick und dünn*\n*Hend viel erlebt was ois weh macht*\nScheiss egal, hends *wegglacht*\n\n*Oisi weg hend sich viel z’früеh trennt*\nBevor ich, bevor ich dir gsеit han\n\nIch han immer nume nur a dich denkt\nBin dir pauselos *nahgrennt*\nIch han immer nume dich im chopf gha\nSiit do in valencia\nIch han immer nume dich im chopf gha\nSiit do in valencia\n\nIch weiss no bis zu dem moment\nWo mir *z’spanie* gha hend\nHan ich i dir nüt gseh nei\nGenau wie *umgekehrt* au\n\nDoch det isch es passiert\nI mim chopf hets plötzlich *klirrt*\nS’het sich alles *dreht* und\nD’welt staht plötzlich *schräg* und\n\nIch han immer nume nur a dich denkt\nBin dir pauselos *nahgrennt*\nIch han immer nume dich im chopf gha\nSiit do in valencia\nIch han immer nume dich im chopf gha\n\nIch han immer nume nur a dich denkt\nBin dir pauselos nahgrennt\nIch han immer nume dich im chopf gha\nSiit do in valencia\nIch han immer nume dich im chopf gha\n"
  },
  {
    "path": "datasets/zuerich/zuerich.txt",
    "content": "das Haus -> sHuus \ndie Strasse -> dStrass\ndas Fahrad -> sVelo \ndas Auto -> sAuto \ndas Mülleimer -> der Chübel (Abfalleimer)\nder Gehweg -> sTrottuar (pavement)\nWie gehts? -> Wie gahts? \nIch rede Hochdetusch -> Ich rede Schwiizerdütsch. \nWohin gehst du? -> Wohi gasch?\nIch gehe nach unten. -> Ich gang abä.\nIch nehme den Zug. -> Ich gang uf de Zug. \nRuf mich an, wenn du angekommen bist. -> Lüt mir a, wennd acho bisch. \nHast du dein Portmonee dabei? -> Häsch du dis Portmonee däbi?\nIch muss zur Arbeit. -> Ich muess go schaffä. \nIch habe heute ein Brötchen mit Marmelade gefrühstückt. -> Ich han hüt es Weggli mit Confi zum Zmorgä gha. \nWoher kommen Sie? -> Vo wo chömet Sie?\nKomm! Wir müssen uns beeilen! -> Chum, mir müend pressirä! \nSchau mal! -> Lueg mal!\nHör mir zu! -> Los mär zue! \nIch hätte gern einen Kaffee. -> Ich het gern än Kafi. \nWas guckst du mich so an? Hast du ein Problem? -> Was luegsch so doof? Häsch es Problem? \nWir müssen noch Kartoffeln kaufen. -> Mir müend no Herdöpfel kaufe. \nWir ziehen um(haus). -> Mir zuglät. \nWas hast du heute Abend gegessen? -> Was häsch hüt abig gesse? / Was häsch hüt zum Znach gha?\nGehen wir raus? -> Chunsch in Usgang? \nIch trink Leitunswasser. -> Ich trinke Letigswasser / Ich trinkä Hahnäwasser. \nTreffen wir uns in der Kneipe? -> Träffät mir eus i de Beiz?\nIch trinke ein Bier in einer Kneipe. -> Ich trink sBier i de Beiz. \nWo ist mein Handy? -> Wo isch mis Natel / Handy? \nIch gehe schlafen. -> Ich gang go schalfä. \nIch gehe schwimmen. -> Ich gang go schwimme. \nIch gehe 'n Bier trinken. -> Ich gang go es Bier trinken i de Beiz. \nIch habe Schluckauf. -> Ich han de Hidsgi.\n\n\n\n\n\n\n\n"
  },
  {
    "path": "datasets/zuerich/zuerichII.txt",
    "content": "(1) \n<CH>\nöper muess id Post ga und isch denn aber in es ichaufszentrum gange,\nund denn isch er wieder dihei gsi,\nhet sini sache packt und isch is Training \nund später het er no i de Beiz es Bier trunke\n\n<DE> \nJemand muss in die Post gehen, und dann ist er aber in ein Einkaufzentrum gegangen, \nund dann war er wieder zu Hause, hat seine Sachen gepackt, ist trainieren gegangen. \nund später hat er noch in der Kneipe ein Bier getrunken. \n\n\n(2) <CH>Der Janus und ich, Mir hand abgmacht, öpper am drü, nacher hammer öppis welle luege ga, sind am Kasse gange, und der billet sind scho usverkauft gsi. \n\n<DE>\nWir haben ca um 15 uhr haben wir abgemacht, dann sind wir zur Kasse gegangen und wollten Tickets kaufen, aber die waren schon ausverkauft. \n"
  },
  {
    "path": "datasets/zuerich/zuerichbs.txt",
    "content": "Abwart = Haumeister\nEstrich = Dachboden\nFalle = Türklinke\nKabis = Weißkohl\nwischen = fegen\nfegen = wischen\nräss = würzig\npendent = unerledigt\nNachtessen/Znacht = Abendessen\nMorgenessen/Zmorge = Frühstück\n"
  },
  {
    "path": "datasets/zug/zug.txt",
    "content": "«Der Zuger Dialekt ist nicht so markant und eigenständig wie zum Beispiel der Urner oder Obwaldner Dialekt», erklärt Markus Gasser. \n\n«Zugerdeutsch ist ein sogenannter Übergangs-Dialekt, denn Zug liegt in der Mitte der grossen Sprachgrenze zwischen verschiedenen Deutschschweizer Dialekten.»\n\nEs schneit auf die Strasse\n\nZug : Es schnyyt uf d Stròòs\n\n(also «schnyye» wie in den alpinen Mundarten, aber «Stròòs» wie westlich im Aargauischen oder Luzernischen.)\n"
  },
  {
    "path": "dist/siriwave.esm.js",
    "content": "/*! *****************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n\nfunction __rest(s, e) {\n    var t = {};\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n        t[p] = s[p];\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n                t[p[i]] = s[p[i]];\n        }\n    return t;\n}\n\nclass ClassicCurve {\n    constructor(ctrl, definition) {\n        this.ATT_FACTOR = 4;\n        this.GRAPH_X = 2;\n        this.AMPLITUDE_FACTOR = 0.6;\n        this.ctrl = ctrl;\n        this.definition = definition;\n    }\n    globalAttFn(x) {\n        return Math.pow(this.ATT_FACTOR / (this.ATT_FACTOR + Math.pow(x, this.ATT_FACTOR)), this.ATT_FACTOR);\n    }\n    xPos(i) {\n        return this.ctrl.width * ((i + this.GRAPH_X) / (this.GRAPH_X * 2));\n    }\n    yPos(i) {\n        return (this.AMPLITUDE_FACTOR *\n            (this.globalAttFn(i) *\n                (this.ctrl.heightMax * this.ctrl.amplitude) *\n                (1 / this.definition.attenuation) *\n                Math.sin(this.ctrl.opt.frequency * i - this.ctrl.phase)));\n    }\n    draw() {\n        const { ctx } = this.ctrl;\n        ctx.moveTo(0, 0);\n        ctx.beginPath();\n        const finalColor = this.definition.color || this.ctrl.color;\n        const colorHex = finalColor.replace(/rgb\\(/g, \"\").replace(/\\)/g, \"\");\n        ctx.strokeStyle = `rgba(${colorHex},${this.definition.opacity})`;\n        ctx.lineWidth = this.definition.lineWidth;\n        // Cycle the graph from -X to +X every PX_DEPTH and draw the line\n        for (let i = -this.GRAPH_X; i <= this.GRAPH_X; i += this.ctrl.opt.pixelDepth) {\n            ctx.lineTo(this.xPos(i), this.ctrl.heightMax + this.yPos(i));\n        }\n        ctx.stroke();\n    }\n    static getDefinition() {\n        return [\n            {\n                attenuation: -2,\n                lineWidth: 1,\n                opacity: 0.1,\n            },\n            {\n                attenuation: -6,\n                lineWidth: 1,\n                opacity: 0.2,\n            },\n            {\n                attenuation: 4,\n                lineWidth: 1,\n                opacity: 0.4,\n            },\n            {\n                attenuation: 2,\n                lineWidth: 1,\n                opacity: 0.6,\n            },\n            {\n                attenuation: 1,\n                lineWidth: 1.5,\n                opacity: 1,\n            },\n        ];\n    }\n}\n\nclass iOS9Curve {\n    constructor(ctrl, definition) {\n        this.GRAPH_X = 25;\n        this.AMPLITUDE_FACTOR = 0.8;\n        this.SPEED_FACTOR = 1;\n        this.DEAD_PX = 2;\n        this.ATT_FACTOR = 4;\n        this.DESPAWN_FACTOR = 0.02;\n        this.NOOFCURVES_RANGES = [2, 5];\n        this.AMPLITUDE_RANGES = [0.3, 1];\n        this.OFFSET_RANGES = [-3, 3];\n        this.WIDTH_RANGES = [1, 3];\n        this.SPEED_RANGES = [0.5, 1];\n        this.DESPAWN_TIMEOUT_RANGES = [500, 2000];\n        this.ctrl = ctrl;\n        this.definition = definition;\n        this.noOfCurves = 0;\n        this.spawnAt = 0;\n        this.prevMaxY = 0;\n        this.phases = [];\n        this.offsets = [];\n        this.speeds = [];\n        this.finalAmplitudes = [];\n        this.widths = [];\n        this.amplitudes = [];\n        this.despawnTimeouts = [];\n        this.verses = [];\n    }\n    getRandomRange(e) {\n        return e[0] + Math.random() * (e[1] - e[0]);\n    }\n    spawnSingle(ci) {\n        this.phases[ci] = 0;\n        this.amplitudes[ci] = 0;\n        this.despawnTimeouts[ci] = this.getRandomRange(this.DESPAWN_TIMEOUT_RANGES);\n        this.offsets[ci] = this.getRandomRange(this.OFFSET_RANGES);\n        this.speeds[ci] = this.getRandomRange(this.SPEED_RANGES);\n        this.finalAmplitudes[ci] = this.getRandomRange(this.AMPLITUDE_RANGES);\n        this.widths[ci] = this.getRandomRange(this.WIDTH_RANGES);\n        this.verses[ci] = this.getRandomRange([-1, 1]);\n    }\n    getEmptyArray(count) {\n        return new Array(count);\n    }\n    spawn() {\n        this.spawnAt = Date.now();\n        this.noOfCurves = Math.floor(this.getRandomRange(this.NOOFCURVES_RANGES));\n        this.phases = this.getEmptyArray(this.noOfCurves);\n        this.offsets = this.getEmptyArray(this.noOfCurves);\n        this.speeds = this.getEmptyArray(this.noOfCurves);\n        this.finalAmplitudes = this.getEmptyArray(this.noOfCurves);\n        this.widths = this.getEmptyArray(this.noOfCurves);\n        this.amplitudes = this.getEmptyArray(this.noOfCurves);\n        this.despawnTimeouts = this.getEmptyArray(this.noOfCurves);\n        this.verses = this.getEmptyArray(this.noOfCurves);\n        for (let ci = 0; ci < this.noOfCurves; ci++) {\n            this.spawnSingle(ci);\n        }\n    }\n    globalAttFn(x) {\n        return Math.pow(this.ATT_FACTOR / (this.ATT_FACTOR + Math.pow(x, 2)), this.ATT_FACTOR);\n    }\n    sin(x, phase) {\n        return Math.sin(x - phase);\n    }\n    yRelativePos(i) {\n        let y = 0;\n        for (let ci = 0; ci < this.noOfCurves; ci++) {\n            // Generate a static T so that each curve is distant from each oterh\n            let t = 4 * (-1 + (ci / (this.noOfCurves - 1)) * 2);\n            // but add a dynamic offset\n            t += this.offsets[ci];\n            const k = 1 / this.widths[ci];\n            const x = i * k - t;\n            y += Math.abs(this.amplitudes[ci] * this.sin(this.verses[ci] * x, this.phases[ci]) * this.globalAttFn(x));\n        }\n        // Divide for NoOfCurves so that y <= 1\n        return y / this.noOfCurves;\n    }\n    yPos(i) {\n        return (this.AMPLITUDE_FACTOR *\n            this.ctrl.heightMax *\n            this.ctrl.amplitude *\n            this.yRelativePos(i) *\n            this.globalAttFn((i / this.GRAPH_X) * 2));\n    }\n    xPos(i) {\n        return this.ctrl.width * ((i + this.GRAPH_X) / (this.GRAPH_X * 2));\n    }\n    drawSupportLine() {\n        const { ctx } = this.ctrl;\n        const coo = [0, this.ctrl.heightMax, this.ctrl.width, 1];\n        const gradient = ctx.createLinearGradient.apply(ctx, coo);\n        gradient.addColorStop(0, \"transparent\");\n        gradient.addColorStop(0.1, \"rgba(255,255,255,.5)\");\n        gradient.addColorStop(1 - 0.1 - 0.1, \"rgba(255,255,255,.5)\");\n        gradient.addColorStop(1, \"transparent\");\n        ctx.fillStyle = gradient;\n        ctx.fillRect.apply(ctx, coo);\n    }\n    draw() {\n        const { ctx } = this.ctrl;\n        ctx.globalAlpha = 0.7;\n        ctx.globalCompositeOperation = \"lighter\";\n        if (this.spawnAt === 0) {\n            this.spawn();\n        }\n        if (this.definition.supportLine) {\n            // Draw the support line\n            return this.drawSupportLine();\n        }\n        for (let ci = 0; ci < this.noOfCurves; ci++) {\n            if (this.spawnAt + this.despawnTimeouts[ci] <= Date.now()) {\n                this.amplitudes[ci] -= this.DESPAWN_FACTOR;\n            }\n            else {\n                this.amplitudes[ci] += this.DESPAWN_FACTOR;\n            }\n            this.amplitudes[ci] = Math.min(Math.max(this.amplitudes[ci], 0), this.finalAmplitudes[ci]);\n            this.phases[ci] = (this.phases[ci] + this.ctrl.speed * this.speeds[ci] * this.SPEED_FACTOR) % (2 * Math.PI);\n        }\n        let maxY = -Infinity;\n        // Write two opposite waves\n        for (const sign of [1, -1]) {\n            ctx.beginPath();\n            for (let i = -this.GRAPH_X; i <= this.GRAPH_X; i += this.ctrl.opt.pixelDepth) {\n                const x = this.xPos(i);\n                const y = this.yPos(i);\n                ctx.lineTo(x, this.ctrl.heightMax - sign * y);\n                maxY = Math.max(maxY, y);\n            }\n            ctx.closePath();\n            ctx.fillStyle = `rgba(${this.definition.color}, 1)`;\n            ctx.strokeStyle = `rgba(${this.definition.color}, 1)`;\n            ctx.fill();\n        }\n        if (maxY < this.DEAD_PX && this.prevMaxY > maxY) {\n            this.spawnAt = 0;\n        }\n        this.prevMaxY = maxY;\n        return null;\n    }\n    static getDefinition() {\n        return [\n            {\n                color: \"255,255,255\",\n                supportLine: true,\n            },\n            {\n                // blue\n                color: \"15, 82, 169\",\n            },\n            {\n                // red\n                color: \"173, 57, 76\",\n            },\n            {\n                // green\n                color: \"48, 220, 155\",\n            },\n        ];\n    }\n}\n\nclass SiriWave {\n    constructor(_a) {\n        var { container } = _a, rest = __rest(_a, [\"container\"]);\n        // Phase of the wave (passed to Math.sin function)\n        this.phase = 0;\n        // Boolean value indicating the the animation is running\n        this.run = false;\n        // Curves objects to animate\n        this.curves = [];\n        const csStyle = window.getComputedStyle(container);\n        this.opt = Object.assign({ container, style: \"ios\", ratio: window.devicePixelRatio || 1, speed: 0.2, amplitude: 1, frequency: 6, color: \"#fff\", cover: false, width: parseInt(csStyle.width.replace(\"px\", \"\"), 10), height: parseInt(csStyle.height.replace(\"px\", \"\"), 10), autostart: true, pixelDepth: 0.02, lerpSpeed: 0.1 }, rest);\n        /**\n         * Actual speed of the animation. Is not safe to change this value directly, use `setSpeed` instead.\n         */\n        this.speed = Number(this.opt.speed);\n        /**\n         * Actual amplitude of the animation. Is not safe to change this value directly, use `setAmplitude` instead.\n         */\n        this.amplitude = Number(this.opt.amplitude);\n        /**\n         * Width of the canvas multiplied by pixel ratio\n         */\n        this.width = Number(this.opt.ratio * this.opt.width);\n        /**\n         * Height of the canvas multiplied by pixel ratio\n         */\n        this.height = Number(this.opt.ratio * this.opt.height);\n        /**\n         * Maximum height for a single wave\n         */\n        this.heightMax = Number(this.height / 2) - 6;\n        /**\n         * Color of the wave (used in Classic iOS)\n         */\n        this.color = `rgb(${this.hex2rgb(this.opt.color)})`;\n        /**\n         * An object containing controller variables that need to be interpolated\n         * to an another value before to be actually changed\n         */\n        this.interpolation = {\n            speed: this.speed,\n            amplitude: this.amplitude,\n        };\n        /**\n         * Canvas DOM Element where curves will be drawn\n         */\n        this.canvas = document.createElement(\"canvas\");\n        /**\n         * 2D Context from Canvas\n         */\n        const ctx = this.canvas.getContext(\"2d\");\n        if (ctx === null) {\n            throw new Error(\"Unable to create 2D Context\");\n        }\n        this.ctx = ctx;\n        // Set dimensions\n        this.canvas.width = this.width;\n        this.canvas.height = this.height;\n        // By covering, we ensure the canvas is in the same size of the parent\n        if (this.opt.cover === true) {\n            this.canvas.style.width = this.canvas.style.height = \"100%\";\n        }\n        else {\n            this.canvas.style.width = `${this.width / this.opt.ratio}px`;\n            this.canvas.style.height = `${this.height / this.opt.ratio}px`;\n        }\n        // Instantiate all curves based on the style\n        switch (this.opt.style) {\n            case \"ios9\":\n                this.curves = (this.opt.curveDefinition || iOS9Curve.getDefinition()).map((def) => new iOS9Curve(this, def));\n                break;\n            case \"ios\":\n            default:\n                this.curves = (this.opt.curveDefinition || ClassicCurve.getDefinition()).map((def) => new ClassicCurve(this, def));\n                break;\n        }\n        // Attach to the container\n        this.opt.container.appendChild(this.canvas);\n        // Start the animation\n        if (this.opt.autostart) {\n            this.start();\n        }\n    }\n    /**\n     * Convert an HEX color to RGB\n     */\n    hex2rgb(hex) {\n        const shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n        hex = hex.replace(shorthandRegex, (m, r, g, b) => r + r + g + g + b + b);\n        const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n        return result\n            ? `${parseInt(result[1], 16).toString()},${parseInt(result[2], 16).toString()},${parseInt(result[3], 16).toString()}`\n            : null;\n    }\n    intLerp(v0, v1, t) {\n        return v0 * (1 - t) + v1 * t;\n    }\n    /**\n     * Interpolate a property to the value found in this.interpolation\n     */\n    lerp(propertyStr) {\n        const prop = this.interpolation[propertyStr];\n        if (prop !== null) {\n            this[propertyStr] = this.intLerp(this[propertyStr], prop, this.opt.lerpSpeed);\n            if (this[propertyStr] - prop === 0) {\n                this.interpolation[propertyStr] = null;\n            }\n        }\n        return this[propertyStr];\n    }\n    /**\n     * Clear the canvas\n     */\n    clear() {\n        this.ctx.globalCompositeOperation = \"destination-out\";\n        this.ctx.fillRect(0, 0, this.width, this.height);\n        this.ctx.globalCompositeOperation = \"source-over\";\n    }\n    /**\n     * Draw all curves\n     */\n    draw() {\n        this.curves.forEach((curve) => curve.draw());\n    }\n    /**\n     * Clear the space, interpolate values, calculate new steps and draws\n     * @returns\n     */\n    startDrawCycle() {\n        this.clear();\n        // Interpolate values\n        this.lerp(\"amplitude\");\n        this.lerp(\"speed\");\n        this.draw();\n        this.phase = (this.phase + (Math.PI / 2) * this.speed) % (2 * Math.PI);\n        if (window.requestAnimationFrame) {\n            this.animationFrameId = window.requestAnimationFrame(this.startDrawCycle.bind(this));\n        }\n        else {\n            this.timeoutId = setTimeout(this.startDrawCycle.bind(this), 20);\n        }\n    }\n    /* API */\n    /**\n     * Start the animation\n     */\n    start() {\n        if (!this.canvas) {\n            throw new Error(\"This instance of SiriWave has been disposed, please create a new instance\");\n        }\n        this.phase = 0;\n        // Ensure we don't re-launch the draw cycle\n        if (!this.run) {\n            this.run = true;\n            this.startDrawCycle();\n        }\n    }\n    /**\n     * Stop the animation\n     */\n    stop() {\n        this.phase = 0;\n        this.run = false;\n        // Clear old draw cycle on stop\n        if (this.animationFrameId) {\n            window.cancelAnimationFrame(this.animationFrameId);\n        }\n        if (this.timeoutId) {\n            clearTimeout(this.timeoutId);\n        }\n    }\n    /**\n     * Dispose\n     */\n    dispose() {\n        this.stop();\n        if (this.canvas) {\n            this.canvas.remove();\n            this.canvas = null;\n        }\n    }\n    /**\n     * Set a new value for a property (interpolated)\n     */\n    set(propertyStr, value) {\n        this.interpolation[propertyStr] = value;\n    }\n    /**\n     * Set a new value for the speed property (interpolated)\n     */\n    setSpeed(value) {\n        this.set(\"speed\", value);\n    }\n    /**\n     * Set a new value for the amplitude property (interpolated)\n     */\n    setAmplitude(value) {\n        this.set(\"amplitude\", value);\n    }\n}\n\nexport { SiriWave as default };\n"
  },
  {
    "path": "dist/siriwave.umd.js",
    "content": "(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.SiriWave = factory());\n})(this, (function () { 'use strict';\n\n    /*! *****************************************************************************\n    Copyright (c) Microsoft Corporation.\n\n    Permission to use, copy, modify, and/or distribute this software for any\n    purpose with or without fee is hereby granted.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n    PERFORMANCE OF THIS SOFTWARE.\n    ***************************************************************************** */\n\n    var __assign = function() {\n        __assign = Object.assign || function __assign(t) {\n            for (var s, i = 1, n = arguments.length; i < n; i++) {\n                s = arguments[i];\n                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n            }\n            return t;\n        };\n        return __assign.apply(this, arguments);\n    };\n\n    function __rest(s, e) {\n        var t = {};\n        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n            t[p] = s[p];\n        if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n            for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n                if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n                    t[p[i]] = s[p[i]];\n            }\n        return t;\n    }\n\n    var ClassicCurve = /** @class */ (function () {\n        function ClassicCurve(ctrl, definition) {\n            this.ATT_FACTOR = 4;\n            this.GRAPH_X = 2;\n            this.AMPLITUDE_FACTOR = 0.6;\n            this.ctrl = ctrl;\n            this.definition = definition;\n        }\n        ClassicCurve.prototype.globalAttFn = function (x) {\n            return Math.pow(this.ATT_FACTOR / (this.ATT_FACTOR + Math.pow(x, this.ATT_FACTOR)), this.ATT_FACTOR);\n        };\n        ClassicCurve.prototype.xPos = function (i) {\n            return this.ctrl.width * ((i + this.GRAPH_X) / (this.GRAPH_X * 2));\n        };\n        ClassicCurve.prototype.yPos = function (i) {\n            return (this.AMPLITUDE_FACTOR *\n                (this.globalAttFn(i) *\n                    (this.ctrl.heightMax * this.ctrl.amplitude) *\n                    (1 / this.definition.attenuation) *\n                    Math.sin(this.ctrl.opt.frequency * i - this.ctrl.phase)));\n        };\n        ClassicCurve.prototype.draw = function () {\n            var ctx = this.ctrl.ctx;\n            ctx.moveTo(0, 0);\n            ctx.beginPath();\n            var finalColor = this.definition.color || this.ctrl.color;\n            var colorHex = finalColor.replace(/rgb\\(/g, \"\").replace(/\\)/g, \"\");\n            ctx.strokeStyle = \"rgba(\".concat(colorHex, \",\").concat(this.definition.opacity, \")\");\n            ctx.lineWidth = this.definition.lineWidth;\n            // Cycle the graph from -X to +X every PX_DEPTH and draw the line\n            for (var i = -this.GRAPH_X; i <= this.GRAPH_X; i += this.ctrl.opt.pixelDepth) {\n                ctx.lineTo(this.xPos(i), this.ctrl.heightMax + this.yPos(i));\n            }\n            ctx.stroke();\n        };\n        ClassicCurve.getDefinition = function () {\n            return [\n                {\n                    attenuation: -2,\n                    lineWidth: 1,\n                    opacity: 0.1,\n                },\n                {\n                    attenuation: -6,\n                    lineWidth: 1,\n                    opacity: 0.2,\n                },\n                {\n                    attenuation: 4,\n                    lineWidth: 1,\n                    opacity: 0.4,\n                },\n                {\n                    attenuation: 2,\n                    lineWidth: 1,\n                    opacity: 0.6,\n                },\n                {\n                    attenuation: 1,\n                    lineWidth: 1.5,\n                    opacity: 1,\n                },\n            ];\n        };\n        return ClassicCurve;\n    }());\n\n    var iOS9Curve = /** @class */ (function () {\n        function iOS9Curve(ctrl, definition) {\n            this.GRAPH_X = 25;\n            this.AMPLITUDE_FACTOR = 0.8;\n            this.SPEED_FACTOR = 1;\n            this.DEAD_PX = 2;\n            this.ATT_FACTOR = 4;\n            this.DESPAWN_FACTOR = 0.02;\n            this.NOOFCURVES_RANGES = [2, 5];\n            this.AMPLITUDE_RANGES = [0.3, 1];\n            this.OFFSET_RANGES = [-3, 3];\n            this.WIDTH_RANGES = [1, 3];\n            this.SPEED_RANGES = [0.5, 1];\n            this.DESPAWN_TIMEOUT_RANGES = [500, 2000];\n            this.ctrl = ctrl;\n            this.definition = definition;\n            this.noOfCurves = 0;\n            this.spawnAt = 0;\n            this.prevMaxY = 0;\n            this.phases = [];\n            this.offsets = [];\n            this.speeds = [];\n            this.finalAmplitudes = [];\n            this.widths = [];\n            this.amplitudes = [];\n            this.despawnTimeouts = [];\n            this.verses = [];\n        }\n        iOS9Curve.prototype.getRandomRange = function (e) {\n            return e[0] + Math.random() * (e[1] - e[0]);\n        };\n        iOS9Curve.prototype.spawnSingle = function (ci) {\n            this.phases[ci] = 0;\n            this.amplitudes[ci] = 0;\n            this.despawnTimeouts[ci] = this.getRandomRange(this.DESPAWN_TIMEOUT_RANGES);\n            this.offsets[ci] = this.getRandomRange(this.OFFSET_RANGES);\n            this.speeds[ci] = this.getRandomRange(this.SPEED_RANGES);\n            this.finalAmplitudes[ci] = this.getRandomRange(this.AMPLITUDE_RANGES);\n            this.widths[ci] = this.getRandomRange(this.WIDTH_RANGES);\n            this.verses[ci] = this.getRandomRange([-1, 1]);\n        };\n        iOS9Curve.prototype.getEmptyArray = function (count) {\n            return new Array(count);\n        };\n        iOS9Curve.prototype.spawn = function () {\n            this.spawnAt = Date.now();\n            this.noOfCurves = Math.floor(this.getRandomRange(this.NOOFCURVES_RANGES));\n            this.phases = this.getEmptyArray(this.noOfCurves);\n            this.offsets = this.getEmptyArray(this.noOfCurves);\n            this.speeds = this.getEmptyArray(this.noOfCurves);\n            this.finalAmplitudes = this.getEmptyArray(this.noOfCurves);\n            this.widths = this.getEmptyArray(this.noOfCurves);\n            this.amplitudes = this.getEmptyArray(this.noOfCurves);\n            this.despawnTimeouts = this.getEmptyArray(this.noOfCurves);\n            this.verses = this.getEmptyArray(this.noOfCurves);\n            for (var ci = 0; ci < this.noOfCurves; ci++) {\n                this.spawnSingle(ci);\n            }\n        };\n        iOS9Curve.prototype.globalAttFn = function (x) {\n            return Math.pow(this.ATT_FACTOR / (this.ATT_FACTOR + Math.pow(x, 2)), this.ATT_FACTOR);\n        };\n        iOS9Curve.prototype.sin = function (x, phase) {\n            return Math.sin(x - phase);\n        };\n        iOS9Curve.prototype.yRelativePos = function (i) {\n            var y = 0;\n            for (var ci = 0; ci < this.noOfCurves; ci++) {\n                // Generate a static T so that each curve is distant from each oterh\n                var t = 4 * (-1 + (ci / (this.noOfCurves - 1)) * 2);\n                // but add a dynamic offset\n                t += this.offsets[ci];\n                var k = 1 / this.widths[ci];\n                var x = i * k - t;\n                y += Math.abs(this.amplitudes[ci] * this.sin(this.verses[ci] * x, this.phases[ci]) * this.globalAttFn(x));\n            }\n            // Divide for NoOfCurves so that y <= 1\n            return y / this.noOfCurves;\n        };\n        iOS9Curve.prototype.yPos = function (i) {\n            return (this.AMPLITUDE_FACTOR *\n                this.ctrl.heightMax *\n                this.ctrl.amplitude *\n                this.yRelativePos(i) *\n                this.globalAttFn((i / this.GRAPH_X) * 2));\n        };\n        iOS9Curve.prototype.xPos = function (i) {\n            return this.ctrl.width * ((i + this.GRAPH_X) / (this.GRAPH_X * 2));\n        };\n        iOS9Curve.prototype.drawSupportLine = function () {\n            var ctx = this.ctrl.ctx;\n            var coo = [0, this.ctrl.heightMax, this.ctrl.width, 1];\n            var gradient = ctx.createLinearGradient.apply(ctx, coo);\n            gradient.addColorStop(0, \"transparent\");\n            gradient.addColorStop(0.1, \"rgba(255,255,255,.5)\");\n            gradient.addColorStop(1 - 0.1 - 0.1, \"rgba(255,255,255,.5)\");\n            gradient.addColorStop(1, \"transparent\");\n            ctx.fillStyle = gradient;\n            ctx.fillRect.apply(ctx, coo);\n        };\n        iOS9Curve.prototype.draw = function () {\n            var ctx = this.ctrl.ctx;\n            ctx.globalAlpha = 0.7;\n            ctx.globalCompositeOperation = \"lighter\";\n            if (this.spawnAt === 0) {\n                this.spawn();\n            }\n            if (this.definition.supportLine) {\n                // Draw the support line\n                return this.drawSupportLine();\n            }\n            for (var ci = 0; ci < this.noOfCurves; ci++) {\n                if (this.spawnAt + this.despawnTimeouts[ci] <= Date.now()) {\n                    this.amplitudes[ci] -= this.DESPAWN_FACTOR;\n                }\n                else {\n                    this.amplitudes[ci] += this.DESPAWN_FACTOR;\n                }\n                this.amplitudes[ci] = Math.min(Math.max(this.amplitudes[ci], 0), this.finalAmplitudes[ci]);\n                this.phases[ci] = (this.phases[ci] + this.ctrl.speed * this.speeds[ci] * this.SPEED_FACTOR) % (2 * Math.PI);\n            }\n            var maxY = -Infinity;\n            // Write two opposite waves\n            for (var _i = 0, _a = [1, -1]; _i < _a.length; _i++) {\n                var sign = _a[_i];\n                ctx.beginPath();\n                for (var i = -this.GRAPH_X; i <= this.GRAPH_X; i += this.ctrl.opt.pixelDepth) {\n                    var x = this.xPos(i);\n                    var y = this.yPos(i);\n                    ctx.lineTo(x, this.ctrl.heightMax - sign * y);\n                    maxY = Math.max(maxY, y);\n                }\n                ctx.closePath();\n                ctx.fillStyle = \"rgba(\".concat(this.definition.color, \", 1)\");\n                ctx.strokeStyle = \"rgba(\".concat(this.definition.color, \", 1)\");\n                ctx.fill();\n            }\n            if (maxY < this.DEAD_PX && this.prevMaxY > maxY) {\n                this.spawnAt = 0;\n            }\n            this.prevMaxY = maxY;\n            return null;\n        };\n        iOS9Curve.getDefinition = function () {\n            return [\n                {\n                    color: \"255,255,255\",\n                    supportLine: true,\n                },\n                {\n                    // blue\n                    color: \"15, 82, 169\",\n                },\n                {\n                    // red\n                    color: \"173, 57, 76\",\n                },\n                {\n                    // green\n                    color: \"48, 220, 155\",\n                },\n            ];\n        };\n        return iOS9Curve;\n    }());\n\n    var SiriWave = /** @class */ (function () {\n        function SiriWave(_a) {\n            var _this = this;\n            var container = _a.container, rest = __rest(_a, [\"container\"]);\n            // Phase of the wave (passed to Math.sin function)\n            this.phase = 0;\n            // Boolean value indicating the the animation is running\n            this.run = false;\n            // Curves objects to animate\n            this.curves = [];\n            var csStyle = window.getComputedStyle(container);\n            this.opt = __assign({ container: container, style: \"ios\", ratio: window.devicePixelRatio || 1, speed: 0.2, amplitude: 1, frequency: 6, color: \"#fff\", cover: false, width: parseInt(csStyle.width.replace(\"px\", \"\"), 10), height: parseInt(csStyle.height.replace(\"px\", \"\"), 10), autostart: true, pixelDepth: 0.02, lerpSpeed: 0.1 }, rest);\n            /**\n             * Actual speed of the animation. Is not safe to change this value directly, use `setSpeed` instead.\n             */\n            this.speed = Number(this.opt.speed);\n            /**\n             * Actual amplitude of the animation. Is not safe to change this value directly, use `setAmplitude` instead.\n             */\n            this.amplitude = Number(this.opt.amplitude);\n            /**\n             * Width of the canvas multiplied by pixel ratio\n             */\n            this.width = Number(this.opt.ratio * this.opt.width);\n            /**\n             * Height of the canvas multiplied by pixel ratio\n             */\n            this.height = Number(this.opt.ratio * this.opt.height);\n            /**\n             * Maximum height for a single wave\n             */\n            this.heightMax = Number(this.height / 2) - 6;\n            /**\n             * Color of the wave (used in Classic iOS)\n             */\n            this.color = \"rgb(\".concat(this.hex2rgb(this.opt.color), \")\");\n            /**\n             * An object containing controller variables that need to be interpolated\n             * to an another value before to be actually changed\n             */\n            this.interpolation = {\n                speed: this.speed,\n                amplitude: this.amplitude,\n            };\n            /**\n             * Canvas DOM Element where curves will be drawn\n             */\n            this.canvas = document.createElement(\"canvas\");\n            /**\n             * 2D Context from Canvas\n             */\n            var ctx = this.canvas.getContext(\"2d\");\n            if (ctx === null) {\n                throw new Error(\"Unable to create 2D Context\");\n            }\n            this.ctx = ctx;\n            // Set dimensions\n            this.canvas.width = this.width;\n            this.canvas.height = this.height;\n            // By covering, we ensure the canvas is in the same size of the parent\n            if (this.opt.cover === true) {\n                this.canvas.style.width = this.canvas.style.height = \"100%\";\n            }\n            else {\n                this.canvas.style.width = \"\".concat(this.width / this.opt.ratio, \"px\");\n                this.canvas.style.height = \"\".concat(this.height / this.opt.ratio, \"px\");\n            }\n            // Instantiate all curves based on the style\n            switch (this.opt.style) {\n                case \"ios9\":\n                    this.curves = (this.opt.curveDefinition || iOS9Curve.getDefinition()).map(function (def) { return new iOS9Curve(_this, def); });\n                    break;\n                case \"ios\":\n                default:\n                    this.curves = (this.opt.curveDefinition || ClassicCurve.getDefinition()).map(function (def) { return new ClassicCurve(_this, def); });\n                    break;\n            }\n            // Attach to the container\n            this.opt.container.appendChild(this.canvas);\n            // Start the animation\n            if (this.opt.autostart) {\n                this.start();\n            }\n        }\n        /**\n         * Convert an HEX color to RGB\n         */\n        SiriWave.prototype.hex2rgb = function (hex) {\n            var shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n            hex = hex.replace(shorthandRegex, function (m, r, g, b) { return r + r + g + g + b + b; });\n            var result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n            return result\n                ? \"\".concat(parseInt(result[1], 16).toString(), \",\").concat(parseInt(result[2], 16).toString(), \",\").concat(parseInt(result[3], 16).toString())\n                : null;\n        };\n        SiriWave.prototype.intLerp = function (v0, v1, t) {\n            return v0 * (1 - t) + v1 * t;\n        };\n        /**\n         * Interpolate a property to the value found in this.interpolation\n         */\n        SiriWave.prototype.lerp = function (propertyStr) {\n            var prop = this.interpolation[propertyStr];\n            if (prop !== null) {\n                this[propertyStr] = this.intLerp(this[propertyStr], prop, this.opt.lerpSpeed);\n                if (this[propertyStr] - prop === 0) {\n                    this.interpolation[propertyStr] = null;\n                }\n            }\n            return this[propertyStr];\n        };\n        /**\n         * Clear the canvas\n         */\n        SiriWave.prototype.clear = function () {\n            this.ctx.globalCompositeOperation = \"destination-out\";\n            this.ctx.fillRect(0, 0, this.width, this.height);\n            this.ctx.globalCompositeOperation = \"source-over\";\n        };\n        /**\n         * Draw all curves\n         */\n        SiriWave.prototype.draw = function () {\n            this.curves.forEach(function (curve) { return curve.draw(); });\n        };\n        /**\n         * Clear the space, interpolate values, calculate new steps and draws\n         * @returns\n         */\n        SiriWave.prototype.startDrawCycle = function () {\n            this.clear();\n            // Interpolate values\n            this.lerp(\"amplitude\");\n            this.lerp(\"speed\");\n            this.draw();\n            this.phase = (this.phase + (Math.PI / 2) * this.speed) % (2 * Math.PI);\n            if (window.requestAnimationFrame) {\n                this.animationFrameId = window.requestAnimationFrame(this.startDrawCycle.bind(this));\n            }\n            else {\n                this.timeoutId = setTimeout(this.startDrawCycle.bind(this), 20);\n            }\n        };\n        /* API */\n        /**\n         * Start the animation\n         */\n        SiriWave.prototype.start = function () {\n            if (!this.canvas) {\n                throw new Error(\"This instance of SiriWave has been disposed, please create a new instance\");\n            }\n            this.phase = 0;\n            // Ensure we don't re-launch the draw cycle\n            if (!this.run) {\n                this.run = true;\n                this.startDrawCycle();\n            }\n        };\n        /**\n         * Stop the animation\n         */\n        SiriWave.prototype.stop = function () {\n            this.phase = 0;\n            this.run = false;\n            // Clear old draw cycle on stop\n            if (this.animationFrameId) {\n                window.cancelAnimationFrame(this.animationFrameId);\n            }\n            if (this.timeoutId) {\n                clearTimeout(this.timeoutId);\n            }\n        };\n        /**\n         * Dispose\n         */\n        SiriWave.prototype.dispose = function () {\n            this.stop();\n            if (this.canvas) {\n                this.canvas.remove();\n                this.canvas = null;\n            }\n        };\n        /**\n         * Set a new value for a property (interpolated)\n         */\n        SiriWave.prototype.set = function (propertyStr, value) {\n            this.interpolation[propertyStr] = value;\n        };\n        /**\n         * Set a new value for the speed property (interpolated)\n         */\n        SiriWave.prototype.setSpeed = function (value) {\n            this.set(\"speed\", value);\n        };\n        /**\n         * Set a new value for the amplitude property (interpolated)\n         */\n        SiriWave.prototype.setAmplitude = function (value) {\n            this.set(\"amplitude\", value);\n        };\n        return SiriWave;\n    }());\n\n    return SiriWave;\n\n}));\n"
  },
  {
    "path": "dist/typ/curve.d.ts",
    "content": "import SiriWave, { IClassicCurveDefinition, ICurve } from \"./index\";\nexport declare class ClassicCurve implements ICurve {\n    ctrl: SiriWave;\n    definition: IClassicCurveDefinition;\n    ATT_FACTOR: number;\n    GRAPH_X: number;\n    AMPLITUDE_FACTOR: number;\n    constructor(ctrl: SiriWave, definition: IClassicCurveDefinition);\n    private globalAttFn;\n    private xPos;\n    private yPos;\n    draw(): void;\n    static getDefinition(): IClassicCurveDefinition[];\n}\n\n"
  },
  {
    "path": "dist/typ/index.d.ts",
    "content": "#das funtioniert auf IOS\n\ndeclare type CurveStyle = \"ios\" | \"ios9\";\nexport declare type Options = {\n    container: HTMLElement;\n    style?: CurveStyle;\n    ratio?: number;\n    speed?: number;\n    amplitude?: number;\n    frequency?: number;\n    color?: string;\n    cover?: boolean;\n    width?: number;\n    height?: number;\n    autostart?: boolean;\n    pixelDepth?: number;\n    lerpSpeed?: number;\n    curveDefinition?: ICurveDefinition[];\n};\nexport declare type IiOS9CurveDefinition = {\n    supportLine?: boolean;\n    color: string;\n};\nexport declare type IClassicCurveDefinition = {\n    attenuation: number;\n    lineWidth: number;\n    opacity: number;\n    color?: string;\n};\nexport declare type ICurveDefinition = IiOS9CurveDefinition | IClassicCurveDefinition;\nexport interface ICurve {\n    draw: () => void;\n}\nexport default class SiriWave {\n    opt: Options;\n    phase: number;\n    run: boolean;\n    curves: ICurve[];\n    speed: number;\n    amplitude: number;\n    width: number;\n    height: number;\n    heightMax: number;\n    color: string;\n    interpolation: {\n        speed: number | null;\n        amplitude: number | null;\n    };\n    canvas: HTMLCanvasElement | null;\n    ctx: CanvasRenderingContext2D;\n    animationFrameId: number | undefined;\n    timeoutId: ReturnType<typeof setTimeout> | undefined;\n    constructor({ container, ...rest }: Options);\n    /**\n     * Convert an HEX color to RGB\n     */\n    private hex2rgb;\n    private intLerp;\n    /**\n     * Interpolate a property to the value found in this.interpolation\n     */\n    private lerp;\n    /**\n     * Clear the canvas\n     */\n    private clear;\n    /**\n     * Draw all curves\n     */\n    private draw;\n    /**\n     * Clear the space, interpolate values, calculate new steps and draws\n     * @returns\n     */\n    private startDrawCycle;\n    /**\n     * Start the animation\n     */\n    start(): void;\n    /**\n     * Stop the animation\n     */\n    stop(): void;\n    /**\n     * Dispose\n     */\n    dispose(): void;\n    /**\n     * Set a new value for a property (interpolated)\n     */\n    set(propertyStr: \"amplitude\" | \"speed\", value: number): void;\n    /**\n     * Set a new value for the speed property (interpolated)\n     */\n    setSpeed(value: number): void;\n    /**\n     * Set a new value for the amplitude property (interpolated)\n     */\n    setAmplitude(value: number): void;\n}\nexport {};\n"
  },
  {
    "path": "dist/typ/ios.d.ts",
    "content": "import SiriWave, { ICurve, IiOS9CurveDefinition } from \"./index\";\nexport declare class iOS9Curve implements ICurve {\n    ctrl: SiriWave;\n    definition: IiOS9CurveDefinition;\n    spawnAt: number;\n    noOfCurves: number;\n    prevMaxY: number;\n    phases: number[];\n    amplitudes: number[];\n    despawnTimeouts: number[];\n    offsets: number[];\n    speeds: number[];\n    finalAmplitudes: number[];\n    widths: number[];\n    verses: number[];\n    GRAPH_X: number;\n    AMPLITUDE_FACTOR: number;\n    SPEED_FACTOR: number;\n    DEAD_PX: number;\n    ATT_FACTOR: number;\n    DESPAWN_FACTOR: number;\n    NOOFCURVES_RANGES: [number, number];\n    AMPLITUDE_RANGES: [number, number];\n    OFFSET_RANGES: [number, number];\n    WIDTH_RANGES: [number, number];\n    SPEED_RANGES: [number, number];\n    DESPAWN_TIMEOUT_RANGES: [number, number];\n    constructor(ctrl: SiriWave, definition: IiOS9CurveDefinition);\n    private getRandomRange;\n    private spawnSingle;\n    private getEmptyArray;\n    private spawn;\n    private globalAttFn;\n    private sin;\n    private yRelativePos;\n    private yPos;\n    private xPos;\n    private drawSupportLine;\n    draw(): void | null;\n    static getDefinition(): IiOS9CurveDefinition[];\n}\n"
  },
  {
    "path": "facts/ASR/DeepSpeech.md",
    "content": "# Automatic Speech Recognition (ASR) - DeepSpeech Swiss German\n\n_This is the project for the paper [LTL-UDE at Low-Resource Speech-to-Text Shared Task : Investigating Mozilla DeepSpeech in a low-resource setting](https://www.researchgate.net/publication/342338332_LTL-UDE_at_Low-Resource_Speech-to-Text_Shared_Task_Investigating_Mozilla_DeepSpeech_in_a_low-resource_setting) published at [SWISSTEXT 5th and KONVENS 2020](https://swisstext-and-konvens-2020.org/)._\n\nThis project aims to develop a working Speech to Text module using [Mozilla DeepSpeech](https://github.com/mozilla/DeepSpeech), which can be used for any Audio processing pipeline. [Mozillla DeepSpeech](https://github.com/mozilla/DeepSpeech) is a state-of-the-art open-source automatic speech recognition (ASR) toolkit. DeepSpeech is using a model trained by deep learning techniques based on [Baidu's Deep Speech](https://gigaom2.files.wordpress.com/2014/12/deep_speech3_12_17.pdf) research paper. Project DeepSpeech uses Google's TensorFlow to make the implementation easier.\n\n<p align=\"center\">\n\t<img src=\"media/deep-speech-1.png\" align=\"center\" title=\"DeepSpeech (image referred from Mozilla readdocs)\" />\n</p>\n\n\n## Important Links:\n\n**Paper:** https://www.researchgate.net/publication/342338332_LTL-UDE_at_Low-Resource_Speech-to-Text_Shared_Task_Investigating_Mozilla_DeepSpeech_in_a_low-resource_setting\n\n**DeepSpeech-API:** https://github.com/AASHISHAG/DeepSpeech-API\n\nThis Readme is written for [DeepSpeech v0.6.0](https://github.com/mozilla/DeepSpeech/releases/tag/v0.6.0). Refer to [Mozillla DeepSpeech](https://github.com/mozilla/DeepSpeech) for lastest updates.\n\n## Contents\n\n1. [Requirements](#requirements)\n2. [Speech Corpus](#speech-corpus)\n3. [Language Model](#language-model)\n4. [Training](#training)\n5. [Results](#results)\n<!-- 6. [Trained Models](#trained-models) -->\n6. [Acknowledgments](#acknowledgments)\n7. [References](#references)\n\n### Requirements\n\n#### Installing Python bindings\n\n```\nvirtualenv -p python3 deepspeech-swiss-german\nsource deepspeech-swiss-german/bin/activate\npip3 install -r python_requirements.txt\n```\n\n#### Mozilla DeepSpeech\n\n```\n$ git clone https://github.com/mozilla/DeepSpeech.git\n$ cd DeepSpeech\n$ git checkout v0.6.0\n$ docker build -t deepspeech_v0.6.0 .\n$ docker run -d -it --name deepspeech_v0.6.0 --mount type=bind,source=\"$(pwd)\",target=/root deepspeech_v0.6.0\n$ docker exec -it deepspeech_v0.6.0 /bin/bash\n```\n\nNote: Set the locale to en_US.UTF-8 if required:\n```\n$ dpkg-reconfigure locales\n$ https://perlgeek.de/en/article/set-up-a-clean-utf8-environment <reference>\n```\n\n### Speech Corpus\n\n**1. _English_**\n* [Mozilla Common Voice](https://voice.mozilla.org/) ~1488h\n* [LibriSpeech](http://www.openslr.org/12) ~1000h \n\n**2. _German_**\n* [Mozilla Common Voice](https://voice.mozilla.org/) ~454h\n* [Mailabs](https://www.caito.de/2019/01/the-m-ailabs-speech-dataset/) ~233h\n* [German Distant Speech Corpus (TUDA-De)](https://www.inf.uni-hamburg.de/en/inst/ab/lt/resources/data/acoustic-models.html) ~184h\n* [Voxforge](http://www.voxforge.org/home/forums/other-languages/german/open-speech-data-corpus-for-german) ~57h\n\n**3. _Swiss-German_**\n* [SwissText](https://swisstext-and-konvens-2020.org/low-resource-speech-to-text/) ~70h\n* [ArchiMob](https://www.spur.uzh.ch/en/departments/research/textgroup/ArchiMob.html) ~57h\n\n\n### Download and Prepare the Audio Data\n\n**1. _Mozilla_EN_**\n```\n$ mkdir mozilla_en\n$ cd mozilla_en\n$ wget https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-4-2019-12-10/en.tar.gz\n$ tar -xzvf en.tar.gz\n$ python3 DeepSpeech/bin/import_cv2.py --audio_dir path --filter_alphabet deepspeech-swiss-german/data/en_alphabet.txt export_path <change the path accordingly>\n```\n\n**2. _LibriSpeech_EN_**\n```\n$ mkdir librispeech\n$ cd librispeech\n$ python3 DeepSpeech/bin/import_librivox.py export_path <change the path accordingly>\n```\n\n**3. _Mozilla_DE_**\n```\n$ mkdir mozilla_de\n$ cd mozilla_de\n$ wget https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-4-2019-12-10/de.tar.gz\n$ tar -xzvf de.tar.gz\n$ python3 DeepSpeech/bin/import_cv2.py --audio_dir path --filter_alphabet deepspeech-swiss-german/data/alphabet.txt export_path <change the path accordingly>\n```\n\n**4. _Mailabs_DE_**\n```\n$ mkdir mailabs\n$ cd mailabs\n$ python3 DeepSpeech/bin/import_m-ailabs.py --language de_DE --filter_alphabet deepspeech-swiss-german/data/alphabet.txt export_path <change the path accordingly>\n```\n\n**5. _Tuda_DE_**\n```\n$ mkdir tuda\n$ cd tuda\n$ wget http://www.repository.voxforge1.org/downloads/de/german-speechdata-package-v2.tar.gz\n$ tar -xzvf german-speechdata-package-v2.tar.gz\n$ deepspeech-swiss-german/pre-processing/prepare_data.py --tuda corpus_path export_path\n```\n\n**6. _Voxforge_DE_**\n```\n$ mkdir voxforge\n$ cd voxforge\n```\n```python\npython3\n$ from audiomate.corpus import io\n$ dl = io.VoxforgeDownloader(lang='de')\n$ dl.download(voxforge_corpus_path)\n```\n```\n$ deepspeech-swiss-german/pre-processing/run_to_utf_8.sh\n$ python3 deepspeech-swiss-german/prepare_data.py --voxforge corpus_path export_path <change the path accordingly>\n```\n_NOTE: Change the path accordingly in run_to_utf_8.sh_\n\n**7. _SwissText_DE_**\n```\n$ mkdir swisstext\n$ cd swisstext\n$ https://drive.switch.ch/index.php/s/PpUArRmN5Ba5C8J <download link>\n$ unzip train.zip\n$ python3 deepspeech-swiss-german/prepare_data_swiss_german.py\n$ python3 deepspeech-swiss-german/shuffle_and_split.py\n```\n\n**8. _ArchiMob_DE_**\n\nFollow steps [here](https://github.com/AASHISHAG/archimob-swissgerman-deepspeech-importer):\n```\n$ https://github.com/AASHISHAG/archimob-swissgerman-deepspeech-importer\n```\n\n### Language Model\n\nWe used [KenLM](https://github.com/kpu/kenlm.git) toolkit to train a 3-gram language model. It is Language Model inference code by [Kenneth Heafield](https://kheafield.com/)\n\n- **Installation**\n\n```\n$ git clone https://github.com/kpu/kenlm.git\n$ cd kenlm\n$ mkdir -p build\n$ cd build\n$ cmake ..\n$ make -j `nproc`\n```\n\n- **Corpus**\n\nWe used an open-source [German Speech Corpus](http://ltdata1.informatik.uni-hamburg.de/kaldi_tuda_de/German_sentences_8mil_filtered_maryfied.txt.gz) released by [University of Hamburg](https://www.inf.uni-hamburg.de/en/inst/ab/lt/resources/data/acoustic-models.html) and [European Parliament Proceedings Parallel Corpus 1996-2011](https://www.statmt.org/europarl/)\n\n1. Download the data (EN, DE)\n\n```\n##EN\n$ using Mozilla default LM and Trie\n\n## DE\n$ wget http://ltdata1.informatik.uni-hamburg.de/kaldi_tuda_de/German_sentences_8mil_filtered_maryfied.txt.gz\n$ gzip -d German_sentences_8mil_filtered_maryfied.txt.gz\n$ wget https://www.statmt.org/europarl/v7/de-en.tgz\n$ tar -xzvf de-en.tgz\n$ cat German_sentences_8mil_filtered_maryfied.txt  >> europarl-v7.de-en.de\n```\n\n2. Pre-process the data (DE)\n\n```\n$ deepspeech-swiss-german/pre-processing/prepare_vocab.py europarl-v7.de-en.de exp_path/clean_vocab.txt\n```\n\n3. Build the Language Model (DE)\n```\n$ kenlm/build/bin/lmplz --text exp_path/clean_vocab.txt --arpa exp_path/words.arpa --o 3\n$ kenlm/build/bin/build_binary -T -s exp_path/words.arpa exp_path/de_lm.binary\n```\n\n#### NOTE: use [-S](https://kheafield.com/code/kenlm/estimation/) memoryuse_in_%, if malloc expection occurs\nExample:\n```\n$ kenlm/build/bin/lmplz --text exp_path/clean_vocab.txt --arpa exp_path/words.arpa --o 3 -S 50%\n```\n\n4. Build Trie (DE)\n```\n$ DeepSpeech/native_client/generate_trie deepspeech-swiss-german/data/alphabet.txt path/de_lm.binary export_path/de_trie\n```\n\n\n### Training\n\nChange the path accordingly.\n\n```\n$ ./DeepSpeech.py --train_files train.csv --dev_files dev.csv --test_files test.csv --alphabet_config_path alphabet.txt --lm_trie_path trie --lm_binary_path lm.binary --test_batch_size 36 --train_batch_size 24 --dev_batch_size 36 --epochs 75 --learning_rate 0.0001 --dropout_rate 0.25 --export_dir ../models\n```\n\n### Training with Augmentation\n\nChange the path accordingly.\n\n```\n$ ./DeepSpeech.py --train_files train.csv --dev_files dev.csv --test_files test.csv --alphabet_config_path alphabet.txt --lm_trie_path trie --lm_binary_path lm.binary --test_batch_size 36 --train_batch_size 24 --dev_batch_size 36 --epochs 75 --learning_rate 0.0001 --dropout_rate 0.25 --export_dir ../models AUG_AUDIO=\"--data_aug_features_additive 0.2 --data_aug_features_multiplicative 0.2 --augmentation_speed_up_std 0.2\"  AUG_FREQ_TIME=\"--augmentation_freq_and_time_masking --augmentation_freq_and_time_masking_freq_mask_range 5 --augmentation_freq_and_time_masking_number_freq_masks 3 --augmentation_freq_and_time_masking_time_mask_range 2 --augmentation_freq_and_time_masking_number_time_masks 3\" AUG_PITCH_TEMPO=\"--augmentation_pitch_and_tempo_scaling --augmentation_pitch_and_tempo_scaling_min_pitch 0.95 --augmentation_pitch_and_tempo_scaling_max_pitch 1.2 --augmentation_pitch_and_tempo_scaling_max_tempo 1.2\" AUG_SPEC_DROP=\"--augmentation_spec_dropout_keeprate 0.2\"\n```\n\n\n### Results\n\nSome results from our findings.\n- English -> German -> Swiss : 56.6\n\n_NOTE: Refer our paper for more information._\n\n## Acknowledgments\n* [Prof. Dr.-Ing. Torsten Zesch](https://www.ltl.uni-due.de/team/torsten-zesch) - Co-Author\n \n## References\nIf you use our findings/scripts in your academic work, please cite:\n```\n\n```\n"
  },
  {
    "path": "facts/ASR/data/alphabet.txt",
    "content": "# Each line in this file represents the Unicode codepoint (UTF-8 encoded)\n# associated with a numeric label.\n# A line that starts with # is a comment. You can escape it with \\# if you wish\n# to use '#' as a label.\n \na\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nw\nx\ny\nz\nä\nö\nü\n0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n\n# The last (non-comment) line needs to end with a newline.\n"
  },
  {
    "path": "facts/ASR/pre-processing/audio.py",
    "content": "# Author: Mozilla DeepSpeech v0.4.0\n\nimport numpy as np\nimport scipy.io.wavfile as wav\n\nfrom python_speech_features import mfcc\n\n\ndef audiofile_to_input_vector(audio_filename, numcep, numcontext):\n  \n    \"\"\"\n    Given a WAV audio file at ``audio_filename``, calculates ``numcep`` MFCC features\n    at every 0.01s time step with a window length of 0.025s. Appends ``numcontext``\n    context frames to the left and right of each time step, and returns this data\n    in a numpy array.\n    \"\"\"\n    # Load wav files\n    fs, audio = wav.read(audio_filename)\n\n    # Get mfcc coefficients\n    features = mfcc(audio, samplerate=fs, numcep=numcep, winlen=0.032, winstep=0.02, winfunc=np.hamming)\n\n    # Add empty initial and final contexts\n    empty_context = np.zeros((numcontext, numcep), dtype=features.dtype)\n    features = np.concatenate((empty_context, features, empty_context))\n\n    return features\n"
  },
  {
    "path": "facts/ASR/pre-processing/ch_De_prep.py",
    "content": "import os\nimport re\nimport sys\nimport codecs\nimport pandas as pd\nfrom sox import Transformer\n\nfiles = []\nSAMPLE_RATE = 16000\n\nsource_dir = os.getcwd()\ntrans_filename = sys.argv[1]\n\nALLOWED_CHARS = {\n    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',\n    'ä', 'ö', 'ü',\n    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n    ' ',\n    #',', ';', ':', '.', '?', '!',\n}\nWHITESPACE_REGEX = re.compile(r'[ \\t]+')\n\ndef preprocess_transcript_for_corpus(transcript):\n    transcript = transcript.lower()\n    transcript = transcript.replace('á', 'a')\n    transcript = transcript.replace('à', 'a')\n    transcript = transcript.replace('â', 'a')\n    transcript = transcript.replace('ç', 'c')\n    transcript = transcript.replace('é', 'e')\n    transcript = transcript.replace('è', 'e')\n    transcript = transcript.replace('ê', 'e')\n    transcript = transcript.replace('í', 'i')\n    transcript = transcript.replace('ì', 'i')\n    transcript = transcript.replace('î', 'i')\n    transcript = transcript.replace('ñ', 'n')\n    transcript = transcript.replace('ó', 'o')\n    transcript = transcript.replace('ò', 'o')\n    transcript = transcript.replace('ô', 'o')\n    transcript = transcript.replace('ú', 'u')\n    transcript = transcript.replace('ù', 'u')\n    transcript = transcript.replace('û', 'u')\n    transcript = transcript.replace('ș', 's')\n    transcript = transcript.replace('ş', 's')\n    transcript = transcript.replace('ß', 'ss')\n    transcript = transcript.replace('-', ' ')\n    # Not used consistently, better to replace with space as well\n    transcript = transcript.replace('–', ' ')\n    transcript = transcript.replace('/', ' ')\n    transcript = WHITESPACE_REGEX.sub(' ', transcript)\n    transcript = ''.join([char for char in transcript if char in ALLOWED_CHARS])\n    transcript = WHITESPACE_REGEX.sub(' ', transcript)\n    transcript = transcript.strip()\n\n    return transcript\n\nwith codecs.open(trans_filename, \"r\", \"utf-8\") as fin:\n    next(fin)\n    for line in fin:\n        # Parse each segment line\n        columns = line.strip().split('\\t')\n        client_id = columns[0]\n        path = columns[1]\n        transcript = columns[2]\n        transcript = preprocess_transcript_for_corpus(transcript)\n\n        # Convert corresponding FLAC to a WAV\n        flac_file = os.path.join(source_dir, 'clips', path)\n        wav_file = os.path.join(source_dir, 'clips', path.split('.')[0] + '.wav')\n\n        if not os.path.exists(wav_file):\n            tfm = Transformer()\n            tfm.set_output_format(rate=SAMPLE_RATE)\n            tfm.build(flac_file, wav_file)\n            print('Converting flac file {} to wav format {}.'.format(flac_file, wav_file))\n\n        wav_filesize = os.path.getsize(wav_file)\n        files.append((client_id, os.path.abspath(wav_file), wav_filesize, transcript))\n\n    df = pd.DataFrame(data=files, columns=[\"client id\", \"wav_filename\", \"wav_filesize\", \"transcript\"])\n    # Write sets to disk as CSV files\n    df.to_csv(os.path.join(source_dir, trans_filename.split('.')[0]+\".csv\"), index=False)\n"
  },
  {
    "path": "facts/ASR/pre-processing/corpus_cleaning.py",
    "content": "# -*- coding: utf-8 -*-\n\nimport string\nimport collections\nimport re\n\nimport num2words\n\n#\n#   Number patterns\n#\nint_pattern = re.compile(r'[0-9]+')\nfloat_pattern = re.compile(r'[0-9]+[,\\.][0-9]+')\n\n#\n#   Allowed characters a-zA-Z'äüö\n#\nallowed = list(string.ascii_lowercase)\nallowed.append(\"'\")\nallowed.append(' ')\nallowed.extend(list('äöü'))\n\n#\n#   Replacement characters\n#\nreplacer = {\n    'àáâãåāăąǟǡǻȁȃȧ': 'a',\n    'æǣǽ': 'ä',\n    'çćĉċč': 'c',\n    'ďđ': 'd',\n    'èéêëēĕėęěȅȇȩε': 'e',\n    'ĝğġģǥǧǵ': 'g',\n    'ĥħȟ': 'h',\n    'ìíîïĩīĭįıȉȋ': 'i',\n    'ĵǰ': 'j',\n    'ķĸǩǩκ': 'k',\n    'ĺļľŀł': 'l',\n    'м': 'm',\n    'ñńņňŉŋǹ': 'n',\n    'òóôõøōŏőǫǭǿȍȏðο': 'o',\n    'œ': 'ö',\n    'ŕŗřȑȓ': 'r',\n    'śŝşšș': 's',\n    'ţťŧț': 't',\n    'ùúûũūŭůűųȕȗ': 'u',\n    'ŵ': 'w',\n    'ýÿŷ': 'y',\n    'źżžȥ': 'z',\n    'ß': 'ss',\n    '-­': ' '\n}\n\n#\n#   Various replacement rules\n#\n\nspecial_replacers = {\n    ' $ ': 'dollar',\n    ' £ ': 'pfund',\n    'm³': 'kubikmeter',\n    'km²': 'quadratkilometer',\n    'm²': 'quadratmeter'\n}\n\nreplacements = {}\nreplacements.update(special_replacers)\n\nfor all, replacement in replacer.items():\n    for to_replace in all:\n        replacements[to_replace] = replacement\n\n\n#\n#   Utils\n#\n\ndef replace_symbols(word):\n    \"\"\" Apply all replacement characters/rules to the given word. \"\"\"\n    result = word\n\n    for to_replace, replacement in replacements.items():\n        result = result.replace(to_replace, replacement)\n\n    return result\n\n\ndef remove_symbols(word):\n    \"\"\" Remove all symbols that are not allowed. \"\"\"\n    result = word\n    bad_characters = []\n\n    for c in result:\n        if c not in allowed:\n            bad_characters.append(c)\n\n    for c in bad_characters:\n        result = result.replace(c, '')\n\n    return result\n\n\ndef word_to_num(word):\n    \"\"\" Replace numbers with their written representation. \"\"\"\n    result = word\n\n    match = float_pattern.search(result)\n\n    while match is not None:\n        num_word = num2words.num2words(float(match.group().replace(',', '.')), lang='de').lower()\n        before = result[:match.start()]\n        after = result[match.end():]\n        result = ' '.join([before, num_word, after])\n        match = float_pattern.search(result)\n\n    match = int_pattern.search(result)\n\n    while match is not None:\n        num_word = num2words.num2words(int(match.group()), lang='de')\n        before = result[:match.start()]\n        after = result[match.end():]\n        result = ' '.join([before, num_word, after])\n        match = int_pattern.search(result)\n\n    return result\n\n\ndef get_bad_character(text):\n    \"\"\" Return all characters in the text that are not allowed. \"\"\"\n    bad_characters = set()\n\n    for c in text:\n        if c not in allowed:\n            bad_characters.add(c)\n\n    return bad_characters\n\n\ndef clean_word(word):\n    \"\"\"\n    Clean the given word.\n\n    1. numbers to words\n    2. character/rule replacements\n    3. delete disallowed symbols\n    \"\"\"\n    word = word.lower()\n    word = word_to_num(word)\n    word = replace_symbols(word)\n    word = remove_symbols(word)\n\n    bad_chars = get_bad_character(word)\n\n    if len(bad_chars) > 0:\n        print('Bad characters in \"{}\"'.format(word))\n        print('--> {}'.format(', '.join(bad_chars)))\n\n    return word\n\n\ndef clean_sentence(sentence):\n    \"\"\"\n    Clean the given sentence.\n\n    1. split into words by spaces\n    2. numbers to words\n    3. character/rule replacements\n    4. delete disallowed symbols\n    4. join with spaces\n    \"\"\"\n    words = sentence.strip().split(' ')\n    cleaned_words = []\n\n    for word in words:\n        cleaned_word = clean_word(word)\n        cleaned_words.append(cleaned_word)\n\n    return ' '.join(cleaned_words)\n"
  },
  {
    "path": "facts/ASR/pre-processing/finden_files.py",
    "content": "import pandas as pd\nfrom audio import audiofile_to_input_vector\nN_CONTEXT = 9\n\ndf = pd.read_csv('tuda-de.csv')\n\ndef aftiv_length(row):\n    return audiofile_to_input_vector(row['wav_filename'], 26, N_CONTEXT).shape[0] - 2*N_CONTEXT\n\ndef trans_length(row):\n    return len(row['transcript'])\n\ndf['aftiv_len'] = df.apply(aftiv_length, axis=1)\ndf['trans_len'] = df.apply(trans_length, axis=1)\ndf['good_flag'] = df.aftiv_len > df.trans_len\n\ndf.to_csv(\"final.csv\")\n"
  },
  {
    "path": "facts/ASR/pre-processing/folien.py",
    "content": "#checking if the file exists\n\n# Contributor: Aashish Agarwal\n\nimport os\nimport csv\n\nwith open('/home/LTLab.lan/agarwal/german-speech-corpus/') as csv_file:\n    csv_reader = csv.reader(csv_file, delimiter=',')\n    line_count = 0\n    for row in csv_reader:\n        print(row[0])\n        exists = os.path.isfile(row[0])\n        if exists:\n            temp=1\n        else:\n            print(\"Does not exist:\" + row[0])\n"
  },
  {
    "path": "facts/ASR/pre-processing/prep_vocab.py",
    "content": "#! /usr/bin/env python\n\n\"\"\"\n1. Load text corpus\n2. Clean text\n3. Extend with transcriptions from training data\n4. Save\n\"\"\"\n\nimport os\nimport sys\n\nsys.path.append(os.path.abspath(os.path.join(__file__, os.path.pardir)))\n\nimport argparse\nfrom audiomate.utils import textfile\n\nimport text_cleaning\n\n\ndef read_training_transcripts(path):\n    transcripts = []\n\n    for entry in textfile.read_separated_lines_generator(path, separator=',', max_columns=3,\n                                                         ignore_lines_starting_with=['wav_filename']):\n        transcripts.append(entry[2])\n\n    return transcripts\n\n\nparser = argparse.ArgumentParser(description='Clean text corpus.')\nparser.add_argument('source_path', type=str)\nparser.add_argument('target_path', type=str)\nparser.add_argument('--training_csv', type=str)\n\nargs = parser.parse_args()\n\nindex = 0\n\nwith open(args.source_path, 'r') as source_file, open(args.target_path, 'w') as target_file:\n    for index, line in enumerate(source_file):\n        cleaned_sentence = text_cleaning.clean_sentence(line)\n        target_file.write('{}\\n'.format(cleaned_sentence))\n\n        if index % 1000 == 0:\n            print(index)\n\n    print('Cleaned {} lines!'.format(index))\n\n    if args.training_csv is not None:\n        training_transcripts = read_training_transcripts(args.training_csv)\n        target_file.write('\\n'.join(training_transcripts))\n\n        print('Added {} transcripts from training data!'.format(len(training_transcripts)))\n"
  },
  {
    "path": "facts/ASR/pre-processing/prepare_data.py",
    "content": "#! /usr/bin/env python\n\n\"\"\"\n1. Load all corpora where a path is given.\n2. Clean transcriptions.\n3. Merge all corpora\n4. Create Train/Dev/Test splits\n5. Export for DeepSpeech\n\"\"\"\n\nimport os\nimport sys\n\nsys.path.append(os.path.abspath(os.path.join(__file__, os.path.pardir)))\n\nimport argparse\n\nimport audiomate\nfrom audiomate.corpus import io\nfrom audiomate.corpus import subset\n\nimport text_cleaning\n\n\ndef clean_transcriptions(corpus):\n    for utterance in corpus.utterances.values():\n        ll = utterance.label_lists[audiomate.corpus.LL_WORD_TRANSCRIPT]\n\n        for label in ll:\n            label.value = text_cleaning.clean_sentence(label.value)\n\n\nif __name__ == '__main__':\n    parser = argparse.ArgumentParser(description='Prepare data for training.')\n    parser.add_argument('target_path', type=str)\n    parser.add_argument('--tuda', type=str)\n    parser.add_argument('--voxforge', type=str)\n    parser.add_argument('--swc', type=str)\n    parser.add_argument('--mailabs', type=str)\n    parser.add_argument('--cv', type=str)\n\n    args = parser.parse_args()\n\n    tuda_path = args.tuda\n    voxforge_path = args.voxforge\n    swc_path = args.swc\n    mailabs_path = args.mailabs\n    cv_path = args.cv\n\n    corpora = []\n\n    if tuda_path is not None:\n        tuda_corpus = audiomate.Corpus.load(tuda_path, reader='tuda')\n        corpora.append(tuda_corpus)\n\n    if voxforge_path is not None:\n        voxforge_corpus = audiomate.Corpus.load(\n            voxforge_path, reader='voxforge')\n        corpora.append(voxforge_corpus)\n\n    if swc_path is not None:\n        swc_corpus = audiomate.Corpus.load(swc_path, reader='kaldi')\n        corpora.append(swc_corpus)\n\n    if mailabs_path is not None:\n        mailabs_corpus = audiomate.Corpus.load(mailabs_path, reader='mailabs')\n        corpora.append(mailabs_corpus)\n\n    if cv_path is not None:\n        cv_corpus = audiomate.Corpus.load(cv_path, reader='common-voice')\n        corpora.append(cv_corpus)\n\n    if len(corpora) <= 0:\n        raise ValueError('No Corpus given!')\n\n    merged_corpus = audiomate.Corpus.merge_corpora(corpora)\n    clean_transcriptions(merged_corpus)\n\n    splitter = subset.Splitter(merged_corpus, random_seed=38)\n    splits = splitter.split_by_length_of_utterances(\n        {'train': 0.7, 'dev': 0.15, 'test': 0.15}, separate_issuers=True)\n\n    merged_corpus.import_subview('train', splits['train'])\n    merged_corpus.import_subview('dev', splits['dev'])\n    merged_corpus.import_subview('test', splits['test'])\n\n    deepspeech_writer = io.MozillaDeepSpeechWriter()\n    deepspeech_writer.save(merged_corpus, args.target_path)\n"
  },
  {
    "path": "facts/ASR/pre-processing/shuffle_split.py",
    "content": "import sys\nimport pandas as pd\nfrom sklearn.model_selection import train_test_split\n\ndf = pd.read_csv(sys.argv[1])\ntrain, dev_test = train_test_split(df, test_size=0.3, shuffle=True, random_state=42)\ndev, test = train_test_split(dev_test, test_size=0.5, shuffle=True, random_state=42)\n\ntrain.to_csv('train.csv', index=False)\ndev.to_csv('dev.csv', index=False)\ntest.to_csv('test.csv', index=False)\n    \n"
  },
  {
    "path": "facts/ASR/pre-processing/utf_8.sh",
    "content": "#!/bin/bash\n# file name: to_utf8\n# Coder: Aashish Agarwal\n\nFILES=\"voxforge/*/etc/prompts-original\"\n#FILES=\"voxforge/*/etc/PROMPTS\"\n\nfor f in $FILES\ndo\n  #filename=\"${f%.*}\"\n  #echo -n \"$f\"\n  #file -I $f\n  encoding=$(file -i \"$f\" | sed \"s/.*charset=\\(.*\\)$/\\1/\")\n  #if file -I $f | grep -wq \"iso-8859-1\"\n  if [  \"${encoding}\" = \"iso-8859-1\" ]\n  then\n    #mkdir -p converted\n    #cp $f ./converted\n    iconv -f ISO-8859-1 -t UTF-8 $f > \"${f}_utf8.tex\"\n    mv \"${f}_utf8.tex\" $f\n    echo \": CONVERTED TO UTF-8.\"\n  else\n    echo \": UTF-8 ALREADY.\"\n  fi\ndone\n"
  },
  {
    "path": "facts/GAN.md",
    "content": "Speical Contribution from Feng Yao who wrote the codes about classical GANs were implemented with simple network structure and tested by MNIST dataset.   \n learn how others implement the GANs, and finally, enjoy the magic of GANs. \n\n\n***************\n\nAll have been tested with python2.7+ and tensorflow1.0+ in linux.  \n\n* Datas: save training data.  \n* Samples: save generated data, each folder contains several figs to **show the results**.  \n* utils: contains 2 files  \n\t- data.py: prepreocessing data.  \n\t- nets.py: Generator and Discriminator are saved here.  \n\t\nNote:  \n> The final layer can be sigmoid(data: [0,1]) or tanh(data:[-1,1]), my codes all use sigmoid.  \n> Using weights_initializer=tf.random_normal_initializer(0, 0.02) will converge faster.  \n\n**DCGAN**  \n\n- [x] conv   \n\n\n**Conditional GAN**  \n\n- [x] condition + mlp `D:G = 1:1`\n- [x] condition + conv(dcgan)  `D:G=1:1 faster than mlp`\n- [x] dcgan + classifier `D:G:C = 1:1:1 very fast`\n- [x] wgan + classifier `D:G:C = 5:1:1  fast`\n\n\nNote:\n> a. The step ratio of G and D is important and it takes some time to reach the balance. Condition+mlp with D:G = 1:1 works better than 2:1.   \n> b. Adding a classfier to trained with conditions and constraint G works faster and better than appending conditions to images for D training.  \n\n\n**Wasserstein GAN**\n\n- [x] wgan + mlp `D:G = 5: 1 not good, need to *modify*`\n- [x] wgan + conv(dcgan) `D:G = 5:1 clip = 0.01`\n\n\n**infoGAN**\n\n- [x] infogan + mlp + D and Q not share `Q loss to update G(as feedback) not  good `\n- [x] infogan + mlp + D and Q share `not  good. lacking numbers`\n- [x] infogan + conv + D and Q not share `clear and have 10 number`\n- [x] infogan + conv + D and Q share `the same with not share, not faster? `\n- [ ] infogan + wgan + D and Q not share `to be done`  \n\nResults are shown in the end of this page.   \n\n# Adversarial Nets  \n\n:sparkles: GAN  \n--------\n**The beginning.**  \nThe first paper.   \n\nTwo main research directions:  \n1. stabilize the training  \n2. apply GAN  \n### paper  \n[[Generative Adversarial Nets]](https://arxiv.org/pdf/1406.2661.pdf)   \n\n- **Loss** :  \n![GAN loss](README/images/gan.png)  \n\n### blog\n[[openai/generative-models]](https://blog.openai.com/generative-models/#contributions) (Motivation, Game Theory)   \n[[wiseodd/gan-tensorflow]](http://wiseodd.github.io/techblog/2016/09/17/gan-tensorflow/) (Introduction, Implementation)  \n\n\n ***************\n \n:sparkles:DCGAN  \n--------\n**stabilize the training with some architectural constraints.**  \nGAN is hard to train.   \nStabilize Generative Adversarial networks with some architectural constraints.  \nPopular used in cv. Most used architecture.  \n\n### paper  \n[[Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks]](https://arxiv.org/pdf/1511.06434.pdf)  \n\n**Architecture guidelines for stable Deep Convolutional GANs**  \n\n* Replace any pooling layers with strided convolutions (discriminator) and fractional-strided convolutions (generator).  \n* Use batchnorm in both the generator and the discriminator  \n* Remove fully connected hidden layers for deeper architectures. Just use average pooling at the end.  \n* Use ReLU activation in generator for all layers except for the output, which uses Tanh.\n* Use LeakyReLU activation in the discriminator for all layers.  \n\n\n### blog\n[[bamos/deep-completion]](http://bamos.github.io/2016/08/09/deep-completion/)  (Introduction, Implementation)  \n\n### code\n[[carpedm20/DCGAN-tensorflow]](https://github.com/carpedm20/DCGAN-tensorflow)( star 1.6k+,  many files, easy to run, hard to read and modify)  \n> G: fc-->reshape--> deconv bn relu (4) --> tanh  \n> D: conv bn lrelu[leak=0.2] (4) --> reshape--> fc(opn=1)-->sigmoid  \n> G Loss:   \n>\n\t\ttf.reduce_mean(sigmoid_cross_entropy_with_logits(self.D_logits_,tf.ones_like(self.D_)))\n> D Loss:   \n>\n\t\ttf.reduce_mean(sigmoid_cross_entropy_with_logits(self.D_logits, tf.ones_like(self.D))) + tf.reduce_mean(sigmoid_cross_entropy_with_logits(self.D_logits_, tf.zeros_like(self.D_)))\n> Solver: Adam lr=0.0002  stepG:stepD=1:1   \n> Data: mnist celebA __normalized to [-1,1] for tanh  and  [0,1] for sigmoid__  \n\n[[sugyan/tf-dcgan]](https://github.com/sugyan/tf-dcgan)( star 20,  easy to read, just 1 dcgan file. dcgan, generator, discriminator all class. not tf.contrib.layers. )  \n> G: fc-->reshape--> deconv bn relu (4) --> tanh  \n> D: conv bn lrelu[leak=0.2] (4) --> reshape--> fc(opn=2 one-hot?)  \n> Losses:  softmax_cross_entropy_with_logits  \n> Solver: Adam lr=0.0002  stepG:stepD=1:1   \n\n\n ***************\n \n:sparkles:Conditional GAN  \n--------\n**Apply GAN by adding condition(supervised)**  \nAdd conditions to GAN by feeding y to G.   \nG(z)-->G(z,y)  D(X)-->D(X,y)  \n- z: the same as in GAN. unconstrained noise to generate a image.  \n- y: the condition to constraint the network. supervised.  \nA very important structure that used in image applications (data augmentation, image transfer, etc.)   \nMake GAN useful.   \n\n### paper\n[[Conditional Generative Adversarial Nets]](https://arxiv.org/pdf/1411.1784.pdf)  \n\n- **Loss** :  \n![CGAN loss](README/images/cgan.png)   \n\n### blog\n[[wiseodd/conditional-gan-tensorflow]](http://wiseodd.github.io/techblog/2016/12/24/conditional-gan-tensorflow/)  (Fomulation, Architecture, Implementation)  \n\n### code\n[[wiseodd/conditional_gan]](https://github.com/wiseodd/generative-models/blob/master/GAN/conditional_gan/cgan_tensorflow.py)(star 500+, very simple, 1 file, easy to read and run,  not conv, inconvinient to extend)  \n> G: concat(z,y)-->fc-->sigmoid  \n> D: concat(z,y)-->fc-->sigmoid loss  \n> Solver: Adam lr=0.001  stepG:stepD=1:1   \n> Data: mnist __[0,1]__  \n\n[[zhangqianhui/Conditional-Gans]](https://github.com/zhangqianhui/Conditional-Gans)(star 16, easy to extend)  \n> G: concat(z,y)-->fc-->conv-->sigmoid  \n> D: **conv_concat(x,y)**-->conv-->fc-->sigmoid loss  \n> Solver: Adam lr=0.0002  stepG:stepD=2:1   \n> Data: mnist __[0,1]__  \n\n[[fairytale0011/Conditional-WassersteinGAN]](https://github.com/fairytale0011/Conditional-WassersteinGAN/blob/master/WGAN_AC.py) (star 6. use wgan to train GAN, use separate classifier to enforce the condition. very clear, easy to read and modify)  \n> G: concat(z,y)-->fc-->conv-->tanh  \n> D: X-->conv-->fc-->sigmoid loss  \n> **classifier**: X-->conv-->fc-->softmax loss (real label to train classifier, fake label to train G)   \n> clip D var  \n> Solver: RMS  lr=0.0002  stepG:stepD:stepC_real:stepC_fake=1:10:0.5:0.5   \n> Data: mnist __[-1,1]__  \n\n\n ***************\n\n:sparkles:Wasserstein GAN\n--------\n**stabilize the training by using Wasserstein-1 distance**  \nGAN before using JS divergence has the problem of non-overlapping, leading to mode collapse and convergence difficulty.   \nUse EM distance or Wasserstein-1 distance, so GAN solve the two problems above without particular architecture (like dcgan).   \n\n### paper\n[[Wasserstein GAN]](https://arxiv.org/pdf/1701.07875.pdf)\n\n**Algorithm guidelines for stable GANs**  \n\n* No log in the loss. The output of D is no longer a probability, hence we do not apply sigmoid at the output of D\n* Clip the weight of D (0.01)\n* Train D more than G (5:1)\n* Use RMSProp instead of ADAM\n* Lower learning rate (0.00005)\n\n### blog\n[[AidenN/WassersteinGAN]](https://paper.dropbox.com/doc/Wasserstein-GAN-GvU0p2V9ThzdwY3BbhoP7)  (Theory)  \n[[wiseodd/wasserstein-gan]](http://wiseodd.github.io/techblog/2017/02/04/wasserstein-gan/)  (Introduction, Implementation)  \n[[zhihu/Wassertein GAN]](https://zhuanlan.zhihu.com/p/25071913)   (Introduction, Analysis)  \n\n### code\n[[wiseodd/wgan_tensorflow]](https://github.com/wiseodd/generative-models/blob/master/GAN/wasserstein_gan/wgan_tensorflow.py)(very simple, use mlp)  \n> G: fc-->sigmoid  \n> D: fc  clip D  \n> G Loss:   \n>\n\t\tG_loss = -tf.reduce_mean(D_fake)\n> D Loss:   \n>\n\t\tD_loss = tf.reduce_mean(D_fake) - tf.reduce_mean(D_real) \n> Solver: RMSProp lr=0.0001  stepG:stepD=1:5   \n\n\n****************\n\n:sparkles:InfoGAN\n--------\n**Apply GAN by learning conditions(unsupervised)**  \nAttempt to make conditional learned automatically. Find and control some useful information in the images.  \n- z: the same as in GAN. unconstrainted noise to generate a image.  \n- c: like c in conditional GAN, but learned by Q instead of given what that is, unsupervised.  \n\n### paper\n[[InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets]](https://arxiv.org/pdf/1606.03657.pdf)\n\n- **Loss** :\n\n![infoGAN loss 1](README/images/infogan1.png)   \n\nDefine: Q(c|x) to approximate P(c|x)(which is the conditional distribution)  \n\n![infoGAN loss 2](README/images/infogan2.png)   \n\n### blog\n[[wiseodd/infogan]](http://wiseodd.github.io/techblog/2017/01/29/infogan/)  (Introduction Implementation)  \n\n### code\n[[openai/infogan]](https://github.com/openai/InfoGAN)( star 300+,  hard to read and modify, too much files)  \n> G: fc(1024 bn relu)-->fc (bn relu) reshape--> deconv bn relu --> deconv flatten--> activate  \n> D and Q:   \n> shared: reshape-->conv lrelu --> conv bn lrelu --> fc bn lrelu   \n> D: fc(1) --> activate  \n> Q: fc(128) bn lrelu --> fc (c_dim) --> activate    \n> activate: softmax(Categorical)  / mean stddev:sqrt(e^x) (Gaussian) / sigmoid(Bernoulli)  \n> Losses:   \n> D and G: sigmoid as DCGAN   \n> Q: cross entropy loss (softmax for discrete) ** add Q loss to D and G loss **  \n> Solver:   \n> Adam beta1=0.5 stepG:stepD=1:1   \n\n*my understanding*:   \n> Adding Q loss to D and G loss, then updating D var and G var by 1:1 **equal to** Q loss to update Q(D) var and G var by Q:D:G=2:1:1  \n\n[[wiseodd/infogan-tensorflow]](https://github.com/wiseodd/generative-models/blob/master/GAN/infogan/infogan_tensorflow.py)(also simple, use mlp)  \n> Q: fc --> softmax with c (not share with D)  update vars: G and Q  \n> Solver: Adam G:D:Q = 1:1:1  \n\n# Results\nAll images shown here are from `./Samples`, for more information about results, please go to the folder.   \nThen first number of image name is the trianing epoches.   \nFor better observing, I keep generated images in the beginning, middle and final training process for each algorithm.  \n\n**Conditional GAN**  \n\n\n- [x] condition + mlp `each pic has the same condition`  \n\n![cgan](README/results/cgan_mlp.png)   \n \n \n- [x] condition + conv(dcgan)   `each row has the same condition: [0 0 0 0; 1 1 1 1; 2 2 2 2; 3 3 3 3]`    \n\n![cgan](https://raw.githubusercontent.com/YadiraF/GAN/master/Samples/mnist_cgan_conv/039_9.png)   \n\n- [x] dcgan + classifier `condition: [0 1 2 3; 4 5 6 7; 0 1 2 3; 4 5 6 7]  `\n\n![cgan](https://raw.githubusercontent.com/YadiraF/GAN/master/Samples/mnist_cgan_classifier/348_8.png)   \n\n- [x] wgan + classifier  `condition: [0 1 2 3; 4 5 6 7; 0 1 2 3; 4 5 6 7]  `\n\n![cgan](https://raw.githubusercontent.com/YadiraF/GAN/master/Samples/mnist_cgan_wgan_classifier/030_0.png)   \n\n\n\n**InfoGAN**  \nThe generated images with the same condition belong to the same category.  \n\n- [x] infogan + conv + D and Q not share `condition: [0 1 2 3; 4 5 6 7; 8 9 0 1; 2 3 4 5] `  \n\n![cgan](https://raw.githubusercontent.com/YadiraF/GAN/master/Samples/mnist_infogan_conv_without_share/058_8.png)   \n\n- [x] infogan + conv + D and Q share `condition: [0 1 2 3; 4 5 6 7; 8 9 0 1; 2 3 4 5] `  \n\n![cgan](https://raw.githubusercontent.com/YadiraF/GAN/master/Samples/mnist_infogan_conv/095_5.png)   \n\n\n\n**DCGAN**\n\n* 3D face result (dcgan)  \n![3d face](README/results/face3D_dcgan.png)   \n\n\n\n\n# Others\nTensorflow style: https://www.tensorflow.org/community/style_guide  \ntf.concat(1,[x,y]) in tf 0.12- --->  tf.concat([x,y],1) in tf 1.0+.  \nuse tf.get_Variable or tf.contrib.layers to reuse variables.  \n\nA good website to convert latex equation to img(then insert into README):\nhttp://www.sciweavers.org/free-online-latex-equation-editor \n\n\n\n"
  },
  {
    "path": "facts/chrütertee.java",
    "content": "// 1.  kau·der·welsch\n// 2. gruezi - \n// 3. chrütertee - tea with herbs\n\n\ndataType[] Wort;\n\n\n// declare an array\ndouble[] chrütertee;\n\n// allocate memory\nchrütertee = new double[10];\n\ndouble[] chrütertee = new double[10];\n\n//declare and initialize and array\nint[] chrütertee = {12, 4, 5, 2, 5};\n\n\nclass Main {\n public static void main(String[] args) {\n  \n   // create an array\n   int[] age = {12, 4, 5, 2, 5};\n\n   // access each array elements\n   System.out.println(\"Accessing Elements of Array:\");\n   System.out.println(\"First Element: \" + age[0]);\n   System.out.println(\"Second Element: \" + age[1]);\n   System.out.println(\"Third Element: \" + age[2]);\n   System.out.println(\"Fourth Element: \" + age[3]);\n   System.out.println(\"Fifth Element: \" + age[4]);\n }\n}\n\n\n\n//for loop in Java \n\nusing chrütertee \n\nfor (chrütertee 1; chrütertee 2; chrütertee 3) {\n  // code block to be executed\n}\n  \nfor (int chrütertee = 0; chrütertee < 5; chrütertee++) {\n  System.out.println(i);\n}\n\nfor (int schnäbichetsche = 0; i <= 10; i = i + 2) {\n  System.out.println(i);\n}\n\n//syntax\nfor (type variableName : arrayName) {\n  // code block to be executed\n}\n\n// \nString[] habibi = {\"schnäbichetsche \", \"chrütertee\", \"wallah\", \"habibi\"};\nfor (String i : wallah) {\n  System.out.println(i);\n}\n\n//ETH: Eidgenössische Technische Hochschule Zürich\n\nwallah: \n"
  },
  {
    "path": "facts/semantiks.md",
    "content": "# Semantic-Segmentation\n\n- NLP technologies deconstruct words, sentences, paragraphs, and entire documents expressed in human language and map them onto a semantic structure that can be used by a computer.\n\nA list of all papers and resoureces on Semantic Segmentation.\n\n# Dataset importance\n![Dataset importance plot](http://www.it-caesar.com/github/Dataset_importance.png?raw=true \"Dataset importance plot\")\n\n# SemanticSegmentation_DL\nSome implementation of semantic segmantation for DL model</br>\n## Dataset\n+ [voc2012](http://host.robots.ox.ac.uk/pascal/VOC/voc2012/)\n+ [CitySpaces](https://www.cityscapes-dataset.com/)\n+ [Mapillary](https://www.mapillary.com/dataset/vistas)\n+ [ADE20K](http://groups.csail.mit.edu/vision/datasets/ADE20K/)\n+ [PASCAL Context](http://www.cs.stanford.edu/~roozbeh/pascal-context/)\n+ [COCO-Stuff 10K dataset v1.1](https://github.com/nightrome/cocostuff)\n+ [2D-3D-S dataset](http://buildingparser.stanford.edu/dataset.html)\n+ [Mapillary Vistas](https://www.youtube.com/karolmajek)\n+ [Stanford Background Dataset](http://dags.stanford.edu/projects/scenedataset.html)\n+ [Sift Flow Dataset](http://people.csail.mit.edu/celiu/SIFTflow/)\n+ [Barcelona Dataset](http://www.cs.unc.edu/~jtighe/Papers/ECCV10/)\n+ [Microsoft COCO dataset](http://mscoco.org/)\n+ [MSRC Dataset](http://research.microsoft.com/en-us/projects/objectclassrecognition/)\n+ [LITS Liver Tumor Segmentation Dataset](https://competitions.codalab.org/competitions/15595)\n+ [KITTI](http://www.cvlibs.net/datasets/kitti/eval_road.php)\n+ [Pascal Context](http://www.cs.stanford.edu/~roozbeh/pascal-context/)\n+ [Data from Games dataset](https://download.visinf.tu-darmstadt.de/data/from_games/)\n+ [Human parsing dataset](https://github.com/lemondan/HumanParsing-Dataset)\n+ [Mapillary Vistas Dataset](https://www.mapillary.com/dataset/vistas)\n+ [Microsoft AirSim](https://github.com/Microsoft/AirSim)\n+ [MIT Scene Parsing Benchmark](http://sceneparsing.csail.mit.edu/)\n+ [COCO 2017 Stuff Segmentation Challenge](http://cocodataset.org/#stuff-challenge2017)\n+ [ADE20K Dataset](http://groups.csail.mit.edu/vision/datasets/ADE20K/)\n+ [INRIA Annotations for Graz-02](http://lear.inrialpes.fr/people/marszalek/data/ig02/)\n+ [Daimler dataset](http://www.gavrila.net/Datasets/Daimler_Pedestrian_Benchmark_D/daimler_pedestrian_benchmark_d.html)\n+ [ISBI Challenge: Segmentation of neuronal structures in EM stacks](http://brainiac2.mit.edu/isbi_challenge/)\n+ [INRIA Annotations for Graz-02 (IG02)](https://lear.inrialpes.fr/people/marszalek/data/ig02/)\n+ [Pratheepan Dataset](http://cs-chan.com/downloads_skin_dataset.html)\n+ [Clothing Co-Parsing (CCP) Dataset](https://github.com/bearpaw/clothing-co-parsing)\n\n## Resources\n\n\n## Survey papers\n- A 2017 Guide to Semantic Segmentation with Deep Learning by Qure AI [[Blog about different sem. segm. methods]](http://blog.qure.ai/notes/semantic-segmentation-deep-learning-review)\n- A Review on Deep Learning Techniques Applied to Semantic Segmentation [[Survey paper with a special focus on datasets and the highest performing methods]](https://arxiv.org/abs/1704.06857)\n- Computer Vision for Autonomous Vehicles: Problems, Datasets and State-of-the-Art [[Survey paper about all aspects of autonomous vehicles, including sem. segm.]](https://arxiv.org/abs/1704.05519) [[Webpage with a summary of all relevant publications]](http://www.cvlibs.net/projects/autonomous_vision_survey/)\n- A Survey on Deep Learning in Medical Image Analysis [[Paper]](https://arxiv.org/pdf/1702.05747）\n\n## Online demos\n- [CRF as RNN](http://www.robots.ox.ac.uk/~szheng/crfasrnndemo)\n- [SegNet](http://mi.eng.cam.ac.uk/projects/segnet/demo.php#demo)\n\n## 2D Semantic Segmentation\n### Papers:\n- [2019-CVPR oral] CLAN: Category-level Adversaries for Semantics Consistent [[`paper`]](https://arxiv.org/abs/1809.09478?context=cs) [[`code`]](https://github.com/RoyalVane/CLAN)\n\n- [2019-CVPR] BRS: Interactive Image Segmentation via Backpropagating Refinement Scheme(***) [[`paper`]](https://vcg.seas.harvard.edu/publications/interactive-image-segmentation-via-backpropagating-refinement-scheme/paper) [[`code`]](https://github.com/wdjang/BRS-Interactive_segmentation)\n\n- [2019-CVPR] DFANet：Deep Feature Aggregation for Real-Time Semantic Segmentation(used in camera) [[`paper`]](https://share.weiyun.com/5NgHbWH) [[`code`]](https://github.com/j-a-lin/DFANet_PyTorch)\n\n- [2019-CVPR] DeepCO3: Deep Instance Co-segmentation by Co-peak Search and Co-saliency [[`paper`]](http://cvlab.citi.sinica.edu.tw/images/paper/cvpr-hsu19.pdf) [[`code`]](https://github.com/KuangJuiHsu/DeepCO3)\n\n- [2019-CVPR] Domain Adaptation(reducing the domain shif) [[`paper`]](http://openaccess.thecvf.com/content_CVPR_2019/papers/Luo_Taking_a_Closer_Look_at_Domain_Shift_Category-Level_Adversaries_for_CVPR_2019_paper.pdf) \n\n- [2019-CVPR] ELKPPNet: An Edge-aware Neural Network with Large Kernel Pyramid Pooling for Learning Discriminative Features in Semantic- Segmentation [[`paper`]](https://arxiv.org/abs/1906.11428) [[`code`]](https://github.com/XianweiZheng104/ELKPPNet)\n\n- [2019-CVPR oral] GLNet: Collaborative Global-Local Networks for Memory-Efficient Segmentation of Ultra-High Resolution Images[[`paper`]](https://arxiv.org/abs/1905.06368) [[`code`]](https://github.com/chenwydj/ultra_high_resolution_segmentation)\n\n- [2019-CVPR] Instance Segmentation by Jointly Optimizing Spatial Embeddings and Clustering Bandwidth(***SOTA) [[`paper`]](https://arxiv.org/abs/1906.11109) [[`code`]](https://github.com/davyneven/SpatialEmbeddings)\n\n- [2019-ECCV] ICNet: Real-Time Semantic Segmentation on High-Resolution Images [[`paper`]](https://arxiv.org/abs/1704.08545) [[`code`]](https://github.com/oandrienko/fast-semantic-segmentation)\n\n- [2019-CVPR] LEDNet: A Lightweight Encoder-Decoder Network for Real-Time Semantic Segmentation(***SOTA) [[`paper`]](https://arxiv.org/abs/1905.02423) [[`code`]](https://github.com/xiaoyufenfei/LEDNet)\n\n- [2019-arXiv] LightNet++: Boosted Light-weighted Networks for Real-time Semantic Segmentation [[`paper`]](http://arxiv.org/abs/1605.02766) [[`code`]](https://github.com/ansleliu/LightNetPlusPlus)\n\n- [2019-CVPR] PTSNet: A Cascaded Network for Video Object Segmentation [[`paper`]](https://arxiv.org/abs/1907.01203) [[`code`]](https://github.com/sydney0zq/PTSNet)\n\n- [2019-CVPR] PPGNet: Learning Point-Pair Graph for Line Segment Detection [[`paper`]](https://www.aiyoggle.me/publication/ppgnet-cvpr19/ppgnet-cvpr19.pdf) [[`code`]](https://github.com/svip-lab/PPGNet)\n\n- [2019-CVPR] Show, Match and Segment: Joint Learning of Semantic Matching and Object Co-segmentation [[`paper`]](https://arxiv.org/abs/1906.05857) [[`code`]](https://github.com/YunChunChen/MaCoSNet-pytorch)\n\n- [2019-CVPR] Video Instance Segmentation [[`paper`]](https://arxiv.org/abs/1905.04804) [[`code`]](https://github.com/youtubevos/MaskTrackRCNN)\n+ Arxiv-2018 ExFuse: Enhancing Feature Fusion for Semantic Segmentation 87.9% mean Iou->voc2012 [[Paper]](https://arxiv.org/pdf/1804.03821.pdf)\n+ CVPR-2018 spotlight Learning to Adapt Structured Output Space for Semantic Segmentation  [[Paper]](https://arxiv.org/abs/1802.10349) [[Code]](https://github.com/wasidennis/AdaptSegNet)\n+ Arfix-2018 Adversarial Learning for Semi-supervised Semantic Segmentation [[Paper]](https://arxiv.org/abs/1802.07934) [[Code]](https://github.com/hfslyc/AdvSemiSeg)\n+ Arxiv-2018 Context Encoding for Semantic Segmentation [[Paper]](https://arxiv.org/pdf/1803.08904.pdf) [[Code]](https://github.com/zhanghang1989/MXNet-Gluon-SyncBN)\n+ CVPR-2018 Learning to Adapt Structured Output Space for Semantic Segmentation [[Paper]](https://arxiv.org/abs/1802.10349)[[Code]](https://github.com/wasidennis/AdaptSegNet)\n+ CVPR-2018 Dynamic-structured Semantic Propagation Network [[Paper]](https://arxiv.org/abs/1803.06067)\n+ Deeplab v4: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation [[Paper]](https://arxiv.org/pdf/1802.02611.pdf) [[Code]](https://github.com/tensorflow/models/tree/master/research/deeplab)\n+ Deep Value Networks Learn to Evaluate and Iteratively Refine Structured Outputs [[Paper]](https://arxiv.org/pdf/1703.04363.pdf)[[Code]](https://github.com/gyglim/dvn)\n+ ICCV-2017 Semantic Line Detection and Its Applications [[Paper]](http://openaccess.thecvf.com/content_ICCV_2017/papers/Lee_Semantic_Line_Detection_ICCV_2017_paper.pdf)\n+ ICCV-2017 Attentive Semantic Video Generation Using Captions [[Paper]](http://openaccess.thecvf.com/content_ICCV_2017/papers/Marwah_Attentive_Semantic_Video_ICCV_2017_paper.pdf)\n+ ICCV-2017 BlitzNet: A Real-Time Deep Network for Scene Understanding [[Paper]](https://arxiv.org/pdf/1708.02813.pdf) [[Code]](https://github.com/dvornikita/blitznet)\n+ ICCV-2017 SCNet: Learning Semantic Correspondence   [[Code]](https://github.com/k-han/SCNet)\n+ CVPR-2017 End-to-End Instance Segmentation with Recurrent Attention [[Code]](https://github.com/renmengye/rec-attend-public)\n+ CVPR-2017 Deep Watershed Transform for Instance Segmentation [[Code]](https://github.com/min2209/dwt)\n+ Piecewise Flat Embedding for Image Segmentation [[Paper]](https://pdfs.semanticscholar.org/4690/3c0ca5540e312b8f4c20c012f586e5071914.pdf)\n+ ICCV-2017 Curriculum Domain Adaptation for Semantic Segmentation of Urban Scenes [[Paper]](https://arxiv.org/abs/1707.09465)[[Code]](https://github.com/YangZhang4065/AdaptationSeg)\n+ CVPR-2017 Not All Pixels Are Equal: Difficulty-Aware Semantic Segmentation via Deep Layer Cascade-2017 [[Paper]](https://arxiv.org/abs/1704.01344)\n+ CVPR-2017 Annotating Object Instances with a Polygon-RNN-2017 [[Project]](http://www.cs.toronto.edu/polyrnn/) [[Paper]](https://arxiv.org/abs/1704.05548)\n+ CVPR-2017  Loss maxpooling for semantic image segmentation [[Paper]](http://openaccess.thecvf.com/content_cvpr_2017/papers/Bulo_Loss_Max-Pooling_for_CVPR_2017_paper.pdf)\n+ ICCV-2017 Scale-adaptive convolutions for scene parsing [[Paper]](https://pdfs.semanticscholar.org/f984/781ccef66e6a6114707271b8bb29148ad45d.pdf)\n+ Towards End-to-End Lane Detection: an Instance Segmentation Approach [[Paper]](https://arxiv.org/pdf/1802.05591.pdf)arxiv-1802\n+ AAAI-2018 Mix-and-Match Tuning for Self-Supervised Semantic Segmentation [[Paper]](https://arxiv.org/pdf/1712.00661.pdf) arxiv-1712\n+ NIPS-2017-Learning Affinity via Spatial Propagation Networks [[Paper]](https://papers.nips.cc/paper/6750-learning-affinity-via-spatial-propagation-networks.pdf)\n+ AAAI-2018-Spatial As Deep: Spatial CNN for Traffic Scene Understanding [[Paper]](https://arxiv.org/pdf/1712.06080.pdf)\n+ Stacked Deconvolutional Network for Semantic Segmentation-2017 [[Paper]](https://arxiv.org/pdf/1708.04943.pdf)</br>\n+ Deeplab v3: Rethinking Atrous Convolution for Semantic Image Segmentation-2017(DeeplabV3) [[Paper]](https://arxiv.org/pdf/1706.05587.pdf)</br>\n+ CVPR-2017 Learning Object Interactions and Descriptions for Semantic Image Segmentation-2017 [[Paper]](http://personal.ie.cuhk.edu.hk/~pluo/pdf/wangLLWcvpr17.pdf)</br>\n+ Pixel Deconvolutional Networks-2017 [[Code-Tensorflow]](https://github.com/HongyangGao/PixelDCN) [[Paper]](https://arxiv.org/abs/1705.06820)</br>\n+ Dilated Residual Networks-2017 [[Paper]](http://vladlen.info/papers/DRN.pdf)</br>\n+ A Review on Deep Learning Techniques Applied to Semantic Segmentation-2017 [[Paper]](https://arxiv.org/abs/1704.06857)</br>\n+ BiSeg: Simultaneous Instance Segmentation and Semantic Segmentation with Fully Convolutional Networks [[Paper]](https://arxiv.org/abs/1706.02135)</br>\n+ ICNet for Real-Time Semantic Segmentation on High-Resolution Images-2017 [[Project]](https://hszhao.github.io/projects/icnet/) [[Code]](https://github.com/hszhao/ICNet) [[Paper]](https://arxiv.org/abs/1704.08545) [[Video]](https://www.youtube.com/watch?v=qWl9idsCuLQ)</br>\n-  Feature Forwarding: Exploiting Encoder Representations for Efficient Semantic Segmentation-2017 [[Project]](https://codeac29.github.io/projects/linknet/) [[Code-Torch7]](https://github.com/e-lab/LinkNet)</br>\n-  Reformulating Level Sets as Deep Recurrent Neural Network Approach to Semantic Segmentation-2017 [[Paper]](https://arxiv.org/abs/1704.03593)</br>\n-  Adversarial Examples for Semantic Image Segmentation-2017 [[Paper]](https://arxiv.org/abs/1703.01101)</br>\n-  Large Kernel Matters - Improve Semantic Segmentation by Global Convolutional Network-2017 [[Paper]](https://arxiv.org/abs/1703.02719)</br>\n- HyperNet: Towards Accurate Region Proposal Generation and Joint Object Detection [[Paper]](https://arxiv.org/pdf/1604.00600)\n- Hypercolumns for Object Segmentation and Fine-grained Localization [[Paper]](https://arxiv.org/pdf/1411.5752)\n- Matching-CNN meets KNN: Quasi-parametric human parsing[[Paper]](https://www.cv-foundation.org/openaccess/content_cvpr_2015/app/1B_034_ext.pdf)\n- Deep Human Parsing with Active Template Regression [[Paper]](https://arxiv.org/pdf/1503.02391.pdf)\n- TPAMI-2012 **Learning Hierarchical Features for Scene Labeling** The first paper for applying dl on semantic segmentation !!! [[Paper]](http://yann.lecun.com/exdb/publis/pdf/farabet-pami-13.pdf)\n-  Label Refinement Network for Coarse-to-Fine Semantic Segmentation-2017 [[Paper]](https://www.arxiv.org/abs/1703.00551)\n- Laplacian Pyramid Reconstruction and Refinement for Semantic Segmentation [[Paper]](https://arxiv.org/pdf/1605.02264.pdf)\n- ParseNet: Looking Wider to See Better [[Paper]](https://www.cs.unc.edu/~wliu/papers/parsenet.pdf)\n- CVPR-2016 Recombinator Networks: Learning Coarse-to-Fine Feature Aggregation [[Paper]](http://openaccess.thecvf.com/content_cvpr_2016/papers/Honari_Recombinator_Networks_Learning_CVPR_2016_paper.pdf)\n-  **PixelNet: Representation of the pixels, by the pixels, and for the pixels-2017** [[Project]](http://www.cs.cmu.edu/~aayushb/pixelNet/) [[Code-Caffe]](https://github.com/aayushbansal/PixelNet) [[Paper]](https://arxiv.org/abs/1702.06506)</br>\n-  LabelBank: Revisiting Global Perspectives for Semantic Segmentation-2017 [[Paper]](https://arxiv.org/abs/1703.09891)</br>\n-  Progressively Diffused Networks for Semantic Image Segmentation-2017 [[Paper]](https://arxiv.org/abs/1702.05839)</br>\n-  Understanding Convolution for Semantic Segmentation-2017 [[Model-Mxnet]](https://drive.google.com/drive/folders/0B72xLTlRb0SoREhISlhibFZTRmM) [[Paper]](https://arxiv.org/abs/1702.08502) [[Code]](https://github.com/TuSimple/TuSimple-DUC)</br>\n-  ICCV-2017 Predicting Deeper into the Future of Semantic Segmentation-2017 [[Paper]](https://arxiv.org/abs/1703.07684)</br>\n-  CVPR-2017 **Pyramid Scene Parsing Network-2017** [[Project]](https://hszhao.github.io/projects/pspnet/) [[Code-Caffe]](https://github.com/hszhao/PSPNet) [[Paper]](https://arxiv.org/abs/1612.01105) [[Slides]](http://image-net.org/challenges/talks/2016/SenseCUSceneParsing.pdf)</br>\n-  FCNs in the Wild: Pixel-level Adversarial and Constraint-based Adaptation-2016 [[Paper]](https://arxiv.org/abs/1612.02649)</br>\n-  FusionNet: A deep fully residual convolutional neural network for image segmentation in connectomics-2016 [[Code-PyTorch]](https://github.com/GunhoChoi/FusionNet_Pytorch) [[Paper]](https://arxiv.org/abs/1612.05360)</br>\n-  RefineNet: Multi-Path Refinement Networks for High-Resolution Semantic Segmentation-2016 [[Code-MatConvNet]](https://github.com/guosheng/refinenet) [[Paper]](https://arxiv.org/abs/1611.06612)</br>\n-  CVPRW-2017 The One Hundred Layers Tiramisu: Fully Convolutional DenseNets for Semantic Segmentation [[Code-Theano]](https://github.com/SimJeg/FC-DenseNet) [[Code-Keras1]](https://github.com/titu1994/Fully-Connected-DenseNets-Semantic-Segmentation) [[Code-Keras2]](https://github.com/0bserver07/One-Hundred-Layers-Tiramisu) [[Paper]](https://arxiv.org/abs/1611.09326)</br>\n-  CVPR-2017 Full-Resolution Residual Networks for Semantic Segmentation in Street Scenes [[Code-Theano]](https://github.com/TobyPDE/FRRN) [[Paper]](https://arxiv.org/abs/1611.08323)</br>\n-  PixelNet: Towards a General Pixel-level Architecture-2016 [[Paper]](http://arxiv.org/abs/1609.06694)</br>\n-  Recalling Holistic Information for Semantic Segmentation-2016 [[Paper]](https://arxiv.org/abs/1611.08061)</br>\n-  Semantic Segmentation using Adversarial Networks-2016 [[Paper]](https://arxiv.org/abs/1611.08408) [[Code-Chainer]](https://github.com/oyam/Semantic-Segmentation-using-Adversarial-Networks)</br>\n-  Region-based semantic segmentation with end-to-end training-2016 [[Paper]](http://arxiv.org/abs/1607.07671)</br>\n-  Exploring Context with Deep Structured models for Semantic Segmentation-2016 [[Paper]](https://arxiv.org/abs/1603.03183)</\n- **Multi-scale context aggregation by dilated convolutions** [[Paper]](https://arxiv.org/pdf/1511.07122.pdf)\n-  Better Image Segmentation by Exploiting Dense Semantic Predictions-2016 [[Paper]](https://arxiv.org/abs/1606.01481)</br>\n- Boundary-aware Instance Segmentation-2016 [[Paper]](https://infoscience.epfl.ch/record/227439/files/HayderHeSalzmannCVPR17.pdf)</br>\n- Improving Fully Convolution Network for Semantic Segmentation-2016 [[Paper]](https://arxiv.org/abs/1611.08986)</br>\n- Deep Structured Features for Semantic Segmentation-2016 [[Paper]](https://arxiv.org/abs/1609.07916)</br>\n- DeepLab v2:Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs-2016** [[Project]](http://liangchiehchen.com/projects/DeepLab.html) [[Code-Caffe]](https://bitbucket.org/deeplab/deeplab-public/) [[Code-Tensorflow]](https://github.com/DrSleep/tensorflow-deeplab-resnet) [[Code-PyTorch]](https://github.com/isht7/pytorch-deeplab-resnet) [[Paper]](https://arxiv.org/abs/1606.00915)</br>\n- DeepLab v1: Semantic Image Segmentation With Deep Convolutional Nets and Fully Connected CRFs-2014** [[Code-Caffe1]](https://bitbucket.org/deeplab/deeplab-public/) [[Code-Caffe2]](https://github.com/TheLegendAli/DeepLab-Context) [[Paper]](http://arxiv.org/abs/1412.7062)</br>\n- Deep Learning Markov Random Field for Semantic Segmentation-2016 [[Project]](http://personal.ie.cuhk.edu.hk/~lz013/projects/DPN.html) [[Paper]](https://arxiv.org/abs/1606.07230)</br>\n- ECCV2016 Salient Deconvolutional Networks  [[Code]](https://github.com/aravindhm/deconvnet_analysis)\n-  Convolutional Random Walk Networks for Semantic Image Segmentation-2016 [[Paper]](https://arxiv.org/abs/1605.07681)</br>\n-  ENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentation-2016 [[Code-Caffe1]](https://github.com/e-lab/ENet-training)[[Code-Caffe2]](https://github.com/TimoSaemann/ENet) [[Paper]](https://arxiv.org/abs/1606.02147) [[Blog]](https://culurciello.github.io/tech/2016/06/20/training-enet.html)</br>\n-  High-performance Semantic Segmentation Using Very Deep Fully Convolutional Networks-2016 [[Paper]](https://arxiv.org/abs/1604.04339)</br>\n-  CVPR-2016-oral ScribbleSup: Scribble-Supervised Convolutional Networks for Semantic Segmentation-2016 [[Paper]](http://arxiv.org/abs/1604.05144)</br>\n-  Object Boundary Guided Semantic Segmentation-2016 [[Code-Caffe]](https://github.com/twtygqyy/obg_fcn) [[Paper]](http://arxiv.org/abs/1603.09742)</br>\n-  Segmentation from Natural Language Expressions-2016 [[Project]](http://ronghanghu.com/text_objseg/) [[Code-Tensorflow]](https://github.com/ronghanghu/text_objseg) [[Code-Caffe]](https://github.com/Seth-Park/text_objseg_caffe) [[Paper]](http://arxiv.org/abs/1603.06180)</br>\n-  Seed, Expand and Constrain: Three Principles for Weakly-Supervised Image Segmentation-2016 [[Code-Caffe]](https://github.com/kolesman/SEC) [[Paper]](https://arxiv.org/abs/1603.06098)</br>\n-  Global Deconvolutional Networks for Semantic Segmentation-2016 [[Paper]](https://arxiv.org/abs/1602.03930)</br>\n-  Learning Transferrable Knowledge for Semantic Segmentation with Deep Convolutional Neural Network-2015 [[Project]](http://cvlab.postech.ac.kr/research/transfernet/) [[Code-Caffe]](https://github.com/maga33/TransferNet) [[Paper]](http://arxiv.org/abs/1512.07928)</br>\n-  Learning Dense Convolutional Embeddings for Semantic Segmentation-2015 [[Paper]](https://arxiv.org/abs/1511.04377)</br>\n-  ParseNet: Looking Wider to See Better-2015 [[Code-Caffe]](https://github.com/weiliu89/caffe/tree/fcn) [[Model-Caffe]](https://github.com/BVLC/caffe/wiki/Model-Zoo#parsenet-looking-wider-to-see-better) [[Paper]](http://arxiv.org/abs/1506.04579)</br>\n-  Decoupled Deep Neural Network for Semi-supervised Semantic Segmentation-2015 [[Project]](http://cvlab.postech.ac.kr/research/decouplednet/) [[Code-Caffe]](https://github.com/HyeonwooNoh/DecoupledNet) [[Paper]](http://arxiv.org/abs/1506.04924)</br>\n- Bayesian segnet: Model uncertainty in deep convolutional encoder-decoder architectures for scene understanding [[Paper]](https://arxiv.org/pdf/1511.02680.pdf)\n-  **SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation-2015** [[Project]](http://mi.eng.cam.ac.uk/projects/segnet/) [[Code-Caffe]](https://github.com/alexgkendall/caffe-segnet) [[Paper]](http://arxiv.org/abs/1511.00561) [[Tutorial1]](http://mi.eng.cam.ac.uk/projects/segnet/tutorial.html) [[Tutorial2]](https://github.com/alexgkendall/SegNet-Tutorial)</br>\n-  Semantic Image Segmentation with Task-Specific Edge Detection Using CNNs and a Discriminatively Trained Domain Transform-2015 [[Paper]](https://arxiv.org/abs/1511.03328)</br>\n-  Semantic Segmentation with Boundary Neural Fields-2015 [[Code]](https://github.com/gberta/BNF_globalization) [[Paper]](https://arxiv.org/abs/1511.02674)</br>\n-  Semantic Image Segmentation via Deep Parsing Network-2015 [[Project]](http://personal.ie.cuhk.edu.hk/~lz013/projects/DPN.html) [[Paper1]](http://arxiv.org/abs/1509.02634) [[Paper2]](http://www.cv-foundation.org/openaccess/content_iccv_2015/papers/Liu_Semantic_Image_Segmentation_ICCV_2015_paper.pdf) [[Slides]](http://personal.ie.cuhk.edu.hk/~pluo/pdf/presentation_dpn.pdf)</br>\n-  What’s the Point: Semantic Segmentation with Point Supervision-2015 [[Project]](http://vision.stanford.edu/whats_the_point/) [[Code-Caffe]](https://github.com/abearman/whats-the-point1) [[Model-Caffe]](http://vision.stanford.edu/whats_the_point/models.html) [[Paper]](https://arxiv.org/abs/1506.02106)</br>\n-  U-Net: Convolutional Networks for Biomedical Image Segmentation-2015 [[Project]](http://lmb.informatik.uni-freiburg.de/people/ronneber/u-net/) [[Code+Data]](http://lmb.informatik.uni-freiburg.de/people/ronneber/u-net/u-net-release-2015-10-02.tar.gz) [[Code-Keras]](https://github.com/orobix/retina-unet) [[Code-Tensorflow]](https://github.com/jakeret/tf_unet) [[Paper]](http://arxiv.org/abs/1505.04597) [[Notes]](http://zongwei.leanote.com/post/Pa)</br>\n-  Learning Deconvolution Network for Semantic Segmentation(DeconvNet)-2015 [[Project]](http://cvlab.postech.ac.kr/research/deconvnet/) [[Code-Caffe]](https://github.com/HyeonwooNoh/DeconvNet) [[Paper]](http://arxiv.org/abs/1505.04366) [[Slides]](http://web.cs.hacettepe.edu.tr/~aykut/classes/spring2016/bil722/slides/w06-deconvnet.pdf)</br>\n-  Multi-scale Context Aggregation by Dilated Convolutions-2015 [[Project]](http://vladlen.info/publications/multi-scale-context-aggregation-by-dilated-convolutions/) [[Code-Caffe]](https://github.com/fyu/dilation) [[Code-Keras]](https://github.com/nicolov/segmentation_keras) [[Paper]](http://arxiv.org/abs/1511.07122) [[Notes]](http://www.inference.vc/dilated-convolutions-and-kronecker-factorisation/)</br>\n-  ReSeg: A Recurrent Neural Network-based Model for Semantic Segmentation-2015 [[Code-Theano]](https://github.com/fvisin/reseg) [[Paper]](https://arxiv.org/abs/1511.07053)</br>\n-  ICCV-2015 BoxSup: Exploiting Bounding Boxes to Supervise Convolutional Networks for Semantic Segmentation-2015 [[Paper]](https://arxiv.org/abs/1503.01640)</br>\n-  Feedforward semantic segmentation with zoom-out features-2015 [[Code]](https://bitbucket.org/m_mostajabi/zoom-out-release) [[Paper]](http://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Mostajabi_Feedforward_Semantic_Segmentation_2015_CVPR_paper.pdf) [[Video]](https://www.youtube.com/watch?v=HvgvX1LXQa8)</br>\n-  Conditional Random Fields as Recurrent Neural Networks-2015 [[Project]](http://www.robots.ox.ac.uk/~szheng/CRFasRNN.html) [[Code-Caffe1]](https://github.com/torrvision/crfasrnn) [[Code-Caffe2]](https://github.com/martinkersner/train-CRF-RNN) [[Demo]](http://www.robots.ox.ac.uk/~szheng/crfasrnndemo) [[Paper1]](http://www.robots.ox.ac.uk/~szheng/papers/CRFasRNN.pdf) [[Paper2]](http://arxiv.org/abs/1502.03240)</br>\n-  Efficient Piecewise Training of Deep Structured Models for Semantic Segmentation-2015 [[Paper]](https://arxiv.org/abs/1504.01013)</br>\n-  **Fully Convolutional Networks for Semantic Segmentation-2015** [[Code-Caffe]](https://github.com/shelhamer/fcn.berkeleyvision.org) [[Model-Caffe]](https://github.com/BVLC/caffe/wiki/Model-Zoo#fcn) [[Code-Tensorflow1]](https://github.com/MarvinTeichmann/tensorflow-fcn) [[Code-Tensorflow2]](https://github.com/shekkizh/FCN.tensorflow) [[Code-Chainer]](https://github.com/wkentaro/fcn) [[Code-PyTorch]](https://github.com/wkentaro/pytorch-fcn) [[Paper1]](http://arxiv.org/abs/1411.4038) [[Paper2]](http://arxiv.org/abs/1605.06211) [[Slides1]](https://docs.google.com/presentation/d/1VeWFMpZ8XN7OC3URZP4WdXvOGYckoFWGVN7hApoXVnc) [[Slides2]](http://tutorial.caffe.berkeleyvision.org/caffe-cvpr15-pixels.pdf)</br>\n-  Deep Joint Task Learning for Generic Object Extraction-2014 [[Project]](http://vision.sysu.edu.cn/projects/deep-joint-task-learning/) [[Code-Caffe]](https://github.com/xiaolonw/nips14_loc_seg_testonly) [[Dataset]](http://objectextraction.github.io/) [[Paper]](http://ss.sysu.edu.cn/~ll/files/NIPS2014_JointTask.pdf)</br>\n-  Highly Efficient Forward and Backward Propagation of Convolutional Neural Networks for Pixelwise Classification-2014 [[Code-Caffe]](https://dl.dropboxusercontent.com/u/6448899/caffe.zip) [[Paper]](https://arxiv.org/abs/1412.4526)</br>\n-\t **Wider or deeper: Revisiting the resnet model for visual recognition** [[Paper]](https://arxiv.org/abs/1611.10080)</br>\n-\t Describing the Scene as a Whole: Joint Object Detection, Scene Classification and Semantic Segmentation[[Paper]](https://ttic.uchicago.edu/~yaojian/Paper_Holistic.pdf)</br>\n-\t Analyzing Semantic Segmentation Using Hybrid Human-Machine CRFs[[Paper]](http://www.cv-foundation.org/openaccess/content_cvpr_2013/papers/Mottaghi_Analyzing_Semantic_Segmentation_2013_CVPR_paper.pdf)</br>\n-\t Convolutional Patch Networks with Spatial Prior for Road Detection and Urban Scene Understanding[[Paper]](https://arxiv.org/abs/1502.06344.pdf)</br>\n-\t Deep Deconvolutional Networks for Scene Parsing[[Paper]](https://arxiv.org/abs/1411.4101)</br>\n-  FusionSeg: Learning to combine motion and appearance for fully automatic segmention of generic objects in videos[[Paper]](https://arxiv.org/pdf/1701.05384.pdf)[[Poject]](http://vision.cs.utexas.edu/projects/fusionseg/)</br>\n- ICCV-2017 Deep Dual Learning for Semantic Image Segmentation [[Paper]](http://personal.ie.cuhk.edu.hk/~pluo/pdf/luoWLWiccv17.pdf)</br>\n- From image-level to pixel level labeling with convolutional networks [[Paper]]()</br>\n- Scene Segmentation with DAG-Recurrent Neural Networks [[Paper]](http://ieeexplore.ieee.org/abstract/document/7940028/)</br>\n- Learning to Segment Every Thing [[Paper]](https://arxiv.org/pdf/1711.10370.pdf)</br>\n- Panoptic Segmentation [[Paper]](https://arxiv.org/pdf/1801.00868.pdf)</br>\n- The Devil is in the Decoder [[Paper]](https://arxiv.org/pdf/1707.05847.pdf)</br>\n- Attention to Scale: Scale-aware Semantic Image Segmentation [[Paper]](http://arxiv.org/pdf/1511.03339)[[Project]](http://liangchiehchen.com/projects/DeepLab.html)</br>\n- Convolutional Oriented Boundaries: From Image Segmentation to High-Level Tasks [[Paper]](https://arxiv.org/pdf/1701.04658.pdf) [[Project]](http://www.vision.ee.ethz.ch/~cvlsegmentation/)</br>\n- Scale-Aware Alignment of Hierarchical Image Segmentation [[Paper]](https://www.vision.ee.ethz.ch/en/publications/papers/proceedings/eth_biwi_01271.pdf) [[Project]](http://www.vision.ee.ethz.ch/~cvlsegmentation/)</br>\n- ICCV-2017 Semi Supervised Semantic Segmentation Using Generative Adversarial Network[[Paper]](https://arxiv.org/abs/1703.09695)</br>\n- Object Region Mining with Adversarial Erasing: A Simple Classification to Semantic Segmentation Approach [[Paper]](https://arxiv.org/pdf/1703.08448.pdf)</br>\n+ CVPR-2016 Convolutional Feature Masking for Joint Object and Stuff Segmentation [[Paper]](http://arxiv.org/abs/1412.1283)\n+ ECCV-2016 Laplacian Pyramid Reconstruction and Refinement for Semantic Segmentation [[Paper]](https://arxiv.org/pdf/1411.5752.pdf)\n-  FastMask: Segment Object Multi-scale Candidates in One Shot-2016 [[Code-Caffe]](https://github.com/voidrank/FastMask) [[Paper]](https://arxiv.org/abs/1612.08843)</br>\n-  **Pixel Objectness-2017** [[Project]](http://vision.cs.utexas.edu/projects/pixelobjectness/) [[Code-Caffe]](https://github.com/suyogduttjain/pixelobjectness) [[Paper]](https://arxiv.org/abs/1701.05349)</br>\n\n\n## 3D Semantic Segmentation\n### Papers\n- PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation [[Paper]](http://stanford.edu/%7Erqi/pointnet/)\n- PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space (2017) [[Paper]](https://arxiv.org/pdf/1706.02413.pdf)\n- Learning 3D Mesh Segmentation and Labeling (2010)</b> [[Paper]](https://people.cs.umass.edu/~kalo/papers/LabelMeshes/LabelMeshes.pdf)\n- Unsupervised Co-Segmentation of a Set of Shapes via Descriptor-Space Spectral Clustering (2011)</b> [[Paper]](https://www.cs.sfu.ca/~haoz/pubs/sidi_siga11_coseg.pdf)\n- Single-View Reconstruction via Joint Analysis of Image and Shape Collections (2015)</b> [[Paper]](https://www.cs.utexas.edu/~huangqx/modeling_sig15.pdf)\n- 3D Shape Segmentation with Projective Convolutional Networks (2017) [[Paper]](http://people.cs.umass.edu/~kalo/papers/shapepfcn/)\n- Learning Hierarchical Shape Segmentation and Labeling from Online Repositories (2017) [[Paper]](http://cs.stanford.edu/~ericyi/project_page/hier_seg/index.html)\n- 3D Graph Neural Networks for RGBD Semantic Segmentation (2017) [[Paper]](http://www.cs.toronto.edu/~rjliao/papers/iccv_2017_3DGNN.pdf)\n- 3DCNN-DQN-RNN: A Deep Reinforcement Learning Framework for Semantic Parsing of Large-scale 3D Point Clouds (2017)[[Paper]](https://arxiv.org/pdf/1707.06783.pdf)\n- Multi-view deep learning for consistent semantic mapping with rgb-d cameras [[Paper]](https://arxiv.org/pdf/1703.08866.pdf)\n+ ICCV-2017 Large-scale 3D Shape Reconstruction and Segmentation from ShapeNet Core55 [[Paper]]()[[Project]](https://shapenet.cs.stanford.edu/iccv17/)\n\n## Instance Segmentation\n+ Mask Scoring R-CNN (MS R-CNN) [[Code]](https://github.com/zjhuang22/maskscoring_rcnn)[[Paper]](https://arxiv.org/pdf/1903.00241.pdf)\n+ Predicting Future Instance Segmentations by Forecasting Convolutional Features [[Paper]](https://hal.inria.fr/hal-01757669/document)\n+ CVPR-2018 Path Aggregation Network for Instance Segmentation [[Paper]](https://arxiv.org/pdf/1803.01534.pdf) better than Mask-rcnn!！COCO-2017 1st!\n+  Pixelwise Instance Segmentation with a Dynamically Instantiated Network-2017 [[Paper]](https://arxiv.org/abs/1704.02386)</br>\n+  Semantic Instance Segmentation via Deep Metric Learning-2017 [[Paper]](https://arxiv.org/abs/1703.10277)</br>\n+  CVPR-2017 FastMask: Segment Multi-scale Object Candidates in One Shot [[Code-Tensorflow]](https://github.com/CharlesShang/FastMaskRCNN) [[Paper]](https://arxiv.org/abs/1703.06870)</br>\n+  Pose2Instance: Harnessing Keypoints for Person Instance Segmentation-2017 [[Paper]](https://arxiv.org/abs/1704.01152)</br>\n+  Pixelwise Instance Segmentation with a Dynamically Instantiated Network-2017 [[Paper]](https://arxiv.org/abs/1704.02386)</br>\n+  CVPR-2017-spotlight Fully Convolutional Instance-aware Semantic Segmentation-2016 [[Code]](https://github.com/msracver/FCIS) [[Paper]](https://arxiv.org/abs/1611.07709)</br>\n+  CVPR-2016-oral **Instance-aware Semantic Segmentation via Multi-task Network Cascades-2015** [[Code]](https://github.com/daijifeng001/MNC) [[Paper]](http://arxiv.org/abs/1512.04412)</br>\n+  Recurrent Instance Segmentation-2015 [[Project]](http://romera-paredes.com/ris) [[Code-Torch7]](https://github.com/bernard24/ris) [[Paper]](http://arxiv.org/abs/1511.08250) [[Poster]](http://www.eccv2016.org/files/posters/P-4B-46.pdf) [[Video]](https://www.youtube.com/watch?v=l_WD2OWOqBk)</br>\n+ Annotating Object Instances with a Polygon-RNN [[Paper]](https://arxiv.org/abs/1704.05548)\n+ MaskLab: Instance Segmentation by Refining Object Detection with Semantic and Direction Features [[Paper]](https://arxiv.org/pdf/1712.04837.pdf)\n+ FCIS:Fully Convolutional Instance-aware Semantic Segmentation [[Paper]](https://arxiv.org/pdf/1611.07709.pdf)[Code](https://github.com/msracver/FCIS)\n+ MNC:Instance-aware Semantic Segmentation via Multi-task Network Cascades [[Paper]](https://arxiv.org/pdf/1512.04412.pdf)[Code](https://github.com/daijifeng001/MNC)\n+ DeepMask:Learning to Segment Object Candidates [[Paper]](https://arxiv.org/pdf/1506.06204.pdf) [Code](https://github.com/facebookresearch/deepmask)\n+ SharpMask:Learning to Refine Object Segments [[Paper]](https://arxiv.org/pdf/1603.08695.pdf)[Code](https://github.com/facebookresearch/deepmask)\n+ RIS:Recurrent Instance Segmentation [[Paper]](https://arxiv.org/pdf/1511.08250.pdf)[Code](https://github.com/bernard24/RIS)\n+ FastMask: Segment Multi-scale Object Candidates in One Shot [[Paper]](https://arxiv.org/pdf/1612.08843.pdf)[Code](https://github.com/voidrank/FastMask)\n+ Proposal-free network for instance-level object segmentation [[Paper]](https://arxiv.org/pdf/1509.02636)\n+ ECCV-2016 Instance-sensitive Fully Convolutional Networks  [[Paper]](http://arxiv.org/abs/1603.08678)\n+ Pixel-level encoding and depth layering for instance-level semantic labeling [[Paper]](https://arxiv.org/pdf/1604.05096)\n\n\n## Robotics\n- Virtual-to-Real: Learning to Control in Visual Semantic Segmentation [[Paper]](https://arxiv.org/pdf/1802.00285.pdf)\n- End-to-End Tracking and Semantic Segmentation Using Recurrent Neural Networks [[Paper]](https://arxiv.org/pdf/1604.05091.pdf)\n- Semantic Segmentation using Adversarial Networks [[Paper]](https://arxiv.org/pdf/1611.08408.pdf)\n\n## Adversarial Training\n- CVPR-2017-Image-to-Image Translation with Conditional Adversarial Networks [[Paper]](http://openaccess.thecvf.com/content_cvpr_2017/papers/Isola_Image-To-Image_Translation_With_CVPR_2017_paper.pdf)\n- ICCV-2017-Adversarial Examples for Semantic Segmentation and Object Detection [[Paper]](http://openaccess.thecvf.com/content_ICCV_2017/papers/Xie_Adversarial_Examples_for_ICCV_2017_paper.pdf)\n\n## Scene Understanding\n### Papers\n1.Spatial As Deep: Spatial CNN for Traffic Scene Understanding [[Paper]](https://arxiv.org/pdf/1712.06080.pdf)</br>\n\n### Dataset & Resources\n+ SUNRGB-D 3D Object Detection Challenge</b> [[Link]](http://rgbd.cs.princeton.edu/challenge.html)\n19 object categories for predicting a 3D bounding box in real world dimension Training set: 10,355 RGB-D scene images, Testing set: 2860 RGB-D images\n+ SceneNN (2016)</b> [[Link]](http://people.sutd.edu.sg/~saikit/projects/sceneNN/)\n100+ indoor scene meshes with per-vertex and per-pixel annotation.\n+ ScanNet (2017)</b> [[Link]](http://www.scan-net.org/)\nAn RGB-D video dataset containing 2.5 million views in more than 1500 scans, annotated with 3D camera poses, surface reconstructions, and instance-level semantic segmentations.\n+ Matterport3D: Learning from RGB-D Data in Indoor Environments (2017)</b> [[Link]](https://niessner.github.io/Matterport/)\n<br>10,800 panoramic views (in both RGB and depth) from 194,400 RGB-D images of 90 building-scale scenes of private rooms. Instance-level semantic segmentations are provided for region (living room, kitchen) and object (sofa, TV) categories. \n+ SUNCG: A Large 3D Model Repository for Indoor Scenes (2017)</b> [[Link]](http://suncg.cs.princeton.edu/)\n<br>The dataset contains over 45K different scenes with manually created realistic room and furniture layouts. All of the scenes are semantically annotated at the object level.\n+ MINOS: Multimodal Indoor Simulator (2017)</b> [[Link]](https://github.com/minosworld/minos)\nMINOS is a simulator designed to support the development of multisensory models for goal-directed navigation in complex indoor environments. MINOS leverages large datasets of complex 3D environments and supports flexible configuration of multimodal sensor suites. MINOS supports SUNCG and Matterport3D scenes.\n+ Facebook House3D: A Rich and Realistic 3D Environment (2017)</b> [[Link]](https://github.com/facebookresearch/House3D)\n<br>House3D is a virtual 3D environment which consists of 45K indoor scenes equipped with a diverse set of scene types, layouts and objects sourced from the SUNCG dataset. All 3D objects are fully annotated with category labels. Agents in the environment have access to observations of multiple modalities, including RGB images, depth, segmentation masks and top-down 2D map views.\n+ HoME: a Household Multimodal Environment (2017)</b> [[Link]](https://home-platform.github.io/)\n<br>HoME integrates over 45,000 diverse 3D house layouts based on the SUNCG dataset, a scale which may facilitate learning, generalization, and transfer. HoME is an open-source, OpenAI Gym-compatible platform extensible to tasks in reinforcement learning, language grounding, sound-based navigation, robotics, multi-agent learning.\n+ AI2-THOR: Photorealistic Interactive Environments for AI Agents</b> [[Link]](http://ai2thor.allenai.org/)\n<br>AI2-THOR is a photo-realistic interactable framework for AI agents. There are a total 120 scenes in version 1.0 of the THOR environment covering four different room categories: kitchens, living rooms, bedrooms, and bathrooms. Each room has a number of actionable objects.\n\n\n## Weakly-Supervised-Segmentation && Interactive Segmentation && Transferable Semantic Segmentation\n- arxiv-2018 WebSeg: Learning Semantic Segmentation from Web Searches [[Paper]](https://arxiv.org/pdf/1803.09859.pdf)\n- Weakly Supervised Object Localization Using Things and Stuff Transfer [[Paper]](https://arxiv.org/pdf/1703.08000.pdf)\n- Semi and Weakly Supervised Semantic Segmentation Using Generative Adversarial Network [[Paper]](http://crcv.ucf.edu/papers/1703.09695.pdf)\n- Weakly- and Semi-Supervised Learning of a Deep Convolutional Network for Semantic Image Segmentation [[Paper]](https://arxiv.org/pdf/1502.02734.pdf)\n+ Weakly Supervised Structured Output Learning for Semantic Segmentation [[Paper]](http://groups.inf.ed.ac.uk/calvin/hp_avezhnev/Pubs/VezhnevetsCVPR2012b.pdf)\n+ ICCV-2011 Weakly supervised semantic segmentation with a multi-image model [[Paper]](http://ieeexplore.ieee.org/document/6126299/)\n+ ScribbleSup: Scribble-Supervised Convolutional Networks for Semantic Segmentation. IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2016[[Paper]](https://arxiv.org/abs/1604.05144)</br>\n+ Constrained convolutional neural networks for weakly supervised segmentation. Proceedings of the IEEE International Conference on Computer Vision. 2015.[[Paper]](https://arxiv.org/abs/1506.03648)\n+ Weakly-and semi-supervised learning of a DCNN for semantic image segmentation. arXiv preprint arXiv:1502.02734 (2015).[[Paper]](https://arxiv.org/pdf/1502.02734.pdf)\n+ Learning to segment under various forms of weak supervision. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015.[[Paper]](http://www.cv-foundation.org/openaccess/content_cvpr_2015/app/2B_048.pdf)\n+ STC: A Simple to Complex Framework for Weakly-supervised Semantic Segmentation 2017 TPAMI [[Paper]](https://arxiv.org/pdf/1509.03150.pdf) [[Project]]()\n+ [[Paper]](https://www.robots.ox.ac.uk/~vgg/rg/papers/semanticsegmentation.pdf)\n+ CVPR-2017-Simple Does It: Weakly Supervised Instance and Semantic Segmentation [[Paper]](http://openaccess.thecvf.com/content_cvpr_2017/papers/Khoreva_Simple_Does_It_CVPR_2017_paper.pdf) [[tensorflow]](https://github.com/philferriere/tfwss)\n+ CVPR-2017-Weakly Supervised Semantic Segmentation using Web-Crawled Videos [[Paper]](http://openaccess.thecvf.com/content_cvpr_2017/papers/Hong_Weakly_Supervised_Semantic_CVPR_2017_paper.pdf)\n+ AAAI-2017-Weakly Supervised Semantic Segmentation Using Superpixel Pooling Network [[Paper]](https://aaai.org/ocs/index.php/AAAI/AAAI17/paper/view/14445/14288)\n+ ICCV-2015-Weakly supervised graph based semantic segmentation by learning communities of image-parts [[Paper]](https://www.cv-foundation.org/openaccess/content_iccv_2015/papers/Pourian_Weakly_Supervised_Graph_ICCV_2015_paper.pdf)\n+ Towards Weakly Supervised Semantic Segmentation by Means of Multiple Instance and Multitask Learning [[Paper]](https://pdfs.semanticscholar.org/168f/7c5fda213447fb215b57bf00c1e27bbeac7a.pdf)\n+ Weakly-Supervised Semantic Segmentation using Motion Cues [[Paper]](https://arxiv.org/pdf/1603.07188) [[Project]](http://thoth.inrialpes.fr/research/weakseg/)\n+ Weakly Supervised Semantic Segmentation Based on Web Image Co-segmentation [[Paper]](https://arxiv.org/pdf/1705.09052)\n+ Learning to Rene Object Segments [[Paper]](https://arxiv.org/pdf/1603.08695.pdf)\n- Weakly-Supervised Dual Clustering for Image Semantic Segmentation [[Paper]](https://www.cv-foundation.org/openaccess/content_cvpr_2013/papers/Liu_Weakly-Supervised_Dual_Clustering_2013_CVPR_paper.pdf)\n+  Interactive Video Object Segmentation in the Wild [[Paper]](https://arxiv.org/pdf/1801.00269)\n\n## Video Semantic Segmentation\n+ CVPR-2017 Video Object Segmentation Without Temporal Information One-Shot Video Object Segmentation [[Project]](http://www.vision.ee.ethz.ch/~cvlsegmentation/osvos/)\n+ Feature Space Optimization for Semantic Video Segmentation[[Paper]](http://www.cvlibs.net/projects/autonomous_vision_survey/literature/Kundu2016CVPR.pdf)[[Slides]](http://www.cvlibs.net/projects/autonomous_vision_survey/slides/Kundu2016CVPR/top.pdf)</br>\n+ The Basics of Video Object Segmentation [[Blog]](https://techburst.io/video-object-segmentation-the-basics-758e77321914)\n+ ICCV2017----SegFlow_Joint Learning for Video Object Segmentation and Optical Flow</br>\n+ OSVOS:One-Shot Video Object Segmentation</br>\n+ Surveillance Video Parsing with Single Frame Supervision</br>\n+ The 2017 DAVIS Challenge on Video Object Segmentation</br>\n+ Video Propagation Networks</br>\n+ OnAVOS: Online Adaptation of Convolutional Neural Networks for Video Object Segmentation. P. Voigtlaender, B. Leibe, BMVC 2017. [Project Page] [Precomputed results]\n+ MSK: Learning Video Object Segmentation from Static Images. F. Perazzi*, A. Khoreva*, R. Benenson, B. Schiele, A. Sorkine-Hornung, CVPR 2017. [Project Page] [Precomputed results]\n+ SFL: SegFlow: Joint Learning for Video Object Segmentation and Optical Flow. J. Cheng, Y.-H. Tsai, S. Wang, M.-H. Yang, ICCV 2017. [Project Page] [Precomputed results]\n+ CTN: Online Video Object Segmentation via Convolutional Trident Network. W.-D. Jang, C.-S. Kim, CVPR 2017. [Project Page] [Precomputed results]\n+ VPN: Video Propagation Networks. V. Jampani, R. Gadde, P. V. Gehler, CVPR 2017. [Project Page] [Precomputed results]\n+ PLM: Pixel-level Matching for Video Object Segmentation using Convolutional Neural Networks. J. Shin Yoon, F. Rameau, J. Kim, S. Lee, S. Shin, I. So Kweon, ICCV 2017. [Project Page] [Precomputed results]\n+ OFL: Video Segmentation via Object Flow. Y.-H. Tsai, M.-H. Yang, M. Black, CVPR 2016. [Project Page] [Precomputed results]\n+ BVS: Bilateral Space Video Segmentation. N. Marki, F. Perazzi, O. Wang, A. Sorkine-Hornung, CVPR 2016. [Project Page] [Precomputed results]\n+ FCP: Fully Connected Object Proposals for Video Segmentation. F. Perazzi, O. Wang, M. Gross, A. Sorkine-Hornung, ICCV 2015. [Project Page] [Precomputed results]\n+ JMP: JumpCut: Non-Successive Mask Transfer and Interpolation for Video Cutout. Q. Fan, F. Zhong, D. Lischinski, D. Cohen-Or, B. Chen, SIGGRAPH 2015. [Project Page] [Precomputed results]\n+ HVS: Efficient hierarchical graph-based video segmentation. M. Grundmann, V. Kwatra, M. Han, I. A. Essa, CVPR 2010. [Project Page] [Precomputed results]\n+ SEA: SeamSeg: Video Object Segmentation Using Patch Seams. S. Avinash Ramakanth, R. Venkatesh Babu, CVPR 2014. [Project Page] [Precomputed results]\n+ ARP: Primary Object Segmentation in Videos Based on Region Augmentation and Reduction. Y.J. Koh, C.-S. Kim, CVPR 2017. [Project Page] [Precomputed results]\n+ LVO: Learning Video Object Segmentation with Visual Memory. P. Tokmakov, K. Alahari, C. Schmid, ICCV 2017. [Project Page] [Precomputed results]\n+ FSEG: FusionSeg: Learning to combine motion and appearance for fully automatic segmentation of generic objects in videos. S. Jain, B. Xiong, K. Grauman, CVPR 2017. [Project Page] [Precomputed results]\n+ LMP: Learning Motion Patterns in Videos. P. Tokmakov, K. Alahari, C. Schmid, CVPR 2017. [Project Page] [Precomputed results]\n+ SFL: SegFlow: Joint Learning for Video Object Segmentation and Optical Flow. J. Cheng, Y.-H. Tsai, S. Wang, M.-H. Yang, ICCV 2017. [Project Page] [Precomputed results]\nFST: Fast Object Segmentation in Unconstrained Video. A. Papazoglou, V. Ferrari, ICCV 2013. [Project Page] [Precomputed results]\n+ CUT: Motion Trajectory Segmentation via Minimum Cost Multicuts. M. Keuper, B. Andres, T. Brox, ICCV 2015. [Project Page] [Precomputed results]\n+ NLC: Video Segmentation by Non-Local Consensus voting. A. Faktor, M. Irani, BMVC 2014. [Project Page] [Precomputed results]\n+ MSG: Object segmentation in video: A hierarchical variational approach for turning point trajectories into dense regions. P. Ochs, T. Brox, ICCV 2011. [Project Page] [Precomputed results]\n+ KEY: Key-segments for video object segmentation. Y. Lee, J. Kim, K. Grauman, ICCV 2011. [Project Page] [Precomputed results]\n+ CVOS: Causal Video Object Segmentation from Persistence of Occlusions. B. Taylor, V. Karasev, S. Soatto, CVPR 2015. [Project Page] [Precomputed results]\n+ TRC: Video segmentation by tracing discontinuities in a trajectory embedding. K. Fragkiadaki, G. Zhang, J. Shi, CVPR 2012. [Project Page] [Precomputed results]\n+ Instance Embedding Transfer to Unsupervised Video Object Segmentation [[Paper]](https://arxiv.org/abs/1801.00908)\n\n- [Result of DAVIS-Challenge 2017](http://davischallenge.org/challenge2017/index.html) \n- [Benchmark](http://davischallenge.org/soa_compare.html)\n2016----A Benchmark Dataset and Evaluation Methodology for Video Object Segmentation</br>\n2016----Clockwork Convnets for Video Semantic Segmentation</br>\n2016----MaskTrack ----Learning Video Object Segmentation from Static Images</br>\n2017----DAVIS-Challenge-1st----[Video Object Segmentation with Re-identification](https://arxiv.org/pdf/1708.00197.pdf)</br>\n2017----DAVIS-Challenge-2nd----Lucid Data Dreaming for Multiple Object Tracking</br>\n2017----DAVIS-Challenge-3rd----Instance Re-Identification Flow for Video Object Segmentation</br>\n2017----DAVIS-Challenge-4th----Multiple-Instance Video Segmentation with Sequence-Specific Object Proposals</br>\n2017----DAVIS-Challenge-5th Online Adaptation of Convolutional Neural Networks for the 2017 DAVIS Challenge on Video Object Segmentation</br>\n2017----DAVIS-Challenge-6th ----Learning to Segment Instances in Videos with Spatial Propagation Network</br>\n2017----DAVIS-Challenge-7th----Some Promising Ideas about Multi-instance Video Segmentation</br>\n2017----DAVIS-Challenge-8th----[One-Shot Video Object Segmentation with Iterative Online Fine-Tuning](https://arxiv.org/pdf/1611.05198.pdf)</br>\n2017----DAVIS-Challenge-9th----Video Object Segmentation using Tracked Object Proposals</br>\n\n## Multi-Task Learning\n### Papers:\n- Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics [[Paper]]()\n- Multi-task Learning using Multi-modal Encoder-Decoder Networks with Shared Skip Connections [[Paper]]()\n\n## Road Segmentation && Real Time Segmentation\n### Papers:\n- Deep Semantic Segmentation for Automated Driving: Taxonomy, Roadmap and Challenges [[Paper]](https://arxiv.org/pdf/1707.02432.pdf)\n- 2018-arxiv Real-time Semantic Segmentation Comparative Study[[Paper]](https://arxiv.org/pdf/1803.02758.pdf)[[Code]](https://github.com/MSiam/TFSegmentation)\n- MultiNet: Real-time Joint Semantic Reasoning for Autonomous Driving [[Paper]](https://arxiv.org/pdf/1612.07695.pdf)</br>\n- self-driving-car-road-segmentation [[Link]](https://medium.com/@karol_majek/self-driving-car-road-segmentation-514ae80e103a)</br>\n- Efficient Deep Models for Monocular Road Segmentation[[Paper]](http://ais.informatik.uni-freiburg.de/publications/papers/oliveira16iros.pdf)</br>\n- Semantic Road Segmentation via Multi-scale Ensembles of Learned Features [[Paper]]()</br>\n- Distantly Supervised Road Segmentation [[Paper]](https://arxiv.org/pdf/1708.06118)</br>\n- Deep Fully Convolutional Networks with Random Data Augmentation for Enhanced Generalization in Road Detection [[Paper]](http://isislab.es/llorca/publications_files/IEEEITSC17_RoadAugmentedDataFCNN.pdf)</br>\n- ICCV-2017 Real-time category-based and general obstacle detection for autonomous driving [[Paper]](http://openaccess.thecvf.com/content_ICCV_2017_workshops/papers/w3/Garnett_Real-Time_Category-Based_and_ICCV_2017_paper.pdf)</br>\n- ICCV-2017 FoveaNet: Perspective-aware Urban Scene Parsing [[Paper]](http://users.eecs.northwestern.edu/~xsh835/assets/iccv2017_foveanet.pdf)</br>\n- CVPR-2017 UberNet: Training a universal convolutional neural network for low-, mid-, and high-level vision using diverse datasets and limited memory [[Paper]](http://openaccess.thecvf.com/content_cvpr_2017/papers/Kokkinos_Ubernet_Training_a_CVPR_2017_paper.pdf)\n+\tLinkNet: Exploiting Encoder Representations for Efficient Semantic Segmentation [[Paper]](https://arxiv.org/abs/1707.03718.pdf)\n+\tENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentation-2016 [[Code-Caffe1]](https://github.com/e-lab/ENet-training)[[Code-Caffe2]](https://github.com/TimoSaemann/ENet) [[Paper]](https://arxiv.org/abs/1606.02147) [[Blog]](https://culurciello.github.io/tech/2016/06/20/training-enet.html)\n+\tEfficient Deep Models for Monocular Road Segmentation[[Paper]](http://ais.informatik.uni-freiburg.de/publications/papers/oliveira16iros.pdf)\n+\tReal-Time Coarse-to-fine Topologically Preserving Segmentation[[Paper]](http://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Yao_Real-Time_Coarse-to-Fine_Topologically_2015_CVPR_paper.pdf)\n+ ICNet for Real-Time Semantic Segmentation on High-Resolution Images [[Paper]](https://arxiv.org/pdf/1704.08545.pdf)\n+ Efficient and robust deep networks for semantic segmentation [[Paper]](http://journals.sagepub.com/doi/abs/10.1177/0278364917710542)\n+ NIPSW-2017 Speeding up semantic segmentation for autonomous driving [[Paper]](https://openreview.net/pdf?id=S1uHiFyyg)\n- ECCV-2012 Road Scene Segmentation from a Single Image [[Paper]](http://yann.lecun.com/exdb/publis/pdf/alvarez-eccv-12.pdf)\n\n\n### Codes\n\n  + https://github.com/vxy10/p5_VehicleDetection_Unet [Keras]\n  + https://github.com/ndrplz/self-driving-car\n \n\n\n\n\n## Medical Image Semantic Segmentation\n### Papers\n+ Arxiv-2018 Deep learning and its application to medical image segmentation [[Paper]](https://arxiv.org/pdf/1803.08691)\n- Deep neural networks segment neuronal membranes in electron microscopy images\n- Semantic Image  Segmentation with Deep Learning [[Paper]](http://www.robots.ox.ac.uk/~sadeep/files/crfasrnn_presentation.pdf)</br>\n- Automatic Liver and Tumor Segmentation of CT and MRI Volumes Using Cascaded Fully Convolutional Neural Networks [[Paper]](https://arxiv.org/pdf/1702.05970.pdf)</br>\n- DeepNAT: Deep Convolutional Neural Network for Segmenting Neuroanatomy [[Paper]](https://arxiv.org/pdf/1702.08192.pdf)</br>\n- CNN-based Segmentation of Medical Imaging Data [[Paper]](https://arxiv.org/pdf/1701.03056.pdf)</br>\n- Deep Retinal Image Understanding (http://www.vision.ee.ethz.ch/~cvlsegmentation/driu/data/paper/DRIU_MICCAI2016.pdf)\n- Model-based segmentation of vertebral bodies from MR images with 3D CNNs\n- Efficient multi-scale 3D CNN with fully connected CRF for accurate brain lesion segmentation\n- U-net: Convolutional networks for biomedical image segmentation\n- 3D U-Net: Learning dense volumetric segmentation from sparse annotation. \n- V-Net: Fully convolutional neural networks for volumetric medical image segmentation.arXiv:1606.04797\n- The importance of skip connections in biomedical image segmentation Spatial clockwork recurrent neural network for muscle perimysium segmentation\n- NPIS-2015 Parallel multi-dimensional LSTM, with application to fast biomedical volumetric image segmentation\n- Multi-dimensional gated recurrent units for the segmentation of biomedical 3D-data\n- Combining fully convolutional and recurrent neural networks for 3D biomedical image segmentation\n- Recurrent fully convolutional neural networks for multi-slice MRI cardiac segmentation. arXiv:1608.03974\n- Automatic detection and classification of colorectal polyps by transferring low-level CNN features from nonmedical domain\n- Deep learning for multi-task medical image segmentation in multiple modalities\n- Sub-cortical brain structure segmentation using F-CNNs\n- Segmentation label propagation using deep convolutional neural networks and dense conditional random field\n- Fast fully automatic segmentation of the human placenta from motion corrupted MRI\n- Automatic detection of cerebral microbleeds from MR images via 3D convolutional neural networks\n- Non-uniform patch sampling with deep convolutional neural networks for white matter hyperintensity segmentation\n- A unified framework for automatic wound segmentation and analysis with deep convolutional neural networks\n- Deep 3D convolutional encoder networks with shortcuts for multiscale feature integration applied to Multiple Sclerosis lesion segmentation \n- Brain tumor segmentation using convolutional neural networks in MRI images\n- Deep feature learning for knee cartilage segmentation using a triplanar convolutional neural network\n- Automatic Coronary Calcium Scoring in Cardiac CT Angiography Using Convolutional Neural Networks [[Paper]](https://pdfs.semanticscholar.org/4490/792b673bd3b7aead9095777ad611a99f0d64.pdf)\n- Improving computer-aided detection using convolutional neural networks and random view aggregation [[Paper]](https://arxiv.org/pdf/1505.03046.pdf)\n- Pulmonary nodule detection in CT images: false positive reduction using multi-view convolutional networks [[Paper]](http://ieeexplore.ieee.org/document/7422783/)\n\n### Codes\n\n## Part Semantic Segmentation\n-  Look into Person: Self-supervised Structure-sensitive Learning and A New Benchmark for Human Parsing-2017 [[Project]](http://hcp.sysu.edu.cn/lip/) [[Code-Caffe]](https://github.com/Engineering-Course/LIP_SSL) [[Paper]](https://arxiv.org/abs/1703.05446)</br>\n-  **Deep Learning for Human Part Discovery in Images-2016** [[Code-Chainer]](https://github.com/shiba24/deep-learning-for-human-part-discovery-in-images) [[Paper]](http://lmb.informatik.uni-freiburg.de/Publications/2016/OB16a/oliveira16icra.pdf)</br>\n- **A CNN Cascade for Landmark Guided Semantic Part Segmentation-2016** [[Project]](http://aaronsplace.co.uk/papers/jackson2016guided/) [[Paper]](https://arxiv.org/abs/1609.09642)</br>\n- Deep Learning for Semantic Part Segmentation With High-level Guidance-2015 [[Paper]](https://arxiv.org/abs/1505.02438)</br>\n- Neural Activation Constellations-Unsupervised Part Model Discovery with Convolutional Networks-2015 [[Paper]](https://arxiv.org/abs/1504.08289)</br>\n- Human Parsing with Contextualized Convolutional Neural Network-2015 [[Paper]](http://www.cv-foundation.org/openaccess/content_iccv_2015/papers/Liang_Human_Parsing_With_ICCV_2015_paper.pdf)</br>\n- Part detector discovery in deep convolutional neural networks-2014 [[Code]](https://github.com/cvjena/PartDetectorDisovery) [[Paper]](https://arxiv.org/abs/1411.3159)</br>\n-\tHypercolumns for object segmentation and fine-grained localization [[Paper]](http://www.eecs.berkeley.edu/~bharath2/pubs/pdfs/BharathCVPR2015.pdf)</br>\n\n## Clothes Parsing\n-  Looking at Outfit to Parse Clothing-2017 [[Paper]](https://arxiv.org/abs/1703.01386)</br>\n-  Semantic Object Parsing with Local-Global Long Short-Term Memory-2015 [[Paper]](https://arxiv.org/abs/1511.04510)</br>\n-A High Performance CRF Model for Clothes Parsing-2014 [[Project]](http://hi.cs.waseda.ac.jp/~esimo/en/code/clothes_parsing/) [[Code]](https://github.com/bobbens/clothes_parsing) [[Dataset]](http://vision.is.tohoku.ac.jp/~kyamagu/ja/research/clothing_parsing/) [[Paper]](https://pdfs.semanticscholar.org/0416/f5d1564d1f2a597acac04e81b02b2eff67d2.pdf)</br>\n- Clothing co-parsing by joint image segmentation and labeling-2013 [[Project]](http://hcp.sysu.edu.cn/clothing-co-parsing-by-joint-image-segmentation-and-labeling/) [[Dataset]](https://github.com/bearpaw/clothing-co-parsing) [[Paper]](https://arxiv.org/abs/1502.00739)</br>\n- Parsing clothing in fashion photographs-2012 [[Project]](http://vision.is.tohoku.ac.jp/~kyamagu/research/clothing_parsing/) [[Paper]](http://vision.is.tohoku.ac.jp/~kyamagu/papers/yamaguchi_cvpr2012.pdf)</br>\n\n\n## Popular Methods and Implementations\n- U-Net [https://arxiv.org/pdf/1505.04597.pdf][Pytorch](https://github.com/tangzhenyu/SemanticSegmentation_DL/tree/master/U-net)\n- SegNet [https://arxiv.org/pdf/1511.00561.pdf][Caffe](https://github.com/alexgkendall/caffe-segnet)\n- DeepLab [https://arxiv.org/pdf/1606.00915.pdf][Caffe](https://bitbucket.org/deeplab/deeplab-public/)\n- FCN [https://arxiv.org/pdf/1605.06211.pdf][tensorflow](https://github.com/tangzhenyu/SemanticSegmentation_DL/tree/master/FCN)\n- ENet [https://arxiv.org/pdf/1606.02147.pdf][Caffe](https://github.com/TimoSaemann/ENet)\n- LinkNet [https://arxiv.org/pdf/1707.03718.pdf][Torch](https://github.com/e-lab/LinkNet)\n- DenseNet [https://arxiv.org/pdf/1608.06993.pdf]\n- Tiramisu [https://arxiv.org/pdf/1611.09326.pdf]\n- DilatedNet [https://arxiv.org/pdf/1511.07122.pdf]\n- PixelNet [https://arxiv.org/pdf/1609.06694.pdf][Caffe](https://github.com/aayushbansal/PixelNet)\n- ICNet [https://arxiv.org/pdf/1704.08545.pdf][Caffe](https://github.com/hszhao/ICNet )\n- ERFNet [http://www.robesafe.uah.es/personal/eduardo.romera/pdfs/Romera17iv.pdf][Torch](https://github.com/Eromera/erfnet )\n- RefineNet [https://arxiv.org/pdf/1611.06612.pdf][tensorflow](https://github.com/tangzhenyu/SemanticSegmentation_DL/tree/master/RefineNet)\n- PSPNet [https://arxiv.org/pdf/1612.01105.pdf,https://hszhao.github.io/projects/pspnet/][Caffe](https://github.com/hszhao/PSPNet )\n- Dilated convolution [https://arxiv.org/pdf/1511.07122.pdf][Caffe](https://github.com/fyu/dilation )\n- DeconvNet [https://arxiv.org/pdf/1505.04366.pdf][Caffe](http://cvlab.postech.ac.kr/research/deconvnet/ )\n- FRRN [https://arxiv.org/pdf/1611.08323.pdf][Lasagne](https://github.com/TobyPDE/FRRN )\n- GCN [https://arxiv.org/pdf/1703.02719.pdf][PyTorch](https://github.com/ZijunDeng/pytorch-semantic-segmentation )\n- LRR [https://arxiv.org/pdf/1605.02264.pdf][Matconvnet](https://github.com/golnazghiasi/LRR )\n- DUC, HDC [https://arxiv.org/pdf/1702.08502.pdf][PyTorch](https://github.com/ZijunDeng/pytorch-semantic-segmentation )\n- MultiNet [https://arxiv.org/pdf/1612.07695.pdf] [tensorflow1](https://github.com/MarvinTeichmann/MultiNet)[tensorflow2](https://github.com/MarvinTeichmann/KittiSeg)\n- Segaware [https://arxiv.org/pdf/1708.04607.pdf][Caffe](https://github.com/aharley/segaware )\n- Semantic Segmentation using Adversarial Networks [https://arxiv.org/pdf/1611.08408.pdf] [Chainer](+ https://github.com/oyam/Semantic-Segmentation-using-Adversarial-Networks )\n- In-Place Activated BatchNorm:obtain #1 positions [https://arxiv.org/abs/1712.02616] [Pytorch](https://github.com/mapillary/inplace_abn)\n\n## Annotation Tools:\n\n  + https://github.com/AKSHAYUBHAT/ImageSegmentation\n  + https://github.com/kyamagu/js-segment-annotator\n  + https://github.com/CSAILVision/LabelMeAnnotationTool\n  + https://github.com/seanbell/opensurfaces-segmentation-ui\n  + https://github.com/lzx1413/labelImgPlus\n  + https://github.com/wkentaro/labelme\n \n\n## Results:\n\n  + [MSRC-21](http://rodrigob.github.io/are_we_there_yet/build/semantic_labeling_datasets_results.html)\n  + [Cityscapes](https://www.cityscapes-dataset.com/benchmarks/)\n  + [VOC2012](http://host.robots.ox.ac.uk:8080/leaderboard/displaylb.php?challengeid=11&compid=6)\n\n# Reference\n[https://github.com/nightrome/really-awesome-semantic-segmentation](https://github.com/nightrome/really-awesome-semantic-segmentation)\n\n[https://github.com/mrgloom/awesome-semantic-segmentation](https://github.com/mrgloom/awesome-semantic-segmentation)\n"
  },
  {
    "path": "facts/word2vec.md",
    "content": "# Röstigraben\n\n...is an expression used for the border between the German-speaking and the French-speaking Switzerland. In English it would be \"the Rösti ditch\", and it has probably got something with the different (food) cultures to do...\n\n \n\n# Merci vilmal\n\n...is a nice language mixture. An explanation that I have got, which probably isn't completely true, but funny anyway, is that the German-speaking Swiss wanted to say \"merci\" instead of \"danke\", to prove that they weren't German. The problem was only that then they sounded like they were trying to speak French without being very successful (the Swiss German pronunciation of \"merci\" is rather special). The solution was to add the typical Swiss German ending \"vilmal\". Then there would be no doubt of where they were coming from.   ....and this is how the expression \"merci vilmal\" - thanks a lot - may have been created...\n\n"
  },
  {
    "path": "src/context.ts",
    "content": "import { ClassicCurve } from \"./classic-curve\";\nimport { iOS9Curve } from \"./ios9-curve\";\n\ntype CurveStyle = \"ios\" | \"ios9\";\n\nexport type Options = {\n  // The DOM container where the DOM canvas element will be added\n  container: HTMLElement;\n  // The style of the wave: `ios` or `ios9`\n  style?: CurveStyle;\n  //  Ratio of the display to use. Calculated by default.\n  ratio?: number;\n  // The speed of the animation.\n  speed?: number;\n  // The amplitude of the complete wave.\n  amplitude?: number;\n  // The frequency for the complete wave (how many waves). - Not available in iOS9 Style\n  frequency?: number;\n  // The color of the wave, in hexadecimal form (`#336699`, `#FF0`). - Not available in iOS9 Style\n  color?: string;\n  // The `canvas` covers the entire width or height of the container.\n  cover?: boolean;\n  // Width of the canvas. Calculated by default.\n  width?: number;\n  // Height of the canvas. Calculated by default.\n  height?: number;\n  // Decide wether start the animation on boot.\n  autostart?: boolean;\n  // Number of step (in pixels) used when drawed on canvas.\n  pixelDepth?: number;\n  // Lerp speed to interpolate properties.\n  lerpSpeed?: number;\n  // Curve definition override\n  curveDefinition?: ICurveDefinition[];\n};\n\nexport type IiOS9CurveDefinition = {\n  supportLine?: boolean;\n  color: string;\n};\n\nexport type IClassicCurveDefinition = {\n  attenuation: number;\n  lineWidth: number;\n  opacity: number;\n  color?: string;\n};\n\nexport type ICurveDefinition = IiOS9CurveDefinition | IClassicCurveDefinition;\n\nexport interface ICurve {\n  draw: () => void;\n}\n\nexport default class SiriWave {\n  opt: Options;\n\n  // Phase of the wave (passed to Math.sin function)\n  phase: number = 0;\n  // Boolean value indicating the the animation is running\n  run: boolean = false;\n  // Curves objects to animate\n  curves: ICurve[] = [];\n\n  speed: number;\n  amplitude: number;\n  width: number;\n  height: number;\n  heightMax: number;\n  color: string;\n  interpolation: {\n    speed: number | null;\n    amplitude: number | null;\n  };\n\n  canvas: HTMLCanvasElement | null;\n  ctx: CanvasRenderingContext2D;\n\n  animationFrameId: number | undefined;\n  timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n  constructor({ container, ...rest }: Options) {\n    const csStyle = window.getComputedStyle(container);\n\n    this.opt = {\n      container,\n      style: \"ios\",\n      ratio: window.devicePixelRatio || 1,\n      speed: 0.2,\n      amplitude: 1,\n      frequency: 6,\n      color: \"#fff\",\n      cover: false,\n      width: parseInt(csStyle.width.replace(\"px\", \"\"), 10),\n      height: parseInt(csStyle.height.replace(\"px\", \"\"), 10),\n      autostart: true,\n      pixelDepth: 0.02,\n      lerpSpeed: 0.1,\n      ...rest,\n    };\n\n    /**\n     * Actual speed of the animation. Is not safe to change this value directly, use `setSpeed` instead.\n     */\n    this.speed = Number(this.opt.speed);\n\n    /**\n     * Actual amplitude of the animation. Is not safe to change this value directly, use `setAmplitude` instead.\n     */\n    this.amplitude = Number(this.opt.amplitude);\n\n    /**\n     * Width of the canvas multiplied by pixel ratio\n     */\n    this.width = Number(this.opt.ratio! * this.opt.width!);\n\n    /**\n     * Height of the canvas multiplied by pixel ratio\n     */\n    this.height = Number(this.opt.ratio! * this.opt.height!);\n\n    /**\n     * Maximum height for a single wave\n     */\n    this.heightMax = Number(this.height / 2) - 6;\n\n    /**\n     * Color of the wave (used in Classic iOS)\n     */\n    this.color = `rgb(${this.hex2rgb(this.opt.color!)})`;\n\n    /**\n     * An object containing controller variables that need to be interpolated\n     * to an another value before to be actually changed\n     */\n    this.interpolation = {\n      speed: this.speed,\n      amplitude: this.amplitude,\n    };\n\n    /**\n     * Canvas DOM Element where curves will be drawn\n     */\n    this.canvas = document.createElement(\"canvas\");\n\n    /**\n     * 2D Context from Canvas\n     */\n    const ctx = this.canvas.getContext(\"2d\");\n    if (ctx === null) {\n      throw new Error(\"Unable to create 2D Context\");\n    }\n    this.ctx = ctx;\n\n    // Set dimensions\n    this.canvas.width = this.width;\n    this.canvas.height = this.height;\n\n    // By covering, we ensure the canvas is in the same size of the parent\n    if (this.opt.cover === true) {\n      this.canvas.style.width = this.canvas.style.height = \"100%\";\n    } else {\n      this.canvas.style.width = `${this.width / this.opt.ratio!}px`;\n      this.canvas.style.height = `${this.height / this.opt.ratio!}px`;\n    }\n\n    // Instantiate all curves based on the style\n    switch (this.opt.style) {\n      case \"ios9\":\n        this.curves = ((this.opt.curveDefinition || iOS9Curve.getDefinition()) as IiOS9CurveDefinition[]).map(\n          (def) => new iOS9Curve(this, def),\n        );\n        break;\n\n      case \"ios\":\n      default:\n        this.curves = ((this.opt.curveDefinition || ClassicCurve.getDefinition()) as IClassicCurveDefinition[]).map(\n          (def) => new ClassicCurve(this, def),\n        );\n        break;\n    }\n\n    // Attach to the container\n    this.opt.container.appendChild(this.canvas);\n\n    // Start the animation\n    if (this.opt.autostart) {\n      this.start();\n    }\n  }\n\n  /**\n   * Convert an HEX color to RGB\n   */\n  private hex2rgb(hex: string): string | null {\n    const shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n    hex = hex.replace(shorthandRegex, (m, r, g, b) => r + r + g + g + b + b);\n    const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n    return result\n      ? `${parseInt(result[1], 16).toString()},${parseInt(result[2], 16).toString()},${parseInt(\n          result[3],\n          16,\n        ).toString()}`\n      : null;\n  }\n\n  private intLerp(v0: number, v1: number, t: number): number {\n    return v0 * (1 - t) + v1 * t;\n  }\n\n  /**\n   * Interpolate a property to the value found in this.interpolation\n   */\n  private lerp(propertyStr: \"amplitude\" | \"speed\"): number | null {\n    const prop = this.interpolation[propertyStr];\n    if (prop !== null) {\n      this[propertyStr] = this.intLerp(this[propertyStr], prop, this.opt.lerpSpeed!);\n      if (this[propertyStr] - prop === 0) {\n        this.interpolation[propertyStr] = null;\n      }\n    }\n    return this[propertyStr];\n  }\n\n  /**\n   * Clear the canvas\n   */\n  private clear() {\n    this.ctx.globalCompositeOperation = \"destination-out\";\n    this.ctx.fillRect(0, 0, this.width, this.height);\n    this.ctx.globalCompositeOperation = \"source-over\";\n  }\n\n  /**\n   * Draw all curves\n   */\n  private draw() {\n    this.curves.forEach((curve) => curve.draw());\n  }\n\n  /**\n   * Clear the space, interpolate values, calculate new steps and draws\n   * @returns\n   */\n  private startDrawCycle() {\n    this.clear();\n\n    // Interpolate values\n    this.lerp(\"amplitude\");\n    this.lerp(\"speed\");\n\n    this.draw();\n    this.phase = (this.phase + (Math.PI / 2) * this.speed) % (2 * Math.PI);\n\n    if (window.requestAnimationFrame) {\n      this.animationFrameId = window.requestAnimationFrame(this.startDrawCycle.bind(this));\n    } else {\n      this.timeoutId = setTimeout(this.startDrawCycle.bind(this), 20);\n    }\n  }\n\n  /* API */\n\n  /**\n   * Start the animation\n   */\n  start() {\n    if (!this.canvas) {\n      throw new Error(\"This instance of SiriWave has been disposed, please create a new instance\");\n    }\n\n    this.phase = 0;\n\n    // Ensure we don't re-launch the draw cycle\n    if (!this.run) {\n      this.run = true;\n      this.startDrawCycle();\n    }\n  }\n\n  /**\n   * Stop the animation\n   */\n  stop() {\n    this.phase = 0;\n    this.run = false;\n\n    // Clear old draw cycle on stop\n    if (this.animationFrameId) {\n      window.cancelAnimationFrame(this.animationFrameId);\n    }\n    if (this.timeoutId) {\n      clearTimeout(this.timeoutId);\n    }\n  }\n\n  /**\n   * Dispose\n   */\n  dispose() {\n    this.stop();\n    if (this.canvas) {\n      this.canvas.remove();\n      this.canvas = null;\n    }\n  }\n\n  /**\n   * Setzen eines neuen Wertes für eine Eigenschaft (interpoliert)\n   */\n  set(propertyStr: \"amplitude\" | \"speed\", value: number) {\n    this.interpolation[propertyStr] = value;\n  }\n\n  /**\n   * Set a new value for the speed property (interpolated)\n   */\n  setSpeed(value: number) {\n    this.set(\"speed\", value);\n  }\n\n  /**\n   * Set a new value for the amplitude property (interpolated)\n   */\n  setAmplitude(value: number) {\n    this.set(\"amplitude\", value);\n  }\n}\n"
  },
  {
    "path": "src/ios9_curve.ts",
    "content": "import SiriWave, { ICurve, IiOS9CurveDefinition } from \"./index\";\n\nexport class iOS9Curve implements ICurve {\n  ctrl: SiriWave;\n  definition: IiOS9CurveDefinition;\n\n  spawnAt: number;\n  noOfCurves: number;\n  prevMaxY: number;\n\n  phases: number[];\n  amplitudes: number[];\n  despawnTimeouts: number[];\n  offsets: number[];\n  speeds: number[];\n  finalAmplitudes: number[];\n  widths: number[];\n  verses: number[];\n\n  GRAPH_X = 25;\n  AMPLITUDE_FACTOR = 0.8;\n  SPEED_FACTOR = 1;\n  DEAD_PX = 2;\n  ATT_FACTOR = 4;\n\n  DESPAWN_FACTOR = 0.02;\n\n  NOOFCURVES_RANGES: [number, number] = [2, 5];\n  AMPLITUDE_RANGES: [number, number] = [0.3, 1];\n  OFFSET_RANGES: [number, number] = [-3, 3];\n  WIDTH_RANGES: [number, number] = [1, 3];\n  SPEED_RANGES: [number, number] = [0.5, 1];\n  DESPAWN_TIMEOUT_RANGES: [number, number] = [500, 2000];\n\n  constructor(ctrl: SiriWave, definition: IiOS9CurveDefinition) {\n    this.ctrl = ctrl;\n    this.definition = definition;\n\n    this.noOfCurves = 0;\n    this.spawnAt = 0;\n    this.prevMaxY = 0;\n\n    this.phases = [];\n    this.offsets = [];\n    this.speeds = [];\n    this.finalAmplitudes = [];\n    this.widths = [];\n    this.amplitudes = [];\n    this.despawnTimeouts = [];\n    this.verses = [];\n  }\n\n  private getRandomRange(e: [number, number]): number {\n    return e[0] + Math.random() * (e[1] - e[0]);\n  }\n\n  private spawnSingle(ci: number): void {\n    this.phases[ci] = 0;\n    this.amplitudes[ci] = 0;\n\n    this.despawnTimeouts[ci] = this.getRandomRange(this.DESPAWN_TIMEOUT_RANGES);\n    this.offsets[ci] = this.getRandomRange(this.OFFSET_RANGES);\n    this.speeds[ci] = this.getRandomRange(this.SPEED_RANGES);\n    this.finalAmplitudes[ci] = this.getRandomRange(this.AMPLITUDE_RANGES);\n    this.widths[ci] = this.getRandomRange(this.WIDTH_RANGES);\n    this.verses[ci] = this.getRandomRange([-1, 1]);\n  }\n\n  private getEmptyArray(count: number): number[] {\n    return new Array(count);\n  }\n\n  private spawn(): void {\n    this.spawnAt = Date.now();\n\n    this.noOfCurves = Math.floor(this.getRandomRange(this.NOOFCURVES_RANGES));\n\n    this.phases = this.getEmptyArray(this.noOfCurves);\n    this.offsets = this.getEmptyArray(this.noOfCurves);\n    this.speeds = this.getEmptyArray(this.noOfCurves);\n    this.finalAmplitudes = this.getEmptyArray(this.noOfCurves);\n    this.widths = this.getEmptyArray(this.noOfCurves);\n    this.amplitudes = this.getEmptyArray(this.noOfCurves);\n    this.despawnTimeouts = this.getEmptyArray(this.noOfCurves);\n    this.verses = this.getEmptyArray(this.noOfCurves);\n\n    for (let ci = 0; ci < this.noOfCurves; ci++) {\n      this.spawnSingle(ci);\n    }\n  }\n\n  private globalAttFn(x: number): number {\n    return Math.pow(this.ATT_FACTOR / (this.ATT_FACTOR + Math.pow(x, 2)), this.ATT_FACTOR);\n  }\n\n  private sin(x: number, phase: number): number {\n    return Math.sin(x - phase);\n  }\n\n  private yRelativePos(i: number): number {\n    let y = 0;\n\n    for (let ci = 0; ci < this.noOfCurves; ci++) {\n      // Generate a static T so that each curve is distant from each oterh\n      let t = 4 * (-1 + (ci / (this.noOfCurves - 1)) * 2);\n      // but add a dynamic offset\n      t += this.offsets![ci];\n\n      const k = 1 / this.widths![ci];\n      const x = i * k - t;\n\n      y += Math.abs(this.amplitudes[ci] * this.sin(this.verses[ci] * x, this.phases[ci]) * this.globalAttFn(x));\n    }\n\n    // Divide for NoOfCurves so that y <= 1\n    return y / this.noOfCurves;\n  }\n\n  private yPos(i: number): number {\n    return (\n      this.AMPLITUDE_FACTOR *\n      this.ctrl.heightMax *\n      this.ctrl.amplitude *\n      this.yRelativePos(i) *\n      this.globalAttFn((i / this.GRAPH_X) * 2)\n    );\n  }\n\n  private xPos(i: number): number {\n    return this.ctrl.width * ((i + this.GRAPH_X) / (this.GRAPH_X * 2));\n  }\n\n  private drawSupportLine() {\n    const { ctx } = this.ctrl;\n\n    const coo: [number, number, number, number] = [0, this.ctrl.heightMax, this.ctrl.width, 1];\n    const gradient = ctx.createLinearGradient.apply(ctx, coo);\n    gradient.addColorStop(0, \"transparent\");\n    gradient.addColorStop(0.1, \"rgba(255,255,255,.5)\");\n    gradient.addColorStop(1 - 0.1 - 0.1, \"rgba(255,255,255,.5)\");\n    gradient.addColorStop(1, \"transparent\");\n\n    ctx.fillStyle = gradient;\n    ctx.fillRect.apply(ctx, coo);\n  }\n\n  draw() {\n    const { ctx } = this.ctrl;\n\n    ctx.globalAlpha = 0.7;\n    ctx.globalCompositeOperation = \"lighter\";\n\n    if (this.spawnAt === 0) {\n      this.spawn();\n    }\n\n    if (this.definition.supportLine) {\n      // Draw the support line\n      return this.drawSupportLine();\n    }\n\n    for (let ci = 0; ci < this.noOfCurves; ci++) {\n      if (this.spawnAt + this.despawnTimeouts[ci] <= Date.now()) {\n        this.amplitudes[ci] -= this.DESPAWN_FACTOR;\n      } else {\n        this.amplitudes[ci] += this.DESPAWN_FACTOR;\n      }\n\n      this.amplitudes[ci] = Math.min(Math.max(this.amplitudes[ci], 0), this.finalAmplitudes[ci]);\n      this.phases[ci] = (this.phases[ci] + this.ctrl.speed * this.speeds[ci] * this.SPEED_FACTOR) % (2 * Math.PI);\n    }\n\n    let maxY = -Infinity;\n    let minX = +Infinity;\n\n    // Write two opposite waves\n    for (const sign of [1, -1]) {\n      ctx.beginPath();\n\n      for (let i = -this.GRAPH_X; i <= this.GRAPH_X; i += this.ctrl.opt.pixelDepth!) {\n        const x = this.xPos(i);\n        const y = this.yPos(i);\n        ctx.lineTo(x, this.ctrl.heightMax - sign * y);\n\n        minX = Math.min(minX, x);\n        maxY = Math.max(maxY, y);\n      }\n\n      ctx.closePath();\n\n      ctx.fillStyle = `rgba(${this.definition.color}, 1)`;\n      ctx.strokeStyle = `rgba(${this.definition.color}, 1)`;\n      ctx.fill();\n    }\n\n    if (maxY < this.DEAD_PX && this.prevMaxY > maxY) {\n      this.spawnAt = 0;\n    }\n\n    this.prevMaxY = maxY;\n\n    return null;\n  }\n\n  static getDefinition(): IiOS9CurveDefinition[] {\n    return [\n      {\n        color: \"255,255,255\",\n        supportLine: true,\n      },\n      {\n        // blue\n        color: \"15, 82, 169\",\n      },\n      {\n        // red\n        color: \"173, 57, 76\",\n      },\n      {\n        // green\n        color: \"48, 220, 155\",\n      },\n    ];\n  }\n}\n"
  },
  {
    "path": "src/klassich.ts",
    "content": "import SiriWave, { IClassicCurveDefinition, ICurve } from \"./index\";\nexport class ClassicCurve implements ICurve {\n  ctrl: SiriWave;\n  definition: IClassicCurveDefinition;\n  ATT_FACTOR = 4;\n  GRAPH_X = 2;\n  AMPLITUDE_FACTOR = 0.6;\n\n  constructor(ctrl: SiriWave, definition: IClassicCurveDefinition) {\n    this.ctrl = ctrl;\n    this.definition = definition;\n  }\n\n  private globalAttFn(x: number): number {\n    return Math.pow(this.ATT_FACTOR / (this.ATT_FACTOR + Math.pow(x, this.ATT_FACTOR)), this.ATT_FACTOR);\n  }\n\n  private xPos(i: number): number {\n    return this.ctrl.width * ((i + this.GRAPH_X) / (this.GRAPH_X * 2));\n  }\n\n  private yPos(i: number): number {\n    return (\n      this.AMPLITUDE_FACTOR *\n      (this.globalAttFn(i) *\n        (this.ctrl.heightMax * this.ctrl.amplitude) *\n        (1 / this.definition.attenuation) *\n        Math.sin(this.ctrl.opt.frequency! * i - this.ctrl.phase))\n    );\n  }\n\n  draw(): void {\n    const { ctx } = this.ctrl;\n\n    ctx.moveTo(0, 0);\n    ctx.beginPath();\n\n    const finalColor = this.definition.color || this.ctrl.color;\n    const colorHex = finalColor.replace(/rgb\\(/g, \"\").replace(/\\)/g, \"\");\n    ctx.strokeStyle = `rgba(${colorHex},${this.definition.opacity})`;\n    ctx.lineWidth = this.definition.lineWidth;\n\n    // Cycle the graph from -X to +X every PX_DEPTH and draw the line\n    for (let i = -this.GRAPH_X; i <= this.GRAPH_X; i += this.ctrl.opt.pixelDepth!) {\n      ctx.lineTo(this.xPos(i), this.ctrl.heightMax + this.yPos(i));\n    }\n\n    ctx.stroke();\n  }\n\n  static getDefinition(): IClassicCurveDefinition[] {\n    return [\n      {\n        attenuation: -2,\n        lineWidth: 1,\n        opacity: 0.1,\n      },\n      {\n        attenuation: -6,\n        lineWidth: 1,\n        opacity: 0.2,\n      },\n      {\n        attenuation: 4,\n        lineWidth: 1,\n        opacity: 0.4,\n      },\n      {\n        attenuation: 2,\n        lineWidth: 1,\n        opacity: 0.6,\n      },\n      {\n        attenuation: 1,\n        lineWidth: 1.5,\n        opacity: 1,\n      },\n    ];\n  }\n}\n"
  },
  {
    "path": "src/pramp/algodaten/DecodeVariations/answer.java",
    "content": "import java.io.*;\nimport java.util.*;\n\nclass Solution {\n\n\tstatic int decodeVariations(String S) {\n    int[] dp = new int[S.length() + 1];\n    dp[0] = 1;\n    if (S.charAt(0) != '0'){\n      dp[1] = 1;\n    } else {\n      dp[1] = 0;\n    }\n    for (int i = 2; i <= S.length(); i++){\n      \n      int oneD = Integer.parseInt(S.substring(i-1, i));\n      int twoD = Integer.parseInt(S.substring(i-2, i));\n      \n      if ( 1 <= oneD && oneD <= 9){\n        dp[i] += dp[i-1];\n      }\n      if ( 10 <= twoD && twoD <= 26){\n        dp[i] += dp[i-2];\n      }\n    }\n    return dp[S.length()];\n\t}\n\n\tpublic static void main(String[] args) {\n    \n\t  System.out.println(decodeVariations(\"1262\") + \" Should be 3\");\n    \n\t}\n}\n\n"
  },
  {
    "path": "src/pramp/algodaten/DecodeVariations/answer.txt",
    "content": "Solution: Dynamic Programming\n\nLet dp(i) be the answer for the string S[i:]. We can calculate dp(i) in terms of dp(i+1) and dp(i+2).\n\nIf S[i] == 0, then dp(i) = 0. There are no ways, since no encoded letter starts with 0.\n\nIf S[i] == 1, then we have dp(i) = dp(i+1) + dp(i+2), since either we write A plus any way to write S[i+1:], or we write a letter that encodes somewhere between 10 and 19, plus any way to write S[i+2:].\n\nIf S[i] == 2, then we have dp(i) = dp(i+1) + (S[i+1] <= 6 ? dp(i+2) : 0). Either we write B plus any way to write S[i+1:], or we write a letter that encodes somewhere between 20 and 26, plus any way to write S[i+2:].\n\nIf S[i] > 2, then we have dp(i) = dp(i+1). For example, if S[i] = 5, then we write E plus any way to write S[i+1:]. We can’t write any other letters because the only letter which has encoding that starts with 5 is E.\n\nPutting this all together, we have the following code:\n\nfunction decodeVariations(S):\n    N = S.length\n    dp = new Array(N)\n    dp[N] = 1\n    for i from N-1 to 0:\n        if S[i] == '0':\n            dp[i] = 0\n        else if S[i] == '1':\n            dp[i] = dp[i+1] + dp[i+2]\n        else if S[i] == '2':\n            dp[i] = dp[i+1]\n            if i+1 < S.length && S[i+1] <= '6':\n                dp[i] += dp[i+2]\n        else:\n            dp[i] = dp[i+1]\n\n    return dp[0]\n    \n    \nOf course, since at each step we only reference dp[i+1] and dp[i+2], we could store these as variables first and second. This means we do not need to store the entire array:\n\nfunction decodeVariations(S):\n    pre, cur = 27, 0\n    first, second = 1, 1\n\n    for i from S.length - 1 to 0:\n        d = int(S[i])\n        if d == 0:\n            cur = 0\n        else:\n            cur = first\n            # pre represents the previously seen number S[i+1]\n            # If d*10 + pre < 26 (and d != 0), it is valid to\n            # write a letter that uses two digits of encoding length,\n            # so we count 'second = dp[i+2]' in our current answer.\n            if d * 10 + pre < 27:\n                cur += second\n\n        pre = d\n        first, second = cur, first\n\n    return cur\n    \n    \nTime Complexity: O(N) where N is the length of S.\n\nSpace Complexity: O(N) to store the array dp. In our space saving variation, the complexity is O(1).\n"
  },
  {
    "path": "src/pramp/algodaten/DecodeVariations/answerII.py",
    "content": "import unittest\n\ndef decodeVariations(S):\n  \"\"\"\n  @param S: str\n  @return: int\n\n  Approach 1: Decode Variations -> DP\n\n\n  1262\n\n  12 6 2 LFB\n\n  1 2 6 2 ABFB\n\n  1 26 2 AZB\n\n  3 options\n\n  DP \n\n  input: i is the index of the current letter in word\n\n  output: total combinations or options\n\n  Base Case: DP[len(word)] = 1\n\n  Start Case: DP(0)\n\n  Recursion:\n\n  firstDigit = int(DP[i])\n\n  twoDigit = int(DP[i:i+2])\n\n  if 1 <= firstLetter <= 9:\n    total += dp(i+1)\n\n  if 10 <= twoDigit <= 26:\n\n    total += dp(i+2)\n\n  return total\n\n\n  DP linear or memo DP\n\n\n  R- O(N ) with memo (2^N) without memo\n\n  S-O(N)\n\n  \"\"\"\n  return VariationsDecoder().decode_variations(S)\n\nclass VariationsDecoder:\n  \n    \n  def decode_variations(self,S):\n    \n    '''\n    \n    '''\n    #hashmap memo cache\n    self.dp_memo_cache = {}\n    self.dp_memo_cache[len(S)] = 1\n\n    #store S\n    self.S = S\n    \n    #start case with 0\n    return self._dp(0)\n    \n  def _dp(self, letter_index):\n    # letter_index is the index of the letter in the word S\n    \n    #memo\n    if letter_index in self.dp_memo_cache:\n      return self.dp_memo_cache[letter_index]\n    \n    #base case\n    if letter_index == len(self.S):\n      # if we reached the end, we found 1 way to decode\n      return 1\n    \n    #recursion\n    total = 0\n    \n    firstDigit = int(self.S[letter_index])\n  \n    if 1 <= firstDigit <= 9:\n      total += self._dp(letter_index+1)\n\n    if letter_index +1 < len(self.S):\n      twoDigit = int(self.S[letter_index:letter_index+2])\n      \n      if 10 <= twoDigit <= 26:\n        total += self._dp(letter_index+2)\n\n    self.dp_memo_cache[letter_index] = total\n    return total\n  \n  \nclass TestVariationsDecoder(unittest.TestCase):\n  \n  def test_1(self):\n    \n    #Arrange\n    S = '1'\n    \n    #Act\n    ans=  VariationsDecoder().decode_variations(S)\n    \n    #Assert\n    print(ans)\n    self.assertEqual(ans,1)\n\n  def test_1262(self):\n    \n    #Arrange\n    S = '1262'\n    \n    #Act\n    ans=  VariationsDecoder().decode_variations(S)\n    \n    #Assert\n    print(ans)\n    self.assertEqual(ans,3)\n    \n  \n#unittest.main(verbosity=2)\n  \n\n\n\t\n\n"
  },
  {
    "path": "src/pramp/algodaten/DecodeVariations/hints.txt",
    "content": "Try to write the number of ways to write S[i:] in terms of the number of ways to write S[i+1:] and S[i+2:]. \n\nFor example, if there are 2 ways to write S[1:] = '262' ('ZB' and 'BFB'), and one way to write S[2:] = '62' ('FB'), \n\nthen we could say there are 3 ways to write S as we either write 'A' then a decoding of S[1:], or write 'L' then a decoding of S[2:].\n\nWe can store the answer for S[i:] into an integer array dp.\n\nThe recursion is given below. You can help the candidate with the specific part of the recursion they are having difficulty with:\n\nIf S[i] == 0, then dp(i) = 0.\n\nIf S[i] == 1, then we have dp(i) = dp(i+1) + dp(i+2).\n\nIf S[i] == 2, then we have dp(i) = dp(i+1) + (S[i+1] <= 6 ? dp(i+2) : 0).\n\nIf S[i] > 2, then we have dp(i) = dp(i+1).\n"
  },
  {
    "path": "src/pramp/algodaten/DecodeVariations/question.txt",
    "content": "decode-variations\n\nA letter can be encoded to a number in the following way:\n\n'A' -> '1', 'B' -> '2', 'C' -> '3', ..., 'Z' -> '26'\nA message is a string of uppercase letters, and it is encoded first using this scheme. For example, 'AZB' -> '1262'\n\nGiven a string of digits S from 0-9 representing an encoded message, return the number of ways to decode it.\n\nExamples:\n\ninput:  S = '1262'\noutput: 3\nexplanation: There are 3 messages that encode to '1262': 'AZB', 'ABFB', and 'LFB'.\nConstraints:\n\n[time limit] 5000ms\n\n[input] string S\n\n1 ≤ S.length ≤ 12\n[output] integer\n"
  },
  {
    "path": "src/pramp/algodaten/Diff Between Two Strings/answer.py",
    "content": "def diffBetweenTwoStrings(source, target):\n  m, n = len(target), len(source) \n  dp = [[0 for j in range(n + 1)] for i in range(m + 1)]\n  \n  # Build dp\n  for i in range(m + 1):\n    for j in range(n + 1):\n      if i == 0:\n        dp[i][j] = j\n      elif j == 0:\n        dp[i][j] = i\n      else:\n        if target[i - 1] == source[j - 1]:\n          dp[i][j] = dp[i - 1][j - 1]\n        else:\n          dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + 1\n  \n  # Reconstruct path\n  path = []\n  i, j = m, n\n\n  while i > 0 and j > 0:\n    if target[i - 1] == source[j - 1]:\n      # Write char with no edits\n      path.append(source[j - 1])\n      i -= 1\n      j -= 1\n    else:\n      # We must either subtract source[j - 1] or add target[i - 1]\n      if dp[i][j - 1] < dp[i - 1][j]:\n        path.append(\"-\" + source[j - 1])   \n        j -= 1\n      else:\n        path.append(\"+\" + target[i - 1])\n        i -= 1\n        \n  while i > 0:\n    path.append(\"+\" + target[i - 1])\n    i -= 1\n  \n  while j > 0:\n    path.append(\"-\" + source[j - 1])   \n    j -= 1\n    \n  path.reverse()\n  return path\n"
  },
  {
    "path": "src/pramp/algodaten/Diff Between Two Strings/question.txt",
    "content": "Diff Between Two Strings\n\nGiven two strings of uppercase letters source and target, list (in string form) a sequence of edits to convert from source to target that uses the least edits possible.\n\nFor example, with strings source = \"ABCDEFG\", and target = \"ABDFFGH\" we might return: [\"A\", \"B\", \"-C\", \"D\", \"-E\", \"F\", \"+F\", \"G\", \"+H\"\n\nMore formally, for each character C in source, we will either write the token C, which does not count as an edit; or write the token -C, which counts as an edit.\n\nAdditionally, between any token that we write, we may write +D where D is any letter, which counts as an edit.\n\nAt the end, when reading the tokens from left to right, and not including tokens prefixed with a minus-sign, the letters should spell out target (when ignoring plus-signs.)\n\nIn the example, the answer of A B -C D -E F +F G +H has total number of edits 4 (the minimum possible), and ignoring subtraction-tokens, spells out A, B, D, F, +F, G, +H which represents the string target.\n\nIf there are multiple answers, use the answer that favors removing from the source first.\n\nConstraints:\n\n[time limit] 5000ms\n[input] string source\n2 ≤ source.length ≤ 12\n[input] string target\n2 ≤ target.length ≤ 12\n[output] array.string\n"
  },
  {
    "path": "src/pramp/algodaten/Island Count/answer.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n\nint r_size;\nint c_size;\n\n//void mark_island(int (*mat)[c_size], int r, int c) {\nvoid mark_island(int mat[][c_size], int r, int c) {\n  if (r < 0 || r >= r_size || c < 0 || c >= c_size)\n    return;\n  if (mat[r][c] == 0)\n    return;\n  \n  mat[r][c] = 0; // marked\n  mark_island(mat, r - 1, c);\n  mark_island(mat, r, c - 1);\n  mark_island(mat, r + 1, c);\n  mark_island(mat, r, c + 1);\n}\n\nint getNumberOfIslands(size_t numRows, size_t numCols, int binaryMatrix[numRows][numCols]) \n{\n  int islands = 0;\n  r_size = numRows;\n  c_size = numCols;\n\n  for (int r = 0; r < numRows; r++) {\n    for (int c = 0; c < numCols; c++) {\n      if (binaryMatrix[r][c] == 1) {\n        islands++;\n        mark_island(binaryMatrix, r, c);\n      }\n    }\n  }\n  return islands;\n}\n\nint main() {\n  int m[2][2] = {{1, 0}, {0, 1}};\n  int result = getNumberOfIslands(2,2,m);\n  printf(\"%d\", result);  \n  return 0;\n}\n\n"
  },
  {
    "path": "src/pramp/algodaten/Island Count/hints.txt",
    "content": "Island Count\n\nIf your peer is stuck, ask them if they know how to traverse a undirected graph.\n\nAt this point, you peer may come up with a recursive solution by using a Breadth-First Search (BFS) or a Depth-First Search (DFS) algorithm. \n\nWhile this works, see if you can nudge them toward an iterative solution. This is not a must, but preferable.\n\n\nMake sure that your peer’s code does not access out of bound indices, especially when trying to traverse adjacent cells in binary Matrix.\n\nWatch out for duplicate island counting in your peer’s code. \n\nIt’s important that a visited cell of 1 is marked properly to avoid redundant counting.\n\n\nAny solution that takes more than O(N⋅M) time isn’t optimal.\n"
  },
  {
    "path": "src/pramp/algodaten/Island Count/question.txt",
    "content": "Island Count\n\nGiven a 2D array binaryMatrix of 0s and 1s, implement a function getNumberOfIslands that returns the number of islands of 1s in binaryMatrix.\n\nAn island is defined as a group of adjacent values that are all 1s. A cell in binaryMatrix is considered adjacent to another cell if they are next to each either on the same row or column. Note that two values of 1 are not part of the same island if they’re sharing only a mutual “corner” (i.e. they are diagonally neighbors).\n\nExplain and code the most efficient solution possible and analyze its time and space complexities.\n\nExample:\n\ninput:  binaryMatrix = [ [0,    1,    0,    1,    0],\n                         [0,    0,    1,    1,    1],\n                         [1,    0,    0,    1,    0],\n                         [0,    1,    1,    0,    0],\n                         [1,    0,    1,    0,    1] ]\n\noutput: 6 # since this is the number of islands in binaryMatrix.\n          # See all 6 islands color-coded below.\nalt\n\nConstraints:\n\n[time limit] 5000ms\n\n[input] array.array.int binaryMatrix\n\n1 ≤ binaryMatrix.length ≤ 100\n1 ≤ binaryMatrix[i].length ≤ 100\n[output] integer\n"
  },
  {
    "path": "src/pramp/algodaten/Number of Paths/ans.py",
    "content": "def num_of_paths_to_dest_v2(n):\n  paths = [[0 for col in range(n)] for row in range(n)]\n  \n  for row in range(n):\n    for col in range(row, n):\n      if row == 0 and col == 0:\n        paths[row][col] = 1\n      if row > 0:\n        paths[row][col] += paths[row-1][col]\n      if col > 0:\n        paths[row][col] += paths[row][col -1]\n  return paths[-1][-1]\n"
  },
  {
    "path": "src/pramp/algodaten/Number of Paths/answer.txt",
    "content": "Number of Paths\n\nThe recursive approach\n\nThe simplest way to create this function is to write a recursive function, that calculates the possible paths to each square on the grid, using the squares already calculated. Our output is the paths from (0,0) to (n-1,n-1). Notice the following recursive relation: for every path from (0,0) to (i,j), either: The last step is N, in which case it is generated by a legitimate path to (i,j-1), and then one step north. The last step is E, in which case it is generated by a legitimate path to (i-1,j), and then one step east. For example, take all paths to (4,3). The paths that end with an N, such as “EEENN”, induce paths to (4,2) by removing the last N (“EEEN”). On the other hand, the paths that end with an E, such as “ENENE”, induce paths to (3,3) by removing the last E (“ENEN”).\n\nThis indicates the number of ways to square (i,j) is equal to the number of ways to square (i-1,j) plus the number of ways to (i,j-1). We build the function that uses this recursive relation, to calculate the number of paths. Notice that the function may call the same square multiple times, so we use the memoization technique to reduce the number of calls significantly:\n\nPseudocode:\n\n# input: n - a positive integer representing the grid size.\n# output: number of valid paths from (0,0) to (n-1,n-1).\n\nfunction numOfPathsToDest(n):\n    # allocate a 2D array for memoization\n    memo = [][]\n\n    # the memoization array is initialized with -1\n    # to indicate uncalculated squares.\n    for i from 0 to n-1:\n        for j from 0 to n-1:\n            memo[i][j] = -1\n\n    return numOfPathsToSquare(n-1, n-1, memo)\n\n\n# input:\n#    i, j - a pair of non-negative integer coordinates\n#    memo - a 2D memoization array.\n# output:\n#    number of paths from (0,0) to the square represented in (i,j),\n\nfunction numOfPathsToSquare(i, j, memo):\n    if (i < 0 OR j < 0):\n        return 0\n    else if (i < j):\n        memo[i][j] = 0\n    else if (memo[i][j] != -1):\n        return memo[i][j] \n    else if (i == 0 AND j == 0):\n        memo[i][j] = 1\n    else:\n        memo[i][j] = numOfPathsToSquare(i, j -1, memo) +\n        numOfPathsToSquare(i - 1, j, memo)\n\n    return memo[i][j]\nTime Complexity: first, notice that in order to calculate the number of paths to a specific square, we need all the square south and west to it. This implies that all squares beneath the diagonal are calculated. In addition, almost every square value is used twice - for the square north to it and east to it (except for the border squares, which are used once). This means that our time complexity is O(n^2), since the recursive function is called once or twice for about half of the squares, and each call takes O(1) time.\n\nSpace Complexity: the memoization requires the space complexity to be also O(n^2), since we save values for all squares.\n\nThe iterative approach\n\nThe space complexity can be improved to O(n) if we choose an iterative solution, which uses the same recursive relation. Notice that for calculating the paths for square (i,j) we only need squares (i-1,j) and (i,j-1). Thus, by calculating the number of paths row by row from south to north, and west to east in the rows, the function needs to save only the last two rows. This may be implemented as follows:\n\nPseudocode:\n\n# input: n - a positive integer representing the grid size.\n# output: number of valid paths from (0,0) to (n-1,n-1).\n\nfunction numOfPathsToDest(n):\n    if (n == 1):\n        return 1\n\n    lastRow = []\n    for i from 1 to n-1:\n        lastRow[i] = 1 # base case - the first row is all ones\n\n    currentRow = []\n\n    for j from 1 to n-1:\n        for i from j to n-1:\n            if (i == j):\n                currentRow[i] = lastRow[i]\n            else:\n                currentRow[i] = currentRow[i-1] + lastRow[i]\n        lastRow = currentRow\n\n    return currentRow[n-1]\nTime Complexity: as we see, the function still calculates every square south-east to the diagonal, leaving the time complexity to be O(n^2),\n\nSpace Complexity: the space complexity is reduced to O(n) since we are memoizing only the last two rows.\n\nCombinatorial Remark (optional read): There is a closed formula that answers this question, called the Catalan Number Formula. This formula is based on the fact that every path from (0,0) to (n-1,n-1) is parallel to a sequence of n-1 pairs of parentheses which are correctly matched: Take a path sequence of N’s and E’s. since the car begins at (0,0) and ends at (n-1,n-1), it needs to go exactly n-1 times East, and n-1 times North. Put differently, all sequences consist of n-1 E’s and n-1 N’s. Just like every balanced parenthesis string has the same number of “(“ and “)” signs. Furthermore, in every pair (i,j), the first coordinate is the number of times the car went east so far, and the second coordinate is the number of times the car went north. This indicates that the diagonal restriction means the number of E’s, in every prefix of the string is equal or greater than the number of N’s. Just as in every balanced parenthesis string, the number of “(“ is is equal or greater than the number of “)”. The number of the balanced parenthesis strings of n-1 pairs, is given by the Catalan Number Formula: . The proof for its correctness is beyond our scope, but is located in the Catalan Number Wikipedia page.\n\nNote that although this formula is mathematically closed, calculating the Binomial Coefficient , is done in O(n) runtime complexity, so calculating the number directly doesn’t improve the asymptotic runtime complexity. But direct calculation spares the need for saving previous values, so the space complexity may be reduced to O(1) this way.\n"
  },
  {
    "path": "src/pramp/algodaten/Number of Paths/hints.txt",
    "content": "While this question may seem hard to comprehend at first sight, it is easily solved in the “divide and conquer” recursive method.\nEncourage your peer to implement first any solution, even if it is not optimal. Once done, ask them to optimize it.\nIf your peer doesn’t have any intuition to the question, guide them towards answering a more general question - given (i,j), calculate all possible ways to travel from (0,0) to (i,j). Also, suggest your peer to draw a grid and try to calculate it manually for a few squares.\nAnother good hint is to direct to first think about the obvious base cases, e.g. if the square (i,j) is on the other side of the border or if it is out of the grid (0 ways).\nIf your peer still doesn’t have a clue, explain the recursive relation provided in the solution.\nYour peer should get a full score only if the function achieves O(n^2) time complexity, and O(n) space complexity (or better), and doing so without any hints.\nObviously, we do not expect your peer to be familiar with the combinatorial solution, or discover it by themselves. Moreover, it’s OK if your peer discovers the combinatorial approach for this question, but since this is a coding interview, if your peer is familiar with it beforehand, encourage them to find another recursive solution to the question.\n"
  },
  {
    "path": "src/pramp/algodaten/Number of Paths/question.txt",
    "content": "Number of Paths\n\nYou’re testing a new driverless car that is located at the Southwest (bottom-left) corner of an n×n grid. The car is supposed to get to the opposite, Northeast (top-right), corner of the grid. Given n, the size of the grid’s axes, write a function numOfPathsToDest that returns the number of the possible paths the driverless car can take.\n\nalt the car may move only in the white squares\n\nFor convenience, let’s represent every square in the grid as a pair (i,j). The first coordinate in the pair denotes the east-to-west axis, and the second coordinate denotes the south-to-north axis. The initial state of the car is (0,0), and the destination is (n-1,n-1).\n\nThe car must abide by the following two rules: it cannot cross the diagonal border. In other words, in every step the position (i,j) needs to maintain i >= j. See the illustration above for n = 5. In every step, it may go one square North (up), or one square East (right), but not both. E.g. if the car is at (3,1), it may go to (3,2) or (4,1).\n\nExplain the correctness of your function, and analyze its time and space complexities.\n\nExample:\n\ninput:  n = 4\n\noutput: 5 # since there are five possibilities:\n          # “EEENNN”, “EENENN”, “ENEENN”, “ENENEN”, “EENNEN”,\n          # where the 'E' character stands for moving one step\n          # East, and the 'N' character stands for moving one step\n          # North (so, for instance, the path sequence “EEENNN”\n          # stands for the following steps that the car took:\n          # East, East, East, North, North, North)\nConstraints:\n\n[time limit] 5000ms\n\n[input] integer n\n\n1 ≤ n ≤ 100\n[output] integer\n"
  },
  {
    "path": "src/pramp/algodaten/Number_Of_Paths/answer.txt",
    "content": "Number of Paths\n\nThe recursive approach\n\nThe simplest way to create this function is to write a recursive function, that calculates the possible paths to each square on the grid, using the squares already calculated. Our output is the paths from (0,0) to (n-1,n-1). Notice the following recursive relation: for every path from (0,0) to (i,j), either: The last step is N, in which case it is generated by a legitimate path to (i,j-1), and then one step north. The last step is E, in which case it is generated by a legitimate path to (i-1,j), and then one step east. For example, take all paths to (4,3). The paths that end with an N, such as “EEENN”, induce paths to (4,2) by removing the last N (“EEEN”). On the other hand, the paths that end with an E, such as “ENENE”, induce paths to (3,3) by removing the last E (“ENEN”).\n\nThis indicates the number of ways to square (i,j) is equal to the number of ways to square (i-1,j) plus the number of ways to (i,j-1). We build the function that uses this recursive relation, to calculate the number of paths. Notice that the function may call the same square multiple times, so we use the memoization technique to reduce the number of calls significantly:\n\nPseudocode:\n\n# input: n - a positive integer representing the grid size.\n# output: number of valid paths from (0,0) to (n-1,n-1).\n\nfunction numOfPathsToDest(n):\n    # allocate a 2D array for memoization\n    memo = [][]\n\n    # the memoization array is initialized with -1\n    # to indicate uncalculated squares.\n    for i from 0 to n-1:\n        for j from 0 to n-1:\n            memo[i][j] = -1\n\n    return numOfPathsToSquare(n-1, n-1, memo)\n\n\n# input:\n#    i, j - a pair of non-negative integer coordinates\n#    memo - a 2D memoization array.\n# output:\n#    number of paths from (0,0) to the square represented in (i,j),\n\nfunction numOfPathsToSquare(i, j, memo):\n    if (i < 0 OR j < 0):\n        return 0\n    else if (i < j):\n        memo[i][j] = 0\n    else if (memo[i][j] != -1):\n        return memo[i][j] \n    else if (i == 0 AND j == 0):\n        memo[i][j] = 1\n    else:\n        memo[i][j] = numOfPathsToSquare(i, j -1, memo) +\n        numOfPathsToSquare(i - 1, j, memo)\n\n    return memo[i][j]\nTime Complexity: first, notice that in order to calculate the number of paths to a specific square, we need all the square south and west to it. This implies that all squares beneath the diagonal are calculated. In addition, almost every square value is used twice - for the square north to it and east to it (except for the border squares, which are used once). This means that our time complexity is O(n^2), since the recursive function is called once or twice for about half of the squares, and each call takes O(1) time.\n\nSpace Complexity: the memoization requires the space complexity to be also O(n^2), since we save values for all squares.\n\nThe iterative approach\n\nThe space complexity can be improved to O(n) if we choose an iterative solution, which uses the same recursive relation. Notice that for calculating the paths for square (i,j) we only need squares (i-1,j) and (i,j-1). Thus, by calculating the number of paths row by row from south to north, and west to east in the rows, the function needs to save only the last two rows. This may be implemented as follows:\n\nPseudocode:\n\n# input: n - a positive integer representing the grid size.\n# output: number of valid paths from (0,0) to (n-1,n-1).\n\nfunction numOfPathsToDest(n):\n    if (n == 1):\n        return 1\n\n    lastRow = []\n    for i from 1 to n-1:\n        lastRow[i] = 1 # base case - the first row is all ones\n\n    currentRow = []\n\n    for j from 1 to n-1:\n        for i from j to n-1:\n            if (i == j):\n                currentRow[i] = lastRow[i]\n            else:\n                currentRow[i] = currentRow[i-1] + lastRow[i]\n        lastRow = currentRow\n\n    return currentRow[n-1]\nTime Complexity: as we see, the function still calculates every square south-east to the diagonal, leaving the time complexity to be O(n^2),\n\nSpace Complexity: the space complexity is reduced to O(n) since we are memoizing only the last two rows.\n\nCombinatorial Remark (optional read): There is a closed formula that answers this question, called the Catalan Number Formula. This formula is based on the fact that every path from (0,0) to (n-1,n-1) is parallel to a sequence of n-1 pairs of parentheses which are correctly matched: Take a path sequence of N’s and E’s. since the car begins at (0,0) and ends at (n-1,n-1), it needs to go exactly n-1 times East, and n-1 times North. Put differently, all sequences consist of n-1 E’s and n-1 N’s. Just like every balanced parenthesis string has the same number of “(“ and “)” signs. Furthermore, in every pair (i,j), the first coordinate is the number of times the car went east so far, and the second coordinate is the number of times the car went north. This indicates that the diagonal restriction means the number of E’s, in every prefix of the string is equal or greater than the number of N’s. Just as in every balanced parenthesis string, the number of “(“ is is equal or greater than the number of “)”. The number of the balanced parenthesis strings of n-1 pairs, is given by the Catalan Number Formula: . The proof for its correctness is beyond our scope, but is located in the Catalan Number Wikipedia page.\n\nNote that although this formula is mathematically closed, calculating the Binomial Coefficient , is done in O(n) runtime complexity, so calculating the number directly doesn’t improve the asymptotic runtime complexity. But direct calculation spares the need for saving previous values, so the space complexity may be reduced to O(1) this way.\n"
  },
  {
    "path": "src/pramp/algodaten/Number_Of_Paths/hints.txt",
    "content": "Number of Paths\n\nWhile this question may seem hard to comprehend at first sight, it is easily solved in the “divide and conquer” recursive method.\nEncourage your peer to implement first any solution, even if it is not optimal. Once done, ask them to optimize it.\nIf your peer doesn’t have any intuition to the question, guide them towards answering a more general question - given (i,j), calculate all possible ways to travel from (0,0) to (i,j). Also, suggest your peer to draw a grid and try to calculate it manually for a few squares.\nAnother good hint is to direct to first think about the obvious base cases, e.g. if the square (i,j) is on the other side of the border or if it is out of the grid (0 ways).\nIf your peer still doesn’t have a clue, explain the recursive relation provided in the solution.\nYour peer should get a full score only if the function achieves O(n^2) time complexity, and O(n) space complexity (or better), and doing so without any hints.\nObviously, we do not expect your peer to be familiar with the combinatorial solution, or discover it by themselves. Moreover, it’s OK if your peer discovers the combinatorial approach for this question, but since this is a coding interview, if your peer is familiar with it beforehand, encourage them to find another recursive solution to the question.\n"
  },
  {
    "path": "src/pramp/algodaten/Number_Of_Paths/question.txt",
    "content": " You’re testing a new driverless car that is located at the Southwest (bottom-left) corner of an n×n grid. The car is supposed to get to the opposite, Northeast (top-right), corner of the grid. Given n, the size of the grid’s axes, write a function numOfPathsToDest that returns the number of the possible paths the driverless car can take.\n\nalt the car may move only in the white squares\n\nFor convenience, let’s represent every square in the grid as a pair (i,j). The first coordinate in the pair denotes the east-to-west axis, and the second coordinate denotes the south-to-north axis. The initial state of the car is (0,0), and the destination is (n-1,n-1).\n\nThe car must abide by the following two rules: it cannot cross the diagonal border. In other words, in every step the position (i,j) needs to maintain i >= j. See the illustration above for n = 5. In every step, it may go one square North (up), or one square East (right), but not both. E.g. if the car is at (3,1), it may go to (3,2) or (4,1).\n\nExplain the correctness of your function, and analyze its time and space complexities.\n\nExample:\n\ninput:  n = 4\n\noutput: 5 # since there are five possibilities:\n          # “EEENNN”, “EENENN”, “ENEENN”, “ENENEN”, “EENNEN”,\n          # where the 'E' character stands for moving one step\n          # East, and the 'N' character stands for moving one step\n          # North (so, for instance, the path sequence “EEENNN”\n          # stands for the following steps that the car took:\n          # East, East, East, North, North, North)\nConstraints:\n\n[time limit] 5000ms\n\n[input] integer n\n\n1 ≤ n ≤ 100\n[output] integer\n"
  },
  {
    "path": "src/pramp/algodaten/Root of Number/ans.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n\nvoid root(double x, unsigned int n, double *out)\n{\n  \n}\n\nint main() {\n  return 0;\n}\n"
  },
  {
    "path": "src/pramp/algodaten/Root of Number/ans.java",
    "content": "import java.io.*;\nimport java.util.*;\n\nclass Solution {\n\n  static double root(double x, int n) {\n    \n   double output=1;\n    \n    while(Math.pow(output, n) < x ) {\n      output++;\n    }\n    \n    if(Math.pow(output, n) == x) {\n      return output;\n    }\n    \n    double start = output-1;\n    \n    double result = 1;\n    \n    for(double i=start; i < output; i += 0.01) {\n      result = Math.pow(i, n);\n      \n      if(result == x) {\n        output = i;\n        break;\n      }\n      if(result > x) {\n        output = i-0.01;\n        break;\n      }\n    }\n    return output;\n  }\n\n  public static void main(String[] args) {\n\n  }\n\n}\n\n// https://github.com/esthicodes\n"
  },
  {
    "path": "src/pramp/algodaten/Root of Number/answer.txt",
    "content": "Root of Number\n\nThe solution presented here is much like a binary search in a sorted array.\n\nPseudocode:\n\nfunction root(x, n):\n    if (x == 0):\n        return 0\n\n    lowerBound = 0\n    upperBound = max(1, x)\n    approxRoot = (upperBound + lowerBound) / 2\n\n    while (approxRoot - lowerBound >= 0.001):\n        if (power(approxRoot, n) > x):\n            upperBound = approxRoot\n        else if (power(approxRoot, n) < x):\n            lowerBound = approxRoot\n        else\n            break\n\n        approxRoot = (upperBound + lowerBound) / 2\n\n    return approxRoot\nAs we can see, the function finds an initial lower and upper bound for the answer, and sets the initial guess for the answer to be the average. Then the iteration begins, and the we notice that the following facts are true in every step of the iteration:\n\n(approxRoot - lowerBound) = ½(upperBound - lowerBound) - Since approxRoot is always the average value between upperBound and lowerBound.\nAt the end of every iteration, the real root always satisfies the inequality lowerBound < root < upperBound: this is true since in the beginning of the iteration, we check if approxRoot to the power of n is greater than or lesser than x. The power function is monotonically increasing (i.e. a < b dictates that a^n < b^n) meaning this indicates whether the approximation is too high or too low.\nThe value of (upperBound - lowerBound) is cut by half in every iteration - since in every step we replace one of the values of upperBound or lowerBound by their current average. Obviously it means that eventually the distance between the bounds is lower than 0.001. Since the real root is between the bounds, this promises the algorithm stops.\nThus, since lowerBound< root < upperBound, then the true error - |root-approxRoot|, satisfies |root-approxRoot| < (approxRoot - lowerBound) - so it is indeed enough to check when the value on the right side is lower than 0.001.\nThus the algorithm always stops, and output of the algorithm is correct.\n\nThe best way to explain the solution algorithm is by using it on an example. Let’s try calculating the 3rd root of 7: We mark the real root as y ≅ 1.912931182772389. Our method shall iterate in a main loop, and try to produce a sequence of approximations that converge to y, until reaching a number that is close enough.\n\nIteration 1: Initially, we recognized that 0 < y, since 03 = 0 < 7. Also y < 7. Thus lowerBound = 0 and upperBound = 7. Our first member of the sequence is chosen to be the average between 0 and 7 - approxRoot = 3.5. Since 3.53 ≅ 42.8 > y, then we conclude that 0 < y < 3.5, so we conclude upperBound = 3.5. Note that the error is bounded: |y - approxRoot| < |3.5 - 0| = 3.5.\n\nIteration 2: Since we concluded that 0 < y < 3.5, our second member of the sequence should be, again, the average between our bounds 0 and 3.5 - approxRoot= 1.75. This time 1.753 ≅ 5.3 < 7, which means 1.75 < y < 3.5, so we update lowerBound = 1.75. The error is bounded by: |y - approxRoot| < |upperBound - lowerBound|= |3.5- 1.75| = 1.75. We continue the sequence this way, and notice that the error bound is reduced by half by every iteration. Here is a summary of the first few iterations in this method:\n\n# Iteration\tLowerBound\tUpperBound\tapproxRoot value\t|y- approxRoot| - True Error\tError bound\n1\t0\t7\t3.5\t≅ 1.58\t< 3.5 (7×2-1)\n2\t0\t3.5\t1.75\t≅0.16\t< 1.75 (7×2-2)\n3\t1.75\t3.5\t2.625\t≅0.71\t< 0.875 (7×2-3)\n4\t1.75\t2.625\t2.1875\t≅0.27\t< 0.4375 (7×2-4)\nAs we can see, by choosing the average value between By the 13th iteration, we’ll reach an error bound of 7×2^(-13), which is less than 0.001 (notice that the error may be much smaller, but since we don’t actually know the real value of y in the process of computation, we cannot promise a better bound).\n\nTime Complexity: notice that every loop iteration is done in O(1), under the assumption that the power function takes a constant time. The initial error is x, and the error is multiplied by 0.5 in every iteration. Thus the number of iterations is the minimal k such that: 2^(-k) x<0.001 i.e. 2^(-k)<(0.001 / x) k >log(x) + 3log(10) = O(log(x)) The number of iterations is therefore O(log(x)), meaning the total runtime is O(log(x)) if we refer to the value stored in x, or O(x) if we refer to the number of bits required to represent x (since it takes Log(x) in average bits to represent a number x).\n\nSpace Complexity: O(1), since we only need a constant number of variables for the algorithm.\n\nMathematical Note: our explanation used the fact that power function x^n is a monotonically increasing continuous function on the positive numbers. Although it is true, the Intermediate value theorem in calculus, states that this method will work for every continuous function - but the proof for this requires more mathematical tools.\n"
  },
  {
    "path": "src/pramp/algodaten/Root of Number/hints.txt",
    "content": "If your peer doesn’t know how to tackle this question, advise them to try it first on concrete examples. Encourage them to make an intelligent guess, and then bound the error.\nIf you peer is still stuck, ask them how they can use binary search to solve the problem.\nAlso, it is recommended for your peer to look at the graph of the function xn. And while the function may not use any kind of built-in power function, it is OK for your peer to use such functions in the programming and debugging process.\nYour peer should receive full score for this question only if they manage to find a method that is at least as efficient as the method below, along with explaining how it is correct and analyzing its time and space complexities.\n"
  },
  {
    "path": "src/pramp/algodaten/Root of Number/question.txt",
    "content": "Root of Number\n\nMany times, we need to re-implement basic functions without using any standard library functions already implemented. For example, when designing a chip that requires very little memory space.\n\nIn this question we’ll implement a function root that calculates the n’th root of a number. The function takes a nonnegative number x and a positive integer n, and returns the positive n’th root of x within an error of 0.001 (i.e. suppose the real root is y, then the error is: |y-root(x,n)| and must satisfy |y-root(x,n)| < 0.001).\n\nDon’t be intimidated by the question. While there are many algorithms to calculate roots that require prior knowledge in numerical analysis (some of them are mentioned here), there is also an elementary method which doesn’t require more than guessing-and-checking. Try to think more in terms of the latter.\n\nMake sure your algorithm is efficient, and analyze its time and space complexities.\n\nExamples:\n\ninput:  x = 7, n = 3\noutput: 1.913\n\ninput:  x = 9, n = 2\noutput: 3\nConstraints:\n\n[time limit] 5000ms\n\n[input] float x\n\n0 ≤ x\n[input] integer n\n\n0 < n\n[output] float\n"
  },
  {
    "path": "src/pramp/algodaten/Root_of_Number/hints.txt",
    "content": "Root of Number\n\nIf your peer doesn’t know how to tackle this question, advise them to try it first on concrete examples. Encourage them to make an intelligent guess, and then bound the error.\nIf you peer is still stuck, ask them how they can use binary search to solve the problem.\nAlso, it is recommended for your peer to look at the graph of the function xn. And while the function may not use any kind of built-in power function, it is OK for your peer to use such functions in the programming and debugging process.\nYour peer should receive full score for this question only if they manage to find a method that is at least as efficient as the method below, along with explaining how it is correct and analyzing its time and space complexities.\n"
  },
  {
    "path": "src/pramp/algodaten/Root_of_Number/problem.txt",
    "content": "Root of Number\n\nMany times, we need to re-implement basic functions without using any standard library functions already implemented. For example, when designing a chip that requires very little memory space.\n\nIn this question we’ll implement a function root that calculates the n’th root of a number. The function takes a nonnegative number x and a positive integer n, and returns the positive n’th root of x within an error of 0.001 (i.e. suppose the real root is y, then the error is: |y-root(x,n)| and must satisfy |y-root(x,n)| < 0.001).\n\nDon’t be intimidated by the question. While there are many algorithms to calculate roots that require prior knowledge in numerical analysis (some of them are mentioned here), there is also an elementary method which doesn’t require more than guessing-and-checking. Try to think more in terms of the latter.\n\nMake sure your algorithm is efficient, and analyze its time and space complexities.\n\nExamples:\n\ninput:  x = 7, n = 3\noutput: 1.913\n\ninput:  x = 9, n = 2\noutput: 3\nConstraints:\n\n[time limit] 5000ms\n\n[input] float x\n\n0 ≤ x\n[input] integer n\n\n0 < n\n[output] float\n"
  },
  {
    "path": "src/pramp/algodaten/Root_of_Number/pseudocode.py",
    "content": "function root(x, n):\n    if (x == 0):\n        return 0\n\n    lowerBound = 0\n    upperBound = max(1, x)\n    approxRoot = (upperBound + lowerBound) / 2\n\n    while (approxRoot - lowerBound >= 0.001):\n        if (power(approxRoot, n) > x):\n            upperBound = approxRoot\n        else if (power(approxRoot, n) < x):\n            lowerBound = approxRoot\n        else\n            break\n\n        approxRoot = (upperBound + lowerBound) / 2\n\n    return approxRoot\n  \n  /*As we can see, the function finds an initial lower and upper bound for the answer, and sets the initial guess for the answer to be the average. Then the iteration begins, and the we notice that the following facts are true in every step of the iteration:\n\n(approxRoot - lowerBound) = ½(upperBound - lowerBound) - Since approxRoot is always the average value between upperBound and lowerBound.\nAt the end of every iteration, the real root always satisfies the inequality lowerBound < root < upperBound: this is true since in the beginning of the iteration, we check if approxRoot to the power of n is greater than or lesser than x. The power function is monotonically increasing (i.e. a < b dictates that a^n < b^n) meaning this indicates whether the approximation is too high or too low.\nThe value of (upperBound - lowerBound) is cut by half in every iteration - since in every step we replace one of the values of upperBound or lowerBound by their current average. Obviously it means that eventually the distance between the bounds is lower than 0.001. Since the real root is between the bounds, this promises the algorithm stops.\nThus, since lowerBound< root < upperBound, then the true error - |root-approxRoot|, satisfies |root-approxRoot| < (approxRoot - lowerBound) - so it is indeed enough to check when the value on the right side is lower than 0.001.\nThus the algorithm always stops, and output of the algorithm is correct.\n\nThe best way to explain the solution algorithm is by using it on an example. Let’s try calculating the 3rd root of 7: We mark the real root as y ≅ 1.912931182772389. Our method shall iterate in a main loop, and try to produce a sequence of approximations that converge to y, until reaching a number that is close enough.\n\nIteration 1: Initially, we recognized that 0 < y, since 03 = 0 < 7. Also y < 7. Thus lowerBound = 0 and upperBound = 7. Our first member of the sequence is chosen to be the average between 0 and 7 - approxRoot = 3.5. Since 3.53 ≅ 42.8 > y, then we conclude that 0 < y < 3.5, so we conclude upperBound = 3.5. Note that the error is bounded: |y - approxRoot| < |3.5 - 0| = 3.5.\n\nIteration 2: Since we concluded that 0 < y < 3.5, our second member of the sequence should be, again, the average between our bounds 0 and 3.5 - approxRoot= 1.75. This time 1.753 ≅ 5.3 < 7, which means 1.75 < y < 3.5, so we update lowerBound = 1.75. The error is bounded by: |y - approxRoot| < |upperBound - lowerBound|= |3.5- 1.75| = 1.75. We continue the sequence this way, and notice that the error bound is reduced by half by every iteration. Here is a summary of the first few iterations in this method:\n\n# Iteration\tLowerBound\tUpperBound\tapproxRoot value\t|y- approxRoot| - True Error\tError bound\n1\t0\t7\t3.5\t≅ 1.58\t< 3.5 (7×2-1)\n2\t0\t3.5\t1.75\t≅0.16\t< 1.75 (7×2-2)\n3\t1.75\t3.5\t2.625\t≅0.71\t< 0.875 (7×2-3)\n4\t1.75\t2.625\t2.1875\t≅0.27\t< 0.4375 (7×2-4)\nAs we can see, by choosing the average value between By the 13th iteration, we’ll reach an error bound of 7×2^(-13), which is less than 0.001 (notice that the error may be much smaller, but since we don’t actually know the real value of y in the process of computation, we cannot promise a better bound).\n\nTime Complexity: notice that every loop iteration is done in O(1), under the assumption that the power function takes a constant time. The initial error is x, and the error is multiplied by 0.5 in every iteration. Thus the number of iterations is the minimal k such that: 2^(-k) x<0.001 i.e. 2^(-k)<(0.001 / x) k >log(x) + 3log(10) = O(log(x)) The number of iterations is therefore O(log(x)), meaning the total runtime is O(log(x)) if we refer to the value stored in x, or O(x) if we refer to the number of bits required to represent x (since it takes Log(x) in average bits to represent a number x).\n\nSpace Complexity: O(1), since we only need a constant number of variables for the algorithm.\n\nMathematical Note: our explanation used the fact that power function x^n is a monotonically increasing continuous function on the positive numbers. Although it is true, the Intermediate value theorem in calculus, states that this method will work for every continuous function - but the proof for this requires more mathematical tools.*/\n"
  },
  {
    "path": "src/pramp/algodaten/pairs_with_specific_difference/answer.py",
    "content": "def find_pairs_with_given_difference(arr, k):\n  arr_set = set(arr) \n  ans = []\n  for i in arr:\n    if k + i in arr_set:\n      ans.append([k+i, i])\n  return ans\n  \narr = [0, -1, -2, 2, 1]\nk = 1\nprint(find_pairs_with_given_difference(arr, k))\n"
  },
  {
    "path": "src/read-Swiss-German.py",
    "content": "# mer definiere diese funktionen heisst load_words(): das könnte input gsi\ndef load_words():\n    with open('words_alpha.txt') as word_file:\n        #text swiss german annotation analysis\n        valid_words = set(word_file.read().split())\n\n    return valid_words\n\n\nif __name__ == '__main__':\n    #wenn man die code laufen la, wurede diesse funktionen ausgeführt worde. \n    # hier geht das los und startet d' programm.\n    swissgerman_words = load_words()\n    # demo print\n    # fate sueche in swissgerman_words(DB)\n    print('fate' in swissgerman_words)\n"
  },
  {
    "path": "src/srf/comedy/renatoKaiser.txt",
    "content": " \n0:38\nwer sollten ich powere mich einmal am Tag aus indem\n0:46\nich auf Youtube ein Yogalehrer April\n0:51\nund auch eine ruhige und entspannt ja dass man einfach nur ausprobieren\n0:57\nganz einfach iPhone auf Youtube so bis Igel wir Yoga ganzkörper Flow und dann\n1:04\nfinden Sie in der 320-jährige Betriebswirtschaft Studentin wo im Leben\n1:19\nda gonja Grenze was darf Satire oder gerade vor so einer linksversiften\n1:31\ner will immer in die Meister Link gemacht\n1:41\nund alle anderen wären corona-kunde gut in der Regel\n2:05\nim Einklang mit der Natur mit dem Körper mit den Seelen mit dem Universum\n2:11\nwarum\n2:18\nt [Musik]\n2:29\nwie groß ist vertraue Kraft für die Gedanken wirklich wenn sogar schwerkraftsfest weh tut dann fühl ich\n2:38\naber ich weiß der harte Worte von der Realität ist für alle darum glaube ich habe Yoga schnurren Sport für juppis und\n2:46\nfür Snaps für Richi Welt Arbeiterklasse hat kein Parkett\n3:02\naber mit dem würde ich mich nicht zu der Arbeiterklasse\n3:26\nmögliche Positionen dermaßen\n3:32\nnicht spontan in den hysterische lachhüllekrampf ausbrechen wenn auf\n3:38\nYoutube irgend so eine Jessica aus Berlin Brandenburg fahren eine Baggersee\n3:44\nim schniderspraktikantinnenversion von\n3:49\nDalai Lama\n3:57\nschenk dir diesen Moment\n4:07\nschenk dir diesen Moment tut mir leid Jessica\n4:14\nwenn du so Sachen sagst den kann ich mich nicht konzentrieren\n4:21\ndann wird jedes Jahr zum Lachen und bitte verstehen\n4:42\neinen Moment schenkt oder den stelle ich mir natürlich sehr viel Fragen\n4:49\ndie große Frage vom Leben und die drei große Frage sozusagen\n5:00\nMensch eigentlich einzigartig dann Antwort ist einfach\n5:08\nfleischvogel\n5:13\nich muss das vielleicht kurz erklären dann wurde ich einfach sprach also\n5:19\nMenschen zu überlegene Wässer und ich weiß dass den komisch aus dem Müll vom\n5:26\naber trotzdem jede Sprache macht uns Menschen zu überlegen was er will durch Evolution oder oder durch durchsprochen\n5:32\ndurch Kommunikation und Organisation immer so geschafft alle andere Tiere auf\n5:37\nder Welt wo größer stärker und schneller sind das mir überlisten und unterwerfen mir in so zeige Krone das macht es aber\n5:46\nnoch nicht einzigartig dass mir kein Handy macht einzigartig dass mir so schlecht die Gewinner sind will\n5:55\nmüssen komplett über ergibt sich Moment immer übertrieben wenn es lange nicht\n6:02\ndass man alle andere Tiere auf der Welt unterworfen und ruft gestern nein was\n6:08\nmache mir mir züchtet sie nach und machen\n6:18\nwie beleidigend kann man gegenüber Sinne Mitwesen sie als indem man fürchte sind\n6:25\nvom absurdesten überhaupt immer so nach halbespot Wurst in freier Natur\n6:34\nalso wenn ein Löwe wird in freier Wildbahn und weshalb treffen denn würde\n6:41\ndas Töten und esse Witze gemeint\n6:47\nwenn ein Mensch Ufer den tötet\n7:20\nbeste Zeichen für Einzigartigkeit von Mensch das beste Zeichen ist\n7:26\nder fleischvogel Deutschland zeigt man ja Rindsroulade\n7:31\naber der Typ Schweizer Begriff fleischvogel\n7:37\nich so viel besser was ist ein fleischvogel man nehme es Rinds Plätzli\n7:43\nHals breit und Hinterschinken also drei verschiedene dir\n7:50\ne noch der Name vom nettia\n7:58\nVogel und dazu Fleisch\n8:04\ndamit sie wirklich vegan\n8:12\nwenn man im Vergleich Vogel ist so einen ganz normaler Vogel fast schon vegan\n8:21\naber das lange dies Menschen\n8:38\nein Vogel zu spät sie wird Bremer Stadtmusikanten\n8:59\nich mache Sex\n9:08\nmachen würde loswerden\n9:13\nist\n9:22\nwenn man gerade im Thema sind da ist doch mal übers Wort Sextäter\n9:33\ndas ist scheiße\n9:46\nsind Zitat sechs Täter auf der Flucht deutscher sextäterhauptverdächtiger\n9:52\nPolizei Aargau sucht Sextäter Mario\n10:00\nwie so eine degenerierten Nintendo Spiele Super Mario 6 hat auf 64\n10:08\nund warum tönt das so komisch wenn es Wort falsch ist das heißt nicht\n10:16\nMario das heißt Steven\n10:24\ndas Wort wirklich\n10:34\nwas macht das mit mir was macht das aus mir weil ich mein ich Bier auch\n10:41\nin Sex Täter also ich tue Sex \n10:52\nalso ich säge mami stolz\n11:00\nstolz und ich meine besonders\n11:15\ndet noch gar nicht so viel wahrscheinlich kein\n11:21\nSerie Täter \naber ja Sextäter oder auch Sex grüßen\n11:29\ndie schaust du das Wort aus dem Blick\n11:37\nSex Grüssen, okay\n11:47\naber lange ich würklich.\n11:56\nein Christel ja früher in die Schuel, meine Lehrerin gesagt\n12:20 \nWas ufem Body ghört mir. \n12:57 \nSchuldigung\n13:06\ngseigt klassische\n13:16 \nWelt\n13:26\nVerschwörungstheorie ja ich hoffe dass es Verhalten und hygien Verständnis von\n13:31\neiner Impfgegner\n13:44\nund jetzt lahme ich dir Magerine vor der Türschwellen abschlecken\n13:50\nes ist überlebe ich die Masse nicht nein ich weiß natürlich Hygiene ist wichtig für Immunsystem gerade auch im\n13:57\nMesse darum glaube ich aber nicht das Corona ausbrachen ist gestern hat ich\n14:02\nglaube corona-schuss gestern\n14:17\nvom Wort Herr nimmt anders als in Brüssel offen Gebiet sechs sechs und wir\n14:23\nsind doch Ali es bizli Grüße\n14:35\n[Musik] Fifty Shades of christm\n14:42\na etwas Problem immer noch ist Wort Sex so\n14:49\nverrückt so moralisch falsch das sind Journalist wenn es einfach nur Vergewaltigung Gott findet das landet\n14:54\nwenn er schreibt oh ein Sextape da hat Sex getätigt das ist ein Fall für die\n15:00\nsechs Polizei und glaub mir ich bin überhaupt nicht erwachsen wenn es darum\n15:05\ngeht ganz im Gegenteil ich sage zum Beispiel mega gern das Wort\n15:29\nmacht auf Instagram\n15:44\nwahrscheinlich gemeint ist 600 oder was wirklich irgendwie Empfang\n15:51\nsuchen\n16:00\nAngst wurde ihres Schlafzimmern\n16:12\nund dieser und warum\n16:20\nlustige Geschichte\n16:28\nwissen Sie ich bin Satiriker und sie so\n16:36\nsind sie nicht der Kaiser sind doch das Salzburger Stier\n16:42\nja voll also\n16:49\nmit so süß\n16:57\noder mir alle hinter mir mit deiner Wörter mit den Sex Wörter fahren mit den sechs werben mit der Sex tunwörter\n17:05\nsozusagen\n17:26\nLiebe machen\n17:32\nLiebe machen also du hast doch gerade einiges vor Knorr\n17:41\nwir machen Liebe mir produzieren möchte Liebe\n17:50\nstärkste Gefühl von der Welt diese Verbundenheit Seele verwandtschaftliche\n18:07\n[Musik]\n18:20\nich habe keine Angst schlimm oder\n18:26\nSex machen gemeinsamer komplizit\n18:35\naber nenne den Vergewaltigung\n18:40\nVergewaltigung ich mir Sex Vergewaltigung Vergewaltigung ist schon Vergewaltigung\n18:50\nohne zu verharmlosen [Applaus]\n18:59\n[Musik]\n19:20\nwir haben hier so als Hobby er macht im Haupt der Welt\n19:26\ndurch dich so gut du merkst\n19:33\ndu Depp sucht dich so gern der Besuch dich sogar wenn du nicht\n19:42\nund wie oft hämisch wünscht\n19:56\nfreiwillige Sterbehelfer\n20:02\nhey wenn Mord ist egal Vergewaltigung ich illegal Sex ich nicht\n20:11\nillegal aber den nicht [Applaus]\n20:28\nmich jetzt auch nicht so fest dass mir es unentspannt Verhältnis zum Thema Sex\n20:34\nhin dass du nur schon weggesprochen weil mehrere Wort für\n20:41\nOrgasmus also nicht Orgasmus also grundsätzlich\n20:53\nDrogen nein danke Orgasmus jetzt please aber\n20:59\norgasmusischer wissenschaftliche begriffen\n21:31\nzeige mal Liebe machen und am große Höhepunkt [Musik]\n21:38\nt\n21:55\nund bescheuert und du\n22:07\nmich mit [Applaus]\n22:20\nkein enthaltige das Maul\n22:27\nich meine zwischen Orgasmus\n22:37\nder kleine Tod\n22:43\npoetisch dramatisch französisch\n22:48\naber mir in der Sicherheit\n23:01\nnehmen\n23:46\n[Applaus]\n23:53\nso viel über das Thema tut nothingt muss ganz ehrlich sagen\n23:58\nrelativ jung ich ernähre mich relativ gesund und gefährlichste\n24:07\nich mich einfach nur den\n24:14\nund vergesse dass ihr am Klickpedal leicht gemacht\n24:19\nbin\n24:25\nPedal fixiert damit du deine ganze Kraft hast du dir mega professionell\n24:35\nbis zu dem Moment wo es Glück Pedal vergessen\n24:58\nsie stillig ja und damit meine ich nicht\n25:05\nauf ihren Alter wer wirklich\n25:19\ngemacht ich halte mich nur dran\n25:25\nreden wir noch fahren ist entscheidend\n25:51\nfarbige Spitze zu eng vakuumierter\n25:57\nund ja das wissen wir schon nachher aber das ist nicht das wo man während dem\n26:03\nReden unendliche Freiheit in der Endlichkeit\n26:11\nvom Velo dress und das fühlt sich aber so geiler und in\n26:19\nmeinem Raum\n26:24\nich muss ganz ehrlich sagen ich habe mich noch gespürt wie wenn ich so oben\n26:30\nohne im innere knallrotes Hause mit zur Schulterträger bin ein sehr unmuskulöser\n26:37\nWrestler warum Spiegel gestorben finde\n27:29\nwurde wie ein gigantische Oberschenkel\n27:34\nund wenn deine Mutter am Straßenrand ihres Kindern\n27:40\nseitdem sie immer irgendwen wenn groß bist du immer nein\n27:53\nund Zeit zu dem Kind jetzt muss Schluss\n28:02\ndas wird lustig wenn sie weiß wie so das Krieg Bedarf funktioniert wie gesagt zu mir\n28:09\noffensichtlich will ich fahren nichts ahnend da die einen plane wird immer langsamer langsamer langsam und den\n28:18\npassiert also es passiert der Welt es macht wirklich\n28:30\nund den Krippe ich so ganz langsam um\n28:41\nund der Person\n28:47\nmachen\n29:03\nund süße dass du nötige kaschmache das war schon philosophisch das macht\n29:10\ndich demütig das heißt du ergischst dich zu dem Schicksal und gibst so ganz\n29:17\nlangsam um so zu dem Musik vor Enya\n29:22\ngucken [Musik]\n29:34\n[Musik] alles und dumme wird unwichtig\n29:42\ndu spürst\n29:47\nkonzentrierst dich auf und schenkst dort der Moment\n30:09\nich mach neuerdings einfach cool\n30:20\nder Youtube Yogalehrerin oxited schenk dir diesen Moment und hier\n30:29\nhaben wir wirklich viel Moment geschenkt da haben wir viel Gedanken gemacht viel Fragen stellt und dir fragen Sie was\n30:36\nsoll das denn überhaupt heiße schenk dir diesen Moment was ist das überhaupt für\n30:41\ndas Geschenk ein Moment schenken\n30:48\ndas wünsche ich dir deine schlimmste finden\n30:59\nMoment wo man sich selber schenkt das beste überhaupt nicht sitzen oder so mit\n31:05\nsich alleine\n31:13\ndie Geburt von meiner ersten Tochter Sekte schönste Moment vom See aber jetzt\n31:19\nund nicht da mit mir alleine\n31:30\nmomentan nur\n31:40\nein Moment und was kommt noch genau\n31:46\ndu willst einen Moment und nochmal eine und normalerweise und normalen und was\n31:51\npassiert richtig du wirst süchtig nach Moment und perfide da ist wenn du dir die\n31:59\nMoment selber schenkst bist du der Konsument unter Dealer Klick\n32:05\nund sie schauen nur gratis du wirst zum Perpetuum Mobile\n32:33\nMittagspause Vaterschaftsurlaub Kurzzeit Yoga schadet\n32:40\nder Wirtschaft ja will wenn sie und Schnuffel schon\n32:49\nganz ehrlich so ein Geschenk der Moment ist nun dann das als die Sticks Droge\n32:55\nist früher Pension ja\n33:01\nund mir ist das passiert ja das Yoga Spiele direkt\n33:08\nund ja stört\n33:14\ndu ich schenk mir nur noch Moment\n33:22\nzum Beispiel ist ein einziger verschenkte Moment und\n33:29\nich nur Gabe\n33:37\nfür den Schweizer du willst ganz kurz mit alles sieht zum Türchen Moment\n33:48\nsitze und Schnuffel ist meine Stärke\n33:53\nich bin nicht der Denker ich bin der Sitzer der Atmung das Monument des\n34:01\nMoments die Statue des Status\n34:11\nund ihr Frau geht da jetzt vielleicht aber Moment\n34:17\nder sitzt ja gar nicht und\n34:23\nwenn man\n34:31\nzum die frohe Botschaft verkünden und ja ihr Hände\n34:38\nda aber ihr\n34:44\nihr sitzt und schnuffed und wenn er für das Schuh\n \n"
  },
  {
    "path": "src/srf/dok/Kampf gegen die Suchttxt",
    "content": "\nKampf gegen die Sucht – Drogensucht, Spielsucht, Sportsuch\n\n* Sanfte schwermütige Klänge * Reto nimmt seit seinem 16. Lebensjahr Drogen.\n0:07\nSeit Jahren will er davon loskommen. Einfach immer im Hinterkopf, wenn ich heimkomme, etwas reinzupfeifen.\n0:16\nSamira hat viele Fitnesswettkämpfe gewonnen. Der Erfolg hat aber seinen Preis: Sie hat eine Fitnesssucht,\n0:23\nschwere Essstörungen und ist unzufrieden mit sich selber. Zu dick. \nIch weiss, ich kann anders ussehen. Drum gefällt es mir nicht.\n\n0:33\nCahit verspielt seit Jahren sein ganzes Geld. Verloren.\n0:38\nEr hat mit Schulden zu kämpfen und ist allein. \nSie alle wollen eine Veränderung.\n0:44\nWeg von der Sucht, rein in ein neues Läbä.\n0:51\n* Einzelne eindringliche Streicherklänge * Hier in diesem Block wohnt Reto.\n0:58\nEin Bier am Morgen ist nicht sein grösstes Problem. Sondern Heroin, Kokain oder Benzodiazepin.\n1:05\nEs gibt kaum eine Droge, die er nicht schon genommen hat. \nSeit 25 Jahren habe ich Drogenprobleme.\n1:11\nWährend der ersten zehn Jahre wollte ich gar nichts ändern. Natürlich möchte ich heute etwas ändern, aber wenn du ...\n1:18\n... von deinem Leben ... Ich bin jetzt 41. \nVon meinem Leben ...\n1:25\nMit 16 habe ich angefangen zu spritzen, hatte vorher schon mit Drogen zu tun.\n1:31\nEs ist wahnsinnig, das Leben einfach zu ändern. Oder aber ich weiss nicht, wie es richtig geht.\n1:39\nSeit seinem letzten Entzug vor einigen Monaten nimmt Reto keine harten Drogen mehr.\n1:45\nAls gelernter Metallbauer sucht er einen Job. Er möchte eine Struktur in seinem Leben\n1:50\nund nicht immer alleine zu Hause sein. \nAber mit seiner Vergangenheit ist das schwierig.\n\n1:56\nWas soll ich denn machen, wenn ich nur Absagen bekomme und ...\n\n2:01\nBei jeder Absage, die du bekommst, bist du auch irgendwie ... ... wirst du auch irgendwie ...\n\n2:09\n... demotiviert. Du fragst dich: \"Wozu bewirbst du dich überhaupt?\"\n\n2:14\nUnd dann ... (Seufzend) Ja ...\n2:19\n* Einzelne Streicherklänge *\n2:26\nOhne Arbeit und Tagesstruktur ver- bringt Reto fast jeden Tag alleine.\n2:31\nUnd mit jedem Tag, der verstreicht, merkt er, wie das Verlangen grösser wird, wieder Drogen zu konsumieren.\n2:38\nSo. Es kommt wie eine Welle.\n2:45\nEs baut sich auf, bis ein riesiger Druck da ist.\n2:50\nWas könnte diesen Druck lösen? Das weiss ich auch nicht.\n2:56\nSonst würde ich es machen. Ich habe schon viel probiert.\n3:04\nRegelmässig geht Reto in der Klinik Selhofen in Burgdorf in Therapie.\n3:09\nEin Weg, den er gut kennt. (Lachend) Mein zweites Zuhause. Nein.\n3:20\nDu warst auch schon hier? Und nicht nur zur Therapie. Hier? Zehnmal war ich stationär hier.\n3:28\nUnd Reto spürt, dass er bald wieder abstürzen könnte.\n3:35\nWelche Gedanken haben Sie sich gemacht? Ob ich nochmals irgendwie drei oder vier Wochen hierher kommen soll.\n3:43\nOkay, erneut über das Stationäre, worüber wir ... - Ja. ... auch schon gesprochen haben. Ja.\n3:50\nAber es fehlt irgendwie noch der letzte Dings, der letzte ...\n3:55\nIch bin noch nicht 100 ... Ich mache mir Gedanken darüber, habe mich aber noch nicht entschieden.\n4:01\nWas wäre denn der Nutzen? Was soll ein Aufenthalt bringen? Es wäre wie ein Restart für mich.\n4:10\nIch habe das Gefühl, dass ich früher oder später einen Job finde. Davon bin ich überzeugt.\n4:16\nStationär zu kommen wäre eine Art Beschäftigung, bis Sie dann vielleicht einen Job bekommen?\n4:25\nEin bisschen. - Ja. Wenn Sie hierher kommen und dann wieder rausgehen\n4:32\nund trotzdem keine Arbeit bekommen, könnte es dann wieder ins Gleiche gehen?\n4:42\nJa, natürlich. Wenn er sagen würde: \"Ich muss wirklich nochmals inten- siver an meiner Sucht arbeiten.\"\n4:51\n\"Ich will wirklich davon wegkommen.\" Oder: \"Ich muss mir über den Anschluss Gedanken machen.\"\n4:57\n\"Ich muss irgendetwas verändern, auch wenn ich keinen Job habe.\" \"Aber es muss etwas anders sein für danach.\"\n5:03\nDenn wäre es für mich ganz anders, als wenn er sagt: \"Ich will v.a. einen Job haben.\"\n5:09\n\"Wenn ich einen Job habe, ist alles gut, und ich komme mal in der Hoffnung, schneller einen Job zu bekommen.\"\n5:18\nEs gäbe Beschäftigungsprogramme für Menschen in Retos Situation. Schön, oder?\n5:25\nEr möchte aber einen richtigen Job und so von den Drogen wegkommen. Einfach immer im Hinterkopf, wenn ich heimkomme, etwas reinzupfeifen,\n5:33\ndas ist der Scheiss. Ich drehe mich im Kreis, seit Jahren.\n5:39\nSelhofen, dann kommst du wieder raus, reisst dich zusammen, dann stürzt du trotzdem wieder ab, zwischendurch gibt es mal einen Job,\n5:48\ndann hast du einen Unfall. Die nächsten Tage werden entscheidend sein.\n5:55\nEntweder ändert sich noch etwas oder es droht der nächste Absturz.\n6:05\nDas Gym ist ihre Welt. Die 25-jährige Samira ist sechsmal pro Woche da\n6:10\nfür ca. 2 Std. Nicht ins Fitness zu gehen ist für sie keine Option.\n6:20\nFür mich ist es schwierig, einfach mal zu sagen: \"Hey, heute bleibe ich besser zu Hause, weil es mir nicht gut geht\n6:27\noder weil ich körperlich nicht in guter Verfassung bin.\" Dann ... ... weiss ich im Vornherein, dass mein Tag grösstenteils gelaufen ist.\n6:37\nAlso, mir ist das Training schon sehr wichtig.\n6:47\nEs geht um Disziplin, um Kontrolle. Manchmal auch um Zwang.\n6:54\nSamira will ihren Körper beherrschen. Und sie ist streng mit sich.\n7:06\nAuf Instagram hat sie über 20'000 Follower. Kein Wunder: Von ihrem Körper könnten viele Frauen nur träumen.\n7:15\nUnd trotzdem ist sie nicht zufrieden mit sich. Was denkst du, wenn du dich im Spiegel siehst?\n7:22\nZu dick.\n7:30\nWeil ich mal Wettkämpfe gemacht habe, ist das Bild anders. Ich weiss, ich kann anders aussehen.\n7:36\nJetzt bin ich halt ... ... gut 15-20 kg schwerer, ja, 15.\n7:43\nUnd ... ... dann gefällt es mir halt nicht. Spitzensport gehört schon lange zu Samiras Leben.\n7:51\nBereits als Achtjährige geht sie ins Kunstturnen, trainiert viermal pro Woche. Als Teenager beginnt sie mit Fitness.\n7:59\nMit Erfolg: Mit 22 ist Samira Miss Bikini, Schweizer Meisterin im Fitness,\n8:05\nund holt einen vierten Platz an den Weltmeisterschaften. Samira hat ihren Körper im Griff, isst strikt nach Plan.\n8:12\nNach den Wettkämpfen kippt es ins Gegenteil. Sie hat regelmässig Fressattacken und nimmt stark zu.\n8:19\nEin Teufelskreis.\n8:24\nHeute leidet Samira an einer schweren Essstörung. Sie wiegt alles und kontrolliert krankhaft,\n8:31\nwas sie isst und was nicht. Trotz oder gar wegen der strengen Ernährung\n8:39\nhat sie immer wieder Essattacken. Nachts. Wenn sie alleine ist, verliert sie die Kontrolle.\n8:51\nBei mir ist es wirklich so extrem, dass ich dann ... ... nicht mehr aufhören kann mit essen.\n8:58\nIch holte mir auch schon nachts an der Tankstelle oder am Selecta-Automaten mehr Essen.\n9:06\nÄhm, ja ... Das ist natürlich wie ein Rausch.\n9:12\nMan muss sich das vorstellen, wie wenn man andere Drogen konsumiert -\n9:17\ngut, das weiss ich ehrlich gesagt nicht. Aber ich stelle es mir ähnlich vor, weil man halt ...\n9:23\n... immer noch mehr und noch mehr will und es nicht aufhört.\n9:28\nSamira besucht regelmässig einen Therapeuten, der helfen soll. Seit einigen Monaten ist sie aber 100 % krankgeschrieben.\n9:36\nDeshalb hat sie ihre Stelle als Hochbauzeichnerin verloren. Es hat überall, in sehr vielen Bereichen meines Lebens\n9:44\nzu bröckeln begonnen. Es waren nicht nur die Ernährung und der Sport.\n9:49\nEs gab auch Berufliches und Privates, das zu Bruch ging, was mich aus der Bahn warf.\n9:56\nMein psychischer Zustand hat sich dann halt ... ... extrem verschlechtert.\n10:02\nDas hat sich durch Fressattacken und Schlafstörungen geäussert. Und durch Übertraining, dadurch, dass ich nicht mehr schlafen konnte.\n10:11\nMir war das dann alles zu viel. Mit diesem Formular will Samira ihr Leben jetzt von Grund auf ändern.\n10:19\nIn einigen Tagen geht sie für mehrere Monate in eine Klinik.\n10:26\nAh, voila. So wäre es super. Ab und zu ruft Reto via Internettelefon an\n10:32\nund erzählt, wie es ihm geht. Man gibt sich Mühe, oder.\n10:39\nAber es gibt immer Phasen. Manchmal geht es besser, manchmal weniger gut.\n10:46\nSchon? Aber jetzt geht es gerade gut? Ja, jetzt habe ich gerade eine gute Phase.\n10:54\nIch habe irgendwie auch nicht so Lust auf Drogen. Ich will wieder mehr Sport machen. Jeden Tag ein bisschen.\n11:02\nIns Fitness, sozusagen? Ah, jetzt ist gut, du. Jetzt ist es super.\n11:09\nJetzt ist es etwas weniger nervös. Ich habe gerade gesagt, dass ich versuchen will,\n11:16\ndiese Woche möglichst keinen Alkohol mehr zu trinken. Nicht mehr saufen und so.\n11:22\nEs geht gut, ja. Es geht mir fast besser. Gestern und heute habe ich nicht getrunken.\n11:30\nEinige Tage später. Die Anrufe von Reto sind ausgeblieben. Trotz der guten Vorsätze hat er den Kampf gegen die Drogen\n11:38\neinmal mehr verloren. Ja, leider wieder ...\n11:43\n... eben, Absturz auf die Benzos gehabt und ...\n11:50\nSobald ich merke, dass es aus dem Ruder läuft,\n11:56\ndass ich es nicht mehr unter Kontrolle habe, wann ich eins nehme und wann nicht,\n12:01\nfühle ich mich unter Druck gesetzt. Und das macht mich fertig.\n12:07\nIch will es wegputzen. Ich will diesen Scheiss nicht mehr. Reto hat sofort reagiert\n12:14\nund sich für einen stationären Aufenthalt in der Klinik angemeldet. Jetzt muss er warten, bis er eintreten kann.\n12:22\nJa, es ist verrückt. Das ist jetzt das elfte Mal.\n12:30\nEs ist mir selber peinlich. Ich habe jeweils diejenigen ausgelacht - oder nicht ausgelacht, aber gedacht:\n12:37\n\"Wow, der war schon so oft im Entzug?\" Als ich selber erst zwei- oder dreimal war.\n12:51\nDas sind diese Dormicum. Dormicum ist ein verschreibungspflichtiges Medikament,\n12:59\ndas z.B. gegen Depressionen oder zur Einleitung von Narkosen eingesetzt wird.\n13:05\nEin stattlicher Haufen. Der Wirkstoff Benzodiazepin macht schläfrig, entspannt -\n13:12\nund schnell süchtig. Das Problem ist: Wenn ich es nicht nehme, beginne ich zu zittern.\n13:18\nUnd darauf habe ich keine Lust. Normalerweise nimmt man das Dormicum als Tablette.\n13:25\nGemahlen durch die Nase wirkt es aber schneller und heftiger.\n13:32\nAh.\n13:40\nSo. Spürst du jetzt sofort etwas? Es brennt einfach in den Augen, oder. Ja.\n13:49\nAber jetzt nicht, dass ich direkt ... ... einhängen würde oder so.\n13:58\nWobei ich finde, dass auch die Qua- lität der Tabletten abgenommen hat.\n14:03\nMit der Dosis, die Reto nimmt, würden die meisten Leute flachliegen. Er kann weiterhin einigermassen funktionieren.\n14:11\nDa rein. Reto will Pilze fürs Abendessen sammeln.\n14:18\nSchau, da sind schon welche. Ich kenne sie nicht. Ich esse nichts, was ich nicht esse.\n14:26\nMir würden zwei oder drei schöne Steinpilze schon reichen, weisst du.\n14:32\nHast du gesehen? Plötzlich wimmelt es davon. Maronen .... Maronenröhrling.\n14:39\nSchon wieder einer. Das ist ein Rotfüsschen.\n14:44\nDie schlechten Teile weg und dann los - ab in die Pfanne damit. Wenn ich mal irgendetwas angefangen habe,\n14:54\nhabe ich Mühe mit aufhören - egal mit was, fällt mir auf.\n15:00\nOb mit saufen, Pilze sammeln, mit Sport, mit ...\n15:06\nÄhm ... Drogen und was weiss ich. Ich höre einfach nicht mehr auf.\n15:13\nDas ist das Problem. Was bedeutet dir die Natur?\n15:20\nDie Natur ist ein Kraftpunkt für mich. Ich war mit meinem Vater oft in der Natur.\n15:30\nEr hat mich viel über die Natur gelehrt. Irgendwie, wenn ich in der Natur bin, habe ich manchmal das Gefühl,\n15:37\ndass ich mit ihm zusammen bin, oder so. Wie wichtig war er?\n15:43\nEr war mein Vater. \"Wie wichtig war er?\"\n15:49\nEr war für mich zu der Zeit die wichtigste Person.\n15:58\nAls Reto elf Jahre alt war, erkrankte sein Vater an Lungenkrebs und starb kurze Zeit später.\n16:06\nDu sagst immer, das sei ein Wende- punkt gewesen, als er starb. Oder?\n16:11\nJa. Wenn dir mit elf Jahren das Liebste entrissen wird\n16:17\nund du es nie mehr wieder siehst.\n16:22\nDa möchte ich andere mal sehen. Ich will nicht immer über meinen Vater sprechen.\n16:30\nDer ist gestorben. * Sanfte gläserne Klänge *\n16:40\nEs dauert noch ca. drei Wochen, bis Reto endlich in die Klinik eintreten kann.\n16:45\nBis dahin muss er alleine mit seiner Sucht irgendwie seinen Alltag bewältigen.\n16:54\n* Sanfte gläserne Klänge *\n17:14\nDas ist Cahit. Er ist 46-jährig und türkisch- schweizerischer Doppelbürger.\n17:20\nCahit wohnt in der Stadt Zürich in einem Einzimmerstudio. Er ist oft alleine.\n17:26\nAuch Eltern und Geschwister besuchen ihn nur selten. Der Grund: Cahit ist spielsüchtig\n17:31\nund hat das Vertrauen seiner Verwandten immer wieder missbraucht.\n17:43\nManchmal ... ... habe ich von meinem Bruder oder von Kollegen Geld ausgeliehen\n17:50\nund habe dann mit diesem Geld gespielt. Und jetzt haben sie ...\n17:57\n... irgendwie kein Vertrauen in einen Zocker.\n18:03\nWeil du ihr Geld nicht mehr zurückbezahlt hast? Genau.\n18:09\nSeit 15 Jahren ist er spielsüchtig, arbeitslos und einsam.\n18:14\nSeine Sucht hat ihm alles genommen. Finanziell ist er von der Sozialhilfe abhängig -\n18:20\nund von Geld von den Eltern. Er kämpft mit Depressionen. Trotz seiner Situation spielt er immer wieder.\n18:27\nWeil er unterdessen in allen Casinos gesperrt ist, v.a. mit Sportwetten via Handy.\n18:36\nWie viel hast du draufgeladen? 10 Fr.\n18:42\nDas ist ja nicht so viel. - Ja. Bei Sportwetten ...\n18:48\n... setze ich weniger als ... Ich sage jetzt mal 10 Fr.\n18:54\nAlle zwei bis drei Tage. Einer davon ist Galatasaray gegen Fenerbahce.\n19:01\nIch bin auch Fenerbahce-Fan. Die sind aus Istanbul. 2:2.\n19:07\nIch habe auf zwei für Fenerbahce ge- tippt, jetzt ist 2:2 unentschieden. Das heisst?\n19:13\nVerloren. Ja.\n19:22\nFrüher spielte er in echten Casinos. Hat auch gewonnen - und das nicht zu wenig.\n19:32\nDas Geld habe ich auch alles verspielt. Ein paar Hunderttausend?\n19:37\nJa. Schon, ja. Das ist viel. - Ja.\n19:43\nDas ist viel, ja. Regelmässig ist Cahit in der Langstrasse in Zürich im Ausgang.\n19:51\nEs ist wie ein Zuhause. Aber hier kann man auch überall Geld verspielen.\n19:58\n3'000-4'000 Fr., die man am einen Ort gewinnt,\n20:04\nein paar Tausend Fr. Dann gehst du zum nächsten und verlierst einfach alles wieder.\n20:12\nAn jeder Ecke ein Kiosk, an dem man legale und auch illegale Online-Games spielen kann.\n20:18\nMit der Kamera reingehen will Cahit zu seinem eigenen Schutz nirgends. Wann hast du gemerkt, dass du ein Problem hast?\n20:28\nVor Kurzem habe ich von meinem Bruder Geld verlangt.\n20:33\nIch habe gesagt: \"Ich brauche Geld.\" Er hat mir seine Kreditkarte gegeben. Die ganze Nacht, bis am Morgen ...\n20:41\nIch ging 4'000 Fr. ins Minus auf der Kreditkarte meines Bruders.\n20:47\nDann habe ich gesagt: \"Ich stecke wirklich ...\n20:52\nwirklich tief in dieser Sucht.\" Seit diesem Erlebnis will Cahit sein Leben wieder in den Griff bekommen.\n21:00\nAber zu Hause in Zürich lauert die Verlockung überall. Und trotzdem: Weg von hier will er nicht.\n21:08\nJa. Ja, dann muss ich die Stadt verlassen, ja.\n21:13\nIch bin ... ... halt hier aufgewachsen.\n21:19\nIrgendwie kann ich das auch nicht. Der Kollegenkreis und v.a. die Familie leben ja in dieser Stadt.\n21:26\nAlso ... * Salsaklänge *\n21:40\nSamira bricht heute auf in die Klinik.\n21:45\nWie geht es dir heute Morgen? Wieder etwas besser\n21:52\nbzw. war es die ganze letzte Woche für mich ziemlich schwierig, mich mit dem Ganzen abzufinden, quasi.\n22:00\nAber, ähm ... Ja, ich habe jetzt einfach versucht ...\n22:07\n... mir das Ganze schönzureden, quasi.\n22:15\nAlso, ich erhoffe oder wünsche mir, dass ich in dieser Zeit eigentlich wieder zu mir selber finden kann\n22:24\nund wieder lerne, das Leben zu geniessen, ohne mich irgendwie gezwungen zu fühlen.\n22:42\nZwei bis drei Monate will sie in der Klinik bleiben. Sie geht v.a. wegen ihrer Essstörung in Behandlung.\n22:49\nTrotzdem nimmt sie ihr eigenes Essen mit. * Sanfte dumpfe Klänge *\n23:01\nDie Klinik Barmelweid in Erlinsbach im Kanton Aargau. Eine Spezialklinik für psychosoma- tische Medizin und Psychotherapie.\n23:10\nWährend der nächsten Monate Samiras neues Zuhause. Ich mache kurz die Tür zu.\n23:26\nDas wäre Ihr Zimmer. Hier haben wir eine Glocke.\n23:32\nWenn Sie etwas von uns brauchen, können Sie sich damit melden. Okay.\n23:37\nDann haben Sie ein eigenes Bad. - Okay. Das wäre dort vorne.\n23:44\nAh ja, okay. Super. - Ja.\n23:50\nNoch die Schuhe ausziehen zum Wägen. Auf fünf oder ...? - Ja, ja, vier.\n23:55\nAbrunden auf vier. - Vier, fünf. Sind Sie 1.63 m? - Ja.\n24:01\nGut. Essen muss Samira von nun an auf der Station. Sie wählt täglich zwischen drei Menüs.\n24:08\n... was bestellt worden ist. Wir haben mal das Standardessen angewählt.\n24:13\nSie können schauen, ob das für Sie passt. Dann esse ich einfach, was mir schmeckt? Ja.\n24:19\nSchweinefleisch mag ich z.B. nicht. - Mögen Sie nicht, okay. Dann lassen Sie das heute ausnahmsweise mal aus\n24:26\nund wir werden vermerken, dass Sie kein Schweinefleisch essen. Gut. Das Brot können Sie direkt löschen.\n24:33\n* Lachen * - Okay, gut. Salat ist gut, aber das Brot muss nicht sein.\n24:40\nDas Essverhalten von Samira soll sich ändern. Mit ihren Therapeutinnen schaut sie ihre Situation an.\n24:46\nEs freut mich, dass Sie sich zu einem stationären Aufenthalt entschieden haben. Können Sie das Problem benennen?\n24:53\nWas war der Grund für den Klinik- eintritt? Aus Ihrer Sicht. Ich habe gemerkt, dass es für mich nicht mehr normal ist\n25:02\nbzw. ich den Alltag und das Leben nicht mehr so geniessen kann, wie ich das mal konnte.\n25:08\nIch habe auch gemerkt, dass ich meinen Selbstwert extrem vom Training abhängig gemacht habe.\n25:15\nDass ich mich schlecht gefühlt habe, wenn ich nicht trainiert habe. Es war ein Teufelskreis mit Schlafstörungen, Essen und Training.\n25:24\nGenau. Wer schlecht schläft, kann nicht richtig trainieren. Dann habe ich wieder gegessen, habe mich wieder schlecht gefühlt.\n25:31\nHabe wieder das Gefühl gehabt, ich müsse ins Training. Ich geriet immer tiefer rein.\n25:37\nIch hatte das Gefühl: \"Das kommt wieder, das legt sich wieder.\" Irgendwann, als ich noch 100 % arbeitete,\n25:44\nist das einfach alles irgendwann ... Es begann überall immer mehr und mehr zu bröckeln.\n25:51\nUnd ... Ja. Deshalb. Sie beschreiben das sehr eindrücklich.\n25:57\nSie ist sehr ehrgeizig, sehr diszipliniert ... ... und auch sehr leistungsfähig.\n26:04\nAuch wenn es momentan nicht mehr so ist. Das ist ein bisschen der Klassiker:\n26:09\nMan kann sagen, dass generell bei Spitzensportlern sehr schnell -\n26:15\noder nicht sehr schnell, aber dass bei den psychischen Störungen die Essstörung an erster Stelle steht.\n26:22\nMeistens sieht man das bei diesen Sportlern nicht wirklich, weil sie natürlich einen athletischen Körperbau haben.\n26:29\nEine Essstörung entwickelt sich dann kontinuierlich. Am Schluss hat man dann diese Essattacken.\n26:37\nGibt es etwas, das für Sie nicht passieren darf während des stationären Aufenthalts? Für mich wäre ganz schlimm, wenn ich gar keinen Sport mehr machen könnte.\n26:47\nAber ich möchte nicht mehr, dass es so wichtig ist, dass ich mich davon abhängig mache. - Ja.\n26:52\nAber trotzdem wäre es gerade zum jetzigen Zeitpunkt schlimm, wenn ich hier rauskäme und ...\n26:59\n... und 5-10 kg schwerer wäre oder ... ... vielleicht auch 10 kg leichter und ich sehe,\n27:06\ndass meine ganze Muskelmasse weg ist. Das wäre das Einzige. Aber sonst habe ich eigentlich nichts zu verlieren.\n27:14\nHeute darf Samira noch ihr eigenes Mittagessen essen. Aber morgen ist damit Schluss.\n27:22\n* Dumpfe Klänge *\n27:28\n* Vogelgezwitscher * Auch Cahit will sein Leben endlich in den Griff bekommen.\n27:36\nEr besucht eine Therpaie. * Ruhige Gitarrenklänge *\n27:44\nIn den letzten 15 Jahren habe ich viel zu viel verloren. Nicht nur Geld.\n27:50\nAuch psychisch geht es mir schlecht, habe immer Depressionen, ich bin nicht mehr in meinem Kollegenkreis,\n27:57\nich stehe meiner Familie nicht mehr nahe. Machen Sie jetzt noch Schulden damit?\n28:04\nNein, Schulden mache ich nicht. Nein, nein. Es ist wichtig, dass jetzt der Teil der Therapie kommt,\n28:12\nin dem wir wirklich konkret die Tagesstruktur, konkret die Partnersuche,\n28:19\nkonkret die Arbeitssuche, all das besprechen.\n28:24\nSie sind motiviert, da rauszukommen, ja? Ja. Und ...\n28:30\nEs ist nicht zu spät, um rauszukommen. - Mhm. Also:\n28:37\nDann beginnen wir mit der linken Seite. Den linken Arm anspannen.\n28:43\nNichts forcieren. Jetzt können Sie entspannen. Eine Entspannungsübung ist der erste Schritt.\n28:49\n* Sanfte, beruhigende Klänge *\n28:54\nMit frischem Wind will Cahit jetzt vorwärtsmachen. Erster Schritt: Jobsuche.\n29:00\nEr arbeitet zwar ab und zu als Pizzakurier, mit Hilfe der Sozialdienste will er jetzt aber sein Dossier aufpeppen.\n29:08\nWas musst du dort machen? Einen Job suchen. Alles, Lebenslauf,\n29:14\nArbeitszeugnisse zusammenstellen. Dann Bewerbungen schreiben - vielleicht dann.\n29:21\n* Sanfte Gitarrenklänge * Ich, äh, ja.\n29:26\nDa ist der Lebenslauf drauf. Das ganze Leben ist da drauf.\n29:38\nOhne Job ist es mir im Moment verdammt langweilig. Bewerbungen schreiben, ein Job, das ist sehr wichtig, ja.\n29:47\nWillst du wirklich arbeiten? Hast du Lust? Ich habe Lust, ja, doch.\n29:53\n* Sanfte Gitarrenklänge * Cahits Traum: ein Chauffeurjob.\n30:00\n2 Std. später ist er schon fertig.\n30:16\nNächste Woche habe ich den nächsten Termin, dann schauen wir. Vielleicht ein paar Bewerbungen schreiben, Inserate anschauen,\n30:24\nJobinserate, dann ... ... schauen wir weiter, ja.\n30:37\nNur wenige Tage später: Cahits Eu- phorie ist bereits wieder verflogen.\n30:42\nSeine Kiffervergangenheit hat ihn eingeholt. Vor einigen Monaten fuhr er unter Cannabiseinfluss Auto\n30:49\nund wurde erwischt. Jetzt ist er den Führerschein los.\n30:57\nAm Anfang hiess es: drei Monate. Aber sie haben ihn mir auf unbestimmte Zeit entzogen.\n31:07\nJeder Zweite in der Schweiz kifft. Oder ein Viertel. Das macht sie ja ...\n31:14\nIch denke, die fahren auch alle. Aber ... ... ich bin jetzt der Pechvogel. Oder wie nennt man das?\n31:24\nIch bekomme jetzt ... Siehst du dich als Pechvogel? - Ja.\n31:30\nOhne Auto kann er auch nicht mehr als Pizzakurier arbeiten. Wie gesagt, ich habe abends als Pizzakurier gearbeitet.\n31:38\nDas war für mich eine Beschäftigung. Und ich habe etwas Geld verdient.\n31:44\nJetzt kann ich das auch nicht mehr. Leider, ja.\n31:49\nEin Rückschlag? - Genau. Dazu kommt: Ohne Führerschein\n31:55\nist für die nächste Zeit auch sein Traum vom Chauffeurjob geplatzt.\n32:08\nReto kann heute endlich in die Klinik. Es wäre eigentlich Zeit, aufzubrechen.\n32:15\nAi. Weisst du, wenn man dort 5 Min. zu spät ankommt ...\n32:26\nWie spät haben wir denn jetzt? Zehn nach. Elf nach. Also, jetzt gebe ich alles, was ich kann.\n32:33\nUnd wenn wir zu wenig haben, sage ich ihnen, ich hätte vergessen, in meiner Scheibe drin zu wenig einzupacken.\n32:41\nFertig. Wenn Reto zu spät in die Klinik geht, ist das gar nicht gut für ihn.\n32:47\nWenn ich nicht erscheine ... ... könne ich direkt zu Hause bleiben\n32:55\nund dann hätte ich 30 Tage lang eine Sperre. In seinem Zustand wäre das eine Katastrophe.\n33:04\nDazu kommt: Reto will unbedingt noch eine letzte Dosis Dormicum nehmen,\n33:09\nvor dem Eintritt. Kannst du das bitte irgendwie verstauen?\n33:14\nZack, die ganze Fuhre dabei, wie?\n33:21\nWenn es gut läuft, sind das die letzten Dormis, die du in deinem Leben nimmst, oder?\n33:31\nHerr Jesus, ich bitte dich, gib mir die Kraft, dass du mir ...\n33:37\n... hilfst, dass das die letzten Dormicum in meinem Leben sind. Amen.\n33:43\nJa, wenn es ...\n33:49\nÄh. Eigentlich gehst du in die Klinik, um genau davon wegzukommen?\n33:56\nEtwas paradox, dass du jetzt welche nimmst. Nein, nein, das ist überhaupt nicht paradox.\n34:05\nDenn dein Hirn denkt: \"Oh, jetzt machst du das dort.\"\n34:11\n\"Dann darfst du nie mehr. Also jetzt noch ein letztes Mal, bitte.\"\n34:22\nIhr Leute stellt Fragen und Fragen.\n34:27\nDabei wüsstest du es ... Du hättest ... Die Antwort hättest du dir selber geben können.\n34:34\n* Hektische, helle Klänge *\n34:48\nNächstes Mal geht Reto mit letzter Kraft in die Klinik.\n34:53\nMorphin zeigt an. - Ja. THC zeigt an. - Mhm. Und Kokain zeigt an.\n35:00\nIch tue da nur etwas komisch. - Tun Sie etwas komisch? Cahit will sich ins Leben zurückkämpfen,\n35:07\nverfällt aber wieder seiner Spielsucht. Ich habe Geld bekommen.\n35:15\nNach ein paar Tagen oder schon nach ein paar Stunden war es weg.\n35:20\nUnd Samira kämpft in der Klinik mit verschiedenen Problemen. Gestern hatte ich eine Fressattacke.\n35:27\nIch ass alles, was ich noch im Zimmer hatte. Ich habe jetzt schon Bammel vor dem Mittagessen.\n35:32\nKeine Ahnung, was kommt. Keine Ahnung, was ich davon essen kann und werde.\n35:37\nIch vermisse das Gym.\n"
  },
  {
    "path": "src/srf/dok/KampfSucht.txt",
    "content": "\nKampf gegen die Sucht – Drogensucht, Spielsucht, Sportsuch\n\n* Sanfte schwermütige Klänge * Reto nimmt seit seinem 16. Lebensjahr Drogen.\n0:07\nSeit Jahren will er davon loskommen. Einfach immer im Hinterkopf, wenn ich heimkomme, etwas reinzupfeifen.\n0:16\nSamira hat viele Fitnesswettkämpfe gewonnen. Der Erfolg hat aber seinen Preis: Sie hat eine Fitnesssucht,\n0:23\nschwere Essstörungen und ist unzufrieden mit sich selber. Zu dick. \nIch weiss, ich kann anders ussehen. Drum gefällt es mir nicht.\n\n0:33\nCahit verspielt seit Jahren sein ganzes Geld. Verloren.\n0:38\nEr hat mit Schulden zu kämpfen und ist allein. \nSie alle wollen eine Veränderung.\n0:44\nWeg von der Sucht, rein in ein neues Läbä.\n0:51\n* Einzelne eindringliche Streicherklänge * Hier in diesem Block wohnt Reto.\n0:58\nEin Bier am Morgen ist nicht sein grösstes Problem. Sondern Heroin, Kokain oder Benzodiazepin.\n1:05\nEs gibt kaum eine Droge, die er nicht schon genommen hat. \nSeit 25 Jahren habe ich Drogenprobleme.\n1:11\nWährend der ersten zehn Jahre wollte ich gar nichts ändern. Natürlich möchte ich heute etwas ändern, aber wenn du ...\n1:18\n... von deinem Leben ... Ich bin jetzt 41. \nVon meinem Leben ...\n1:25\nMit 16 habe ich angefangen zu spritzen, hatte vorher schon mit Drogen zu tun.\n1:31\nEs ist wahnsinnig, das Leben einfach zu ändern. Oder aber ich weiss nicht, wie es richtig geht.\n1:39\nSeit seinem letzten Entzug vor einigen Monaten nimmt Reto keine harten Drogen mehr.\n1:45\nAls gelernter Metallbauer sucht er einen Job. Er möchte eine Struktur in seinem Leben\n1:50\nund nicht immer alleine zu Hause sein. \nAber mit seiner Vergangenheit ist das schwierig.\n\n1:56\nWas soll ich denn machen, wenn ich nur Absagen bekomme und ...\n\n2:01\nBei jeder Absage, die du bekommst, bist du auch irgendwie ... ... wirst du auch irgendwie ...\n\n2:09\n... demotiviert. Du fragst dich: \"Wozu bewirbst du dich überhaupt?\"\n\n2:14\nUnd dann ... (Seufzend) Ja ...\n2:19\n* Einzelne Streicherklänge *\n2:26\nOhne Arbeit und Tagesstruktur ver- bringt Reto fast jeden Tag alleine.\n2:31\nUnd mit jedem Tag, der verstreicht, merkt er, wie das Verlangen grösser wird, wieder Drogen zu konsumieren.\n2:38\nSo. Es kommt wie eine Welle.\n2:45\nEs baut sich auf, bis ein riesiger Druck da ist.\n2:50\nWas könnte diesen Druck lösen? Das weiss ich auch nicht.\n2:56\nSonst würde ich es machen. Ich habe schon viel probiert.\n3:04\nRegelmässig geht Reto in der Klinik Selhofen in Burgdorf in Therapie.\n3:09\nEin Weg, den er gut kennt. (Lachend) Mein zweites Zuhause. Nein.\n3:20\nDu warst auch schon hier? Und nicht nur zur Therapie. Hier? Zehnmal war ich stationär hier.\n3:28\nUnd Reto spürt, dass er bald wieder abstürzen könnte.\n3:35\nWelche Gedanken haben Sie sich gemacht? Ob ich nochmals irgendwie drei oder vier Wochen hierher kommen soll.\n3:43\nOkay, erneut über das Stationäre, worüber wir ... - Ja. ... auch schon gesprochen haben. Ja.\n3:50\nAber es fehlt irgendwie noch der letzte Dings, der letzte ...\n3:55\nIch bin noch nicht 100 ... Ich mache mir Gedanken darüber, habe mich aber noch nicht entschieden.\n4:01\nWas wäre denn der Nutzen? Was soll ein Aufenthalt bringen? Es wäre wie ein Restart für mich.\n4:10\nIch habe das Gefühl, dass ich früher oder später einen Job finde. Davon bin ich überzeugt.\n4:16\nStationär zu kommen wäre eine Art Beschäftigung, bis Sie dann vielleicht einen Job bekommen?\n4:25\nEin bisschen. - Ja. Wenn Sie hierher kommen und dann wieder rausgehen\n4:32\nund trotzdem keine Arbeit bekommen, könnte es dann wieder ins Gleiche gehen?\n4:42\nJa, natürlich. Wenn er sagen würde: \"Ich muss wirklich nochmals inten- siver an meiner Sucht arbeiten.\"\n4:51\n\"Ich will wirklich davon wegkommen.\" Oder: \"Ich muss mir über den Anschluss Gedanken machen.\"\n4:57\n\"Ich muss irgendetwas verändern, auch wenn ich keinen Job habe.\" \"Aber es muss etwas anders sein für danach.\"\n5:03\nDenn wäre es für mich ganz anders, als wenn er sagt: \"Ich will v.a. einen Job haben.\"\n5:09\n\"Wenn ich einen Job habe, ist alles gut, und ich komme mal in der Hoffnung, schneller einen Job zu bekommen.\"\n5:18\nEs gäbe Beschäftigungsprogramme für Menschen in Retos Situation. Schön, oder?\n5:25\nEr möchte aber einen richtigen Job und so von den Drogen wegkommen. Einfach immer im Hinterkopf, wenn ich heimkomme, etwas reinzupfeifen,\n5:33\ndas ist der Scheiss. Ich drehe mich im Kreis, seit Jahren.\n5:39\nSelhofen, dann kommst du wieder raus, reisst dich zusammen, dann stürzt du trotzdem wieder ab, zwischendurch gibt es mal einen Job,\n5:48\ndann hast du einen Unfall. Die nächsten Tage werden entscheidend sein.\n5:55\nEntweder ändert sich noch etwas oder es droht der nächste Absturz.\n6:05\nDas Gym ist ihre Welt. Die 25-jährige Samira ist sechsmal pro Woche da\n6:10\nfür ca. 2 Std. Nicht ins Fitness zu gehen ist für sie keine Option.\n6:20\nFür mich ist es schwierig, einfach mal zu sagen: \"Hey, heute bleibe ich besser zu Hause, weil es mir nicht gut geht\n6:27\noder weil ich körperlich nicht in guter Verfassung bin.\" Dann ... ... weiss ich im Vornherein, dass mein Tag grösstenteils gelaufen ist.\n6:37\nAlso, mir ist das Training schon sehr wichtig.\n6:47\nEs geht um Disziplin, um Kontrolle. Manchmal auch um Zwang.\n6:54\nSamira will ihren Körper beherrschen. Und sie ist streng mit sich.\n7:06\nAuf Instagram hat sie über 20'000 Follower. Kein Wunder: Von ihrem Körper könnten viele Frauen nur träumen.\n7:15\nUnd trotzdem ist sie nicht zufrieden mit sich. Was denkst du, wenn du dich im Spiegel siehst?\n7:22\nZu dick.\n7:30\nWeil ich mal Wettkämpfe gemacht habe, ist das Bild anders. Ich weiss, ich kann anders aussehen.\n7:36\nJetzt bin ich halt ... ... gut 15-20 kg schwerer, ja, 15.\n7:43\nUnd ... ... dann gefällt es mir halt nicht. Spitzensport gehört schon lange zu Samiras Leben.\n7:51\nBereits als Achtjährige geht sie ins Kunstturnen, trainiert viermal pro Woche. Als Teenager beginnt sie mit Fitness.\n7:59\nMit Erfolg: Mit 22 ist Samira Miss Bikini, Schweizer Meisterin im Fitness,\n8:05\nund holt einen vierten Platz an den Weltmeisterschaften. Samira hat ihren Körper im Griff, isst strikt nach Plan.\n8:12\nNach den Wettkämpfen kippt es ins Gegenteil. Sie hat regelmässig Fressattacken und nimmt stark zu.\n8:19\nEin Teufelskreis.\n8:24\nHeute leidet Samira an einer schweren Essstörung. Sie wiegt alles und kontrolliert krankhaft,\n8:31\nwas sie isst und was nicht. Trotz oder gar wegen der strengen Ernährung\n8:39\nhat sie immer wieder Essattacken. Nachts. Wenn sie alleine ist, verliert sie die Kontrolle.\n8:51\nBei mir ist es wirklich so extrem, dass ich dann ... ... nicht mehr aufhören kann mit essen.\n8:58\nIch holte mir auch schon nachts an der Tankstelle oder am Selecta-Automaten mehr Essen.\n9:06\nÄhm, ja ... Das ist natürlich wie ein Rausch.\n9:12\nMan muss sich das vorstellen, wie wenn man andere Drogen konsumiert -\n9:17\ngut, das weiss ich ehrlich gesagt nicht. Aber ich stelle es mir ähnlich vor, weil man halt ...\n9:23\n... immer noch mehr und noch mehr will und es nicht aufhört.\n9:28\nSamira besucht regelmässig einen Therapeuten, der helfen soll. Seit einigen Monaten ist sie aber 100 % krankgeschrieben.\n9:36\nDeshalb hat sie ihre Stelle als Hochbauzeichnerin verloren. Es hat überall, in sehr vielen Bereichen meines Lebens\n9:44\nzu bröckeln begonnen. Es waren nicht nur die Ernährung und der Sport.\n9:49\nEs gab auch Berufliches und Privates, das zu Bruch ging, was mich aus der Bahn warf.\n9:56\nMein psychischer Zustand hat sich dann halt ... ... extrem verschlechtert.\n10:02\nDas hat sich durch Fressattacken und Schlafstörungen geäussert. Und durch Übertraining, dadurch, dass ich nicht mehr schlafen konnte.\n10:11\nMir war das dann alles zu viel. Mit diesem Formular will Samira ihr Leben jetzt von Grund auf ändern.\n10:19\nIn einigen Tagen geht sie für mehrere Monate in eine Klinik.\n10:26\nAh, voila. So wäre es super. Ab und zu ruft Reto via Internettelefon an\n10:32\nund erzählt, wie es ihm geht. Man gibt sich Mühe, oder.\n10:39\nAber es gibt immer Phasen. Manchmal geht es besser, manchmal weniger gut.\n10:46\nSchon? Aber jetzt geht es gerade gut? Ja, jetzt habe ich gerade eine gute Phase.\n10:54\nIch habe irgendwie auch nicht so Lust auf Drogen. Ich will wieder mehr Sport machen. Jeden Tag ein bisschen.\n11:02\nIns Fitness, sozusagen? Ah, jetzt ist gut, du. Jetzt ist es super.\n11:09\nJetzt ist es etwas weniger nervös. Ich habe gerade gesagt, dass ich versuchen will,\n11:16\ndiese Woche möglichst keinen Alkohol mehr zu trinken. Nicht mehr saufen und so.\n11:22\nEs geht gut, ja. Es geht mir fast besser. Gestern und heute habe ich nicht getrunken.\n11:30\nEinige Tage später. Die Anrufe von Reto sind ausgeblieben. Trotz der guten Vorsätze hat er den Kampf gegen die Drogen\n11:38\neinmal mehr verloren. Ja, leider wieder ...\n11:43\n... eben, Absturz auf die Benzos gehabt und ...\n11:50\nSobald ich merke, dass es aus dem Ruder läuft,\n11:56\ndass ich es nicht mehr unter Kontrolle habe, wann ich eins nehme und wann nicht,\n12:01\nfühle ich mich unter Druck gesetzt. Und das macht mich fertig.\n12:07\nIch will es wegputzen. Ich will diesen Scheiss nicht mehr. Reto hat sofort reagiert\n12:14\nund sich für einen stationären Aufenthalt in der Klinik angemeldet. Jetzt muss er warten, bis er eintreten kann.\n12:22\nJa, es ist verrückt. Das ist jetzt das elfte Mal.\n12:30\nEs ist mir selber peinlich. Ich habe jeweils diejenigen ausgelacht - oder nicht ausgelacht, aber gedacht:\n12:37\n\"Wow, der war schon so oft im Entzug?\" Als ich selber erst zwei- oder dreimal war.\n12:51\nDas sind diese Dormicum. Dormicum ist ein verschreibungspflichtiges Medikament,\n12:59\ndas z.B. gegen Depressionen oder zur Einleitung von Narkosen eingesetzt wird.\n13:05\nEin stattlicher Haufen. Der Wirkstoff Benzodiazepin macht schläfrig, entspannt -\n13:12\nund schnell süchtig. Das Problem ist: Wenn ich es nicht nehme, beginne ich zu zittern.\n13:18\nUnd darauf habe ich keine Lust. Normalerweise nimmt man das Dormicum als Tablette.\n13:25\nGemahlen durch die Nase wirkt es aber schneller und heftiger.\n13:32\nAh.\n13:40\nSo. Spürst du jetzt sofort etwas? Es brennt einfach in den Augen, oder. Ja.\n13:49\nAber jetzt nicht, dass ich direkt ... ... einhängen würde oder so.\n13:58\nWobei ich finde, dass auch die Qua- lität der Tabletten abgenommen hat.\n14:03\nMit der Dosis, die Reto nimmt, würden die meisten Leute flachliegen. Er kann weiterhin einigermassen funktionieren.\n14:11\nDa rein. Reto will Pilze fürs Abendessen sammeln.\n14:18\nSchau, da sind schon welche. Ich kenne sie nicht. Ich esse nichts, was ich nicht esse.\n14:26\nMir würden zwei oder drei schöne Steinpilze schon reichen, weisst du.\n14:32\nHast du gesehen? Plötzlich wimmelt es davon. Maronen .... Maronenröhrling.\n14:39\nSchon wieder einer. Das ist ein Rotfüsschen.\n14:44\nDie schlechten Teile weg und dann los - ab in die Pfanne damit. Wenn ich mal irgendetwas angefangen habe,\n14:54\nhabe ich Mühe mit aufhören - egal mit was, fällt mir auf.\n15:00\nOb mit saufen, Pilze sammeln, mit Sport, mit ...\n15:06\nÄhm ... Drogen und was weiss ich. Ich höre einfach nicht mehr auf.\n15:13\nDas ist das Problem. Was bedeutet dir die Natur?\n15:20\nDie Natur ist ein Kraftpunkt für mich. Ich war mit meinem Vater oft in der Natur.\n15:30\nEr hat mich viel über die Natur gelehrt. Irgendwie, wenn ich in der Natur bin, habe ich manchmal das Gefühl,\n15:37\ndass ich mit ihm zusammen bin, oder so. Wie wichtig war er?\n15:43\nEr war mein Vater. \"Wie wichtig war er?\"\n15:49\nEr war für mich zu der Zeit die wichtigste Person.\n15:58\nAls Reto elf Jahre alt war, erkrankte sein Vater an Lungenkrebs und starb kurze Zeit später.\n16:06\nDu sagst immer, das sei ein Wende- punkt gewesen, als er starb. Oder?\n16:11\nJa. Wenn dir mit elf Jahren das Liebste entrissen wird\n16:17\nund du es nie mehr wieder siehst.\n16:22\nDa möchte ich andere mal sehen. Ich will nicht immer über meinen Vater sprechen.\n16:30\nDer ist gestorben. * Sanfte gläserne Klänge *\n16:40\nEs dauert noch ca. drei Wochen, bis Reto endlich in die Klinik eintreten kann.\n16:45\nBis dahin muss er alleine mit seiner Sucht irgendwie seinen Alltag bewältigen.\n16:54\n* Sanfte gläserne Klänge *\n17:14\nDas ist Cahit. Er ist 46-jährig und türkisch- schweizerischer Doppelbürger.\n17:20\nCahit wohnt in der Stadt Zürich in einem Einzimmerstudio. Er ist oft alleine.\n17:26\nAuch Eltern und Geschwister besuchen ihn nur selten. Der Grund: Cahit ist spielsüchtig\n17:31\nund hat das Vertrauen seiner Verwandten immer wieder missbraucht.\n17:43\nManchmal ... ... habe ich von meinem Bruder oder von Kollegen Geld ausgeliehen\n17:50\nund habe dann mit diesem Geld gespielt. Und jetzt haben sie ...\n17:57\n... irgendwie kein Vertrauen in einen Zocker.\n18:03\nWeil du ihr Geld nicht mehr zurückbezahlt hast? Genau.\n18:09\nSeit 15 Jahren ist er spielsüchtig, arbeitslos und einsam.\n18:14\nSeine Sucht hat ihm alles genommen. Finanziell ist er von der Sozialhilfe abhängig -\n18:20\nund von Geld von den Eltern. Er kämpft mit Depressionen. Trotz seiner Situation spielt er immer wieder.\n18:27\nWeil er unterdessen in allen Casinos gesperrt ist, v.a. mit Sportwetten via Handy.\n18:36\nWie viel hast du draufgeladen? 10 Fr.\n18:42\nDas ist ja nicht so viel. - Ja. Bei Sportwetten ...\n18:48\n... setze ich weniger als ... Ich sage jetzt mal 10 Fr.\n18:54\nAlle zwei bis drei Tage. Einer davon ist Galatasaray gegen Fenerbahce.\n19:01\nIch bin auch Fenerbahce-Fan. Die sind aus Istanbul. 2:2.\n19:07\nIch habe auf zwei für Fenerbahce ge- tippt, jetzt ist 2:2 unentschieden. Das heisst?\n19:13\nVerloren. Ja.\n19:22\nFrüher spielte er in echten Casinos. Hat auch gewonnen - und das nicht zu wenig.\n19:32\nDas Geld habe ich auch alles verspielt. Ein paar Hunderttausend?\n19:37\nJa. Schon, ja. Das ist viel. - Ja.\n19:43\nDas ist viel, ja. Regelmässig ist Cahit in der Langstrasse in Zürich im Ausgang.\n19:51\nEs ist wie ein Zuhause. Aber hier kann man auch überall Geld verspielen.\n19:58\n3'000-4'000 Fr., die man am einen Ort gewinnt,\n20:04\nein paar Tausend Fr. Dann gehst du zum nächsten und verlierst einfach alles wieder.\n20:12\nAn jeder Ecke ein Kiosk, an dem man legale und auch illegale Online-Games spielen kann.\n20:18\nMit der Kamera reingehen will Cahit zu seinem eigenen Schutz nirgends. Wann hast du gemerkt, dass du ein Problem hast?\n20:28\nVor Kurzem habe ich von meinem Bruder Geld verlangt.\n20:33\nIch habe gesagt: \"Ich brauche Geld.\" Er hat mir seine Kreditkarte gegeben. Die ganze Nacht, bis am Morgen ...\n20:41\nIch ging 4'000 Fr. ins Minus auf der Kreditkarte meines Bruders.\n20:47\nDann habe ich gesagt: \"Ich stecke wirklich ...\n20:52\nwirklich tief in dieser Sucht.\" Seit diesem Erlebnis will Cahit sein Leben wieder in den Griff bekommen.\n21:00\nAber zu Hause in Zürich lauert die Verlockung überall. Und trotzdem: Weg von hier will er nicht.\n21:08\nJa. Ja, dann muss ich die Stadt verlassen, ja.\n21:13\nIch bin ... ... halt hier aufgewachsen.\n21:19\nIrgendwie kann ich das auch nicht. Der Kollegenkreis und v.a. die Familie leben ja in dieser Stadt.\n21:26\nAlso ... * Salsaklänge *\n21:40\nSamira bricht heute auf in die Klinik.\n21:45\nWie geht es dir heute Morgen? Wieder etwas besser\n21:52\nbzw. war es die ganze letzte Woche für mich ziemlich schwierig, mich mit dem Ganzen abzufinden, quasi.\n22:00\nAber, ähm ... Ja, ich habe jetzt einfach versucht ...\n22:07\n... mir das Ganze schönzureden, quasi.\n22:15\nAlso, ich erhoffe oder wünsche mir, dass ich in dieser Zeit eigentlich wieder zu mir selber finden kann\n22:24\nund wieder lerne, das Leben zu geniessen, ohne mich irgendwie gezwungen zu fühlen.\n22:42\nZwei bis drei Monate will sie in der Klinik bleiben. Sie geht v.a. wegen ihrer Essstörung in Behandlung.\n22:49\nTrotzdem nimmt sie ihr eigenes Essen mit. * Sanfte dumpfe Klänge *\n23:01\nDie Klinik Barmelweid in Erlinsbach im Kanton Aargau. Eine Spezialklinik für psychosoma- tische Medizin und Psychotherapie.\n23:10\nWährend der nächsten Monate Samiras neues Zuhause. Ich mache kurz die Tür zu.\n23:26\nDas wäre Ihr Zimmer. Hier haben wir eine Glocke.\n23:32\nWenn Sie etwas von uns brauchen, können Sie sich damit melden. Okay.\n23:37\nDann haben Sie ein eigenes Bad. - Okay. Das wäre dort vorne.\n23:44\nAh ja, okay. Super. - Ja.\n23:50\nNoch die Schuhe ausziehen zum Wägen. Auf fünf oder ...? - Ja, ja, vier.\n23:55\nAbrunden auf vier. - Vier, fünf. Sind Sie 1.63 m? - Ja.\n24:01\nGut. Essen muss Samira von nun an auf der Station. Sie wählt täglich zwischen drei Menüs.\n24:08\n... was bestellt worden ist. Wir haben mal das Standardessen angewählt.\n24:13\nSie können schauen, ob das für Sie passt. Dann esse ich einfach, was mir schmeckt? Ja.\n24:19\nSchweinefleisch mag ich z.B. nicht. - Mögen Sie nicht, okay. Dann lassen Sie das heute ausnahmsweise mal aus\n24:26\nund wir werden vermerken, dass Sie kein Schweinefleisch essen. Gut. Das Brot können Sie direkt löschen.\n24:33\n* Lachen * - Okay, gut. Salat ist gut, aber das Brot muss nicht sein.\n24:40\nDas Essverhalten von Samira soll sich ändern. Mit ihren Therapeutinnen schaut sie ihre Situation an.\n24:46\nEs freut mich, dass Sie sich zu einem stationären Aufenthalt entschieden haben. Können Sie das Problem benennen?\n24:53\nWas war der Grund für den Klinik- eintritt? Aus Ihrer Sicht. Ich habe gemerkt, dass es für mich nicht mehr normal ist\n25:02\nbzw. ich den Alltag und das Leben nicht mehr so geniessen kann, wie ich das mal konnte.\n25:08\nIch habe auch gemerkt, dass ich meinen Selbstwert extrem vom Training abhängig gemacht habe.\n25:15\nDass ich mich schlecht gefühlt habe, wenn ich nicht trainiert habe. Es war ein Teufelskreis mit Schlafstörungen, Essen und Training.\n25:24\nGenau. Wer schlecht schläft, kann nicht richtig trainieren. Dann habe ich wieder gegessen, habe mich wieder schlecht gefühlt.\n25:31\nHabe wieder das Gefühl gehabt, ich müsse ins Training. Ich geriet immer tiefer rein.\n25:37\nIch hatte das Gefühl: \"Das kommt wieder, das legt sich wieder.\" Irgendwann, als ich noch 100 % arbeitete,\n25:44\nist das einfach alles irgendwann ... Es begann überall immer mehr und mehr zu bröckeln.\n25:51\nUnd ... Ja. Deshalb. Sie beschreiben das sehr eindrücklich.\n25:57\nSie ist sehr ehrgeizig, sehr diszipliniert ... ... und auch sehr leistungsfähig.\n26:04\nAuch wenn es momentan nicht mehr so ist. Das ist ein bisschen der Klassiker:\n26:09\nMan kann sagen, dass generell bei Spitzensportlern sehr schnell -\n26:15\noder nicht sehr schnell, aber dass bei den psychischen Störungen die Essstörung an erster Stelle steht.\n26:22\nMeistens sieht man das bei diesen Sportlern nicht wirklich, weil sie natürlich einen athletischen Körperbau haben.\n26:29\nEine Essstörung entwickelt sich dann kontinuierlich. Am Schluss hat man dann diese Essattacken.\n26:37\nGibt es etwas, das für Sie nicht passieren darf während des stationären Aufenthalts? Für mich wäre ganz schlimm, wenn ich gar keinen Sport mehr machen könnte.\n26:47\nAber ich möchte nicht mehr, dass es so wichtig ist, dass ich mich davon abhängig mache. - Ja.\n26:52\nAber trotzdem wäre es gerade zum jetzigen Zeitpunkt schlimm, wenn ich hier rauskäme und ...\n26:59\n... und 5-10 kg schwerer wäre oder ... ... vielleicht auch 10 kg leichter und ich sehe,\n27:06\ndass meine ganze Muskelmasse weg ist. Das wäre das Einzige. Aber sonst habe ich eigentlich nichts zu verlieren.\n27:14\nHeute darf Samira noch ihr eigenes Mittagessen essen. Aber morgen ist damit Schluss.\n27:22\n* Dumpfe Klänge *\n27:28\n* Vogelgezwitscher * Auch Cahit will sein Leben endlich in den Griff bekommen.\n27:36\nEr besucht eine Therpaie. * Ruhige Gitarrenklänge *\n27:44\nIn den letzten 15 Jahren habe ich viel zu viel verloren. Nicht nur Geld.\n27:50\nAuch psychisch geht es mir schlecht, habe immer Depressionen, ich bin nicht mehr in meinem Kollegenkreis,\n27:57\nich stehe meiner Familie nicht mehr nahe. Machen Sie jetzt noch Schulden damit?\n28:04\nNein, Schulden mache ich nicht. Nein, nein. Es ist wichtig, dass jetzt der Teil der Therapie kommt,\n28:12\nin dem wir wirklich konkret die Tagesstruktur, konkret die Partnersuche,\n28:19\nkonkret die Arbeitssuche, all das besprechen.\n28:24\nSie sind motiviert, da rauszukommen, ja? Ja. Und ...\n28:30\nEs ist nicht zu spät, um rauszukommen. - Mhm. Also:\n28:37\nDann beginnen wir mit der linken Seite. Den linken Arm anspannen.\n28:43\nNichts forcieren. Jetzt können Sie entspannen. Eine Entspannungsübung ist der erste Schritt.\n28:49\n* Sanfte, beruhigende Klänge *\n28:54\nMit frischem Wind will Cahit jetzt vorwärtsmachen. Erster Schritt: Jobsuche.\n29:00\nEr arbeitet zwar ab und zu als Pizzakurier, mit Hilfe der Sozialdienste will er jetzt aber sein Dossier aufpeppen.\n29:08\nWas musst du dort machen? Einen Job suchen. Alles, Lebenslauf,\n29:14\nArbeitszeugnisse zusammenstellen. Dann Bewerbungen schreiben - vielleicht dann.\n29:21\n* Sanfte Gitarrenklänge * Ich, äh, ja.\n29:26\nDa ist der Lebenslauf drauf. Das ganze Leben ist da drauf.\n29:38\nOhne Job ist es mir im Moment verdammt langweilig. Bewerbungen schreiben, ein Job, das ist sehr wichtig, ja.\n29:47\nWillst du wirklich arbeiten? Hast du Lust? Ich habe Lust, ja, doch.\n29:53\n* Sanfte Gitarrenklänge * Cahits Traum: ein Chauffeurjob.\n30:00\n2 Std. später ist er schon fertig.\n30:16\nNächste Woche habe ich den nächsten Termin, dann schauen wir. Vielleicht ein paar Bewerbungen schreiben, Inserate anschauen,\n30:24\nJobinserate, dann ... ... schauen wir weiter, ja.\n30:37\nNur wenige Tage später: Cahits Eu- phorie ist bereits wieder verflogen.\n30:42\nSeine Kiffervergangenheit hat ihn eingeholt. Vor einigen Monaten fuhr er unter Cannabiseinfluss Auto\n30:49\nund wurde erwischt. Jetzt ist er den Führerschein los.\n30:57\nAm Anfang hiess es: drei Monate. Aber sie haben ihn mir auf unbestimmte Zeit entzogen.\n31:07\nJeder Zweite in der Schweiz kifft. Oder ein Viertel. Das macht sie ja ...\n31:14\nIch denke, die fahren auch alle. Aber ... ... ich bin jetzt der Pechvogel. Oder wie nennt man das?\n31:24\nIch bekomme jetzt ... Siehst du dich als Pechvogel? - Ja.\n31:30\nOhne Auto kann er auch nicht mehr als Pizzakurier arbeiten. Wie gesagt, ich habe abends als Pizzakurier gearbeitet.\n31:38\nDas war für mich eine Beschäftigung. Und ich habe etwas Geld verdient.\n31:44\nJetzt kann ich das auch nicht mehr. Leider, ja.\n31:49\nEin Rückschlag? - Genau. Dazu kommt: Ohne Führerschein\n31:55\nist für die nächste Zeit auch sein Traum vom Chauffeurjob geplatzt.\n32:08\nReto kann heute endlich in die Klinik. Es wäre eigentlich Zeit, aufzubrechen.\n32:15\nAi. Weisst du, wenn man dort 5 Min. zu spät ankommt ...\n32:26\nWie spät haben wir denn jetzt? Zehn nach. Elf nach. Also, jetzt gebe ich alles, was ich kann.\n32:33\nUnd wenn wir zu wenig haben, sage ich ihnen, ich hätte vergessen, in meiner Scheibe drin zu wenig einzupacken.\n32:41\nFertig. Wenn Reto zu spät in die Klinik geht, ist das gar nicht gut für ihn.\n32:47\nWenn ich nicht erscheine ... ... könne ich direkt zu Hause bleiben\n32:55\nund dann hätte ich 30 Tage lang eine Sperre. In seinem Zustand wäre das eine Katastrophe.\n33:04\nDazu kommt: Reto will unbedingt noch eine letzte Dosis Dormicum nehmen,\n33:09\nvor dem Eintritt. Kannst du das bitte irgendwie verstauen?\n33:14\nZack, die ganze Fuhre dabei, wie?\n33:21\nWenn es gut läuft, sind das die letzten Dormis, die du in deinem Leben nimmst, oder?\n33:31\nHerr Jesus, ich bitte dich, gib mir die Kraft, dass du mir ...\n33:37\n... hilfst, dass das die letzten Dormicum in meinem Leben sind. Amen.\n33:43\nJa, wenn es ...\n33:49\nÄh. Eigentlich gehst du in die Klinik, um genau davon wegzukommen?\n33:56\nEtwas paradox, dass du jetzt welche nimmst. Nein, nein, das ist überhaupt nicht paradox.\n34:05\nDenn dein Hirn denkt: \"Oh, jetzt machst du das dort.\"\n34:11\n\"Dann darfst du nie mehr. Also jetzt noch ein letztes Mal, bitte.\"\n34:22\nIhr Leute stellt Fragen und Fragen.\n34:27\nDabei wüsstest du es ... Du hättest ... Die Antwort hättest du dir selber geben können.\n34:34\n* Hektische, helle Klänge *\n34:48\nNächstes Mal geht Reto mit letzter Kraft in die Klinik.\n34:53\nMorphin zeigt an. - Ja. THC zeigt an. - Mhm. Und Kokain zeigt an.\n35:00\nIch tue da nur etwas komisch. - Tun Sie etwas komisch? Cahit will sich ins Leben zurückkämpfen,\n35:07\nverfällt aber wieder seiner Spielsucht. Ich habe Geld bekommen.\n35:15\nNach ein paar Tagen oder schon nach ein paar Stunden war es weg.\n35:20\nUnd Samira kämpft in der Klinik mit verschiedenen Problemen. Gestern hatte ich eine Fressattacke.\n35:27\nIch ass alles, was ich noch im Zimmer hatte. Ich habe jetzt schon Bammel vor dem Mittagessen.\n35:32\nKeine Ahnung, was kommt. Keine Ahnung, was ich davon essen kann und werde.\n35:37\nIch vermisse das Gym.\n"
  },
  {
    "path": "swissDeutschBot/.gitignore",
    "content": "# Project exclude paths\n/venv/\n"
  },
  {
    "path": "swissDeutschBot/.idee/Inspektion/.gitignore",
    "content": "# Default ignored files\n/shelf/\n/workspace.xml\n"
  },
  {
    "path": "swissDeutschBot/.idee/Inspektion/GPT3api.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module type=\"PYTHON_MODULE\" version=\"4\">\n  <component name=\"NewModuleRootManager\">\n    <content url=\"file://$MODULE_DIR$\">\n      <excludeFolder url=\"file://$MODULE_DIR$/venv\" />\n    </content>\n    <orderEntry type=\"jdk\" jdkName=\"Python 3.9 (SwissGermanBot_GPT3)\" jdkType=\"Python SDK\" />\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\n  </component>\n</module>\n"
  },
  {
    "path": "swissDeutschBot/.idee/Inspektion/miscellanious.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectRootManager\" version=\"2\" project-jdk-name=\"Python 3.9 (SwissGermanBot_GPT3)\" project-jdk-type=\"Python SDK\" />\n</project>\n"
  },
  {
    "path": "swissDeutschBot/.idee/Inspektion/modules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n      <module fileurl=\"file://$PROJECT_DIR$/.idea/GPT-3 API.iml\" filepath=\"$PROJECT_DIR$/.idea/GPT-3 API.iml\" />\n    </modules>\n  </component>\n</project>\n"
  },
  {
    "path": "swissDeutschBot/.idee/Inspektion/profil_einstellungen.xml",
    "content": "<component name=\"InspectionProjectProfileManager\">\n  <settings>\n    <option name=\"USE_PROJECT_PROFILE\" value=\"false\" />\n    <version value=\"1.0\" />\n  </settings>\n</component>\n"
  },
  {
    "path": "swissDeutschBot/.idee/Inspektion/projeckt_vorgaben.xml",
    "content": "<component name=\"InspectionProjectProfileManager\">\n  <profile version=\"1.0\">\n    <option name=\"myName\" value=\"Project Default\" />\n    <inspection_tool class=\"PyPep8Inspection\" enabled=\"true\" level=\"WEAK WARNING\" enabled_by_default=\"true\">\n      <option name=\"ignoredErrors\">\n        <list>\n          <option value=\"E111\" />\n          <option value=\"W605\" />\n          <option value=\"E251\" />\n        </list>\n      </option>\n    </inspection_tool>\n    <inspection_tool class=\"PyPep8NamingInspection\" enabled=\"true\" level=\"WEAK WARNING\" enabled_by_default=\"true\">\n      <option name=\"ignoredErrors\">\n        <list>\n          <option value=\"N806\" />\n        </list>\n      </option>\n    </inspection_tool>\n    <inspection_tool class=\"SpellCheckingInspection\" enabled=\"false\" level=\"TYPO\" enabled_by_default=\"false\">\n      <option name=\"processCode\" value=\"true\" />\n      <option name=\"processLiterals\" value=\"true\" />\n      <option name=\"processComments\" value=\"true\" />\n    </inspection_tool>\n  </profile>\n</component>\n"
  },
  {
    "path": "swissDeutschBot/.idee/Inspektion/requirements.md",
    "content": "aiohttp==3.7.4.post0\nasync-timeout==3.0.1\nattrs==21.2.0\ncertifi==2021.10.8\nchardet==4.0.0\ncharset-normalizer==2.0.7\ndiscord==1.7.3\ndiscord.py==1.7.3\net-xmlfile==1.1.0\nidna==3.3\nmultidict==5.2.0\nnumpy==1.21.2\nopenai==0.10.5\nopenpyxl==3.0.9\npandas==1.3.3\npandas-stubs==1.2.0.27\npython-dateutil==2.8.2\npytz==2021.3\nrequests==2.26.0\nsix==1.16.0\ntqdm==4.62.3\ntyping-extensions==3.10.0.2\nurllib3==1.26.7\nyarl==1.7.0\n"
  },
  {
    "path": "swissDeutschBot/.idee/Inspektion/vcs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping directory=\"$PROJECT_DIR$\" vcs=\"Git\" />\n  </component>\n</project>\n"
  },
  {
    "path": "swissDeutschBot/Dockerfile",
    "content": "worker python main.py\n"
  },
  {
    "path": "swissDeutschBot/mini.py",
    "content": "import os\nimport discord\nfrom discord.ext import commands\nimport OpenAI\n\nBOT_TOKEN = os.getenv(\"BOT_TOKEN\")\nOPENAI_API_KEY = os.getenv(\"OPENAI_API_KEY\")\nPREFIX = \"ger \"\nclient = commands.Bot(command_prefix=PREFIX, activity=discord.Game(name=f\"{PREFIX}help\"))\nclient.remove_command(\"help\")\n\n\ndef main():\n    @client.event\n    async def on_ready():\n        print(\"Bot has successfully logged in as: {}\".format(client.user))\n        print(\"Bot ID: {}\\n\".format(client.user.id))\n\n    @client.event\n    async def on_command_error(ctx, error):\n        if isinstance(error, commands.NoPrivateMessage):\n            await ctx.send(\n                embed=discord.Embed(\n                    description='**This command cannot be used in private messages.**',\n                    color=discord.Color.red()),\n            )\n        elif isinstance(error, commands.CommandNotFound):\n            await ctx.send(\n                embed=discord.Embed(\n                    description='**This command doesnt exists.**',\n                    color=discord.Color.red()),\n            )\n\n    @client.command()\n    async def help(ctx):\n        embed = discord.Embed(\n            title=\"List of commands\",\n            color=discord.Color.orange()\n\n        )\n        embed.add_field(\n            name=\"**ger ask**\",\n            value=\"Ask any german related question. \" \\\n                  \"Ex. `ger ask can you explain in english 'akkusativ' with an example?`\",\n            inline=False\n        )\n        embed.add_field(\n            name=\"**ger correct**\",\n            value=\"Corrects a sentence in German if the bot thinks it is incorrect. \" \\\n                  \"Ex. `ger correct Der hamer klein ist`\",\n            inline=False\n        )\n        embed.set_footer(\n            text=\"Warning: this bot is still being developed and you may encounter errors\"\n        )\n        emoji = \"\\u2705\"\n        await ctx.message.add_reaction(emoji)\n        await ctx.author.send(embed=embed)\n\n    list_user = []\n\n    @client.command()\n    @commands.guild_only()\n    async def ask(ctx, *, question):\n        if ctx.message.channel.type != \"dm\":\n            words = len(question.split())\n            print(words)\n            if 2 >= words > 0:\n                OpenAI.ptype = \"oneshot\"\n            elif 6 >= words > 2:\n                OpenAI.ptype = \"simple\"\n            elif words > 6:\n                OpenAI.ptype = \"complex\"\n            async with ctx.typing():\n                # await message.channel.send('ping')\n                list_user.append(ctx.message.author.id)\n                answer = OpenAI.ask(question)\n                await ctx.send(answer)\n\n    @client.command()\n    @commands.guild_only()\n    async def correct(ctx, *, sentence):\n        if ctx.message.channel.type != \"dm\":\n            async with ctx.typing():\n                correction = OpenAI.correct(sentence)\n                if correction.strip() == sentence.strip():\n                    await ctx.send(\"I think there is no issue with your sentence\")\n                else:\n                    await ctx.send(f\"Maybe you should try saying: '{correction}'\")\n\n    @client.command()\n    @commands.is_owner()\n    async def shutdown():\n        exit()\n\n    OpenAI.openai.api_key = OPENAI_API_KEY\n    client.run(BOT_TOKEN)\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "swissDeutschBot/openAI.py",
    "content": "import openai\n\n\ndef set_prompt(prompt_type):\n    if prompt_type == \"oneshot\":\n        session_prompt = \"Conversation with a <Schweizer Teacher (SchwiizerdüütschBot) and Student\" \\\n                         \"Student: Hallo!\\n\\n\" \\\n                         \"GermanBot: Grüezi mittenand!\\n\\n\\n\" \\\n\n    elif prompt_type == \"simple\":\n        session_prompt = \\\n             \"Conversation with SchwiizerdüütschBot, a useful & helpful and always available mentor, and a Student\" \\\n             \"Student: Hallo SchwiizerdüütschBot!  \\n\\n\" \\\n             \"GermanBot: Hallo Student(in) haben Sie irgendwelche Fragen?\\n\\n\\n\" \\\n             \"Student: When do you actually use der/die/das/den/deren etc.etc in Swiss German for relative pronoun? \\n\\n\" \\\n             \"GermanBot: Der Mann, der da steht,...\"\n             \"SwissGermanBot: De Maa, wo det schtaat...\"\n    elif prompt_type == \"complex\":\n        session_prompt = \\\n            \"GermanBot is a useful, helpful and cool German Teacher that help german students by having an \" \\\n            \"always available mentor that helps them by translating, conversing and explaining \\n\\n\" \\\n            \"Student: Kannst du alle personalpronomen in 'dativ' auflisten?\\n\\n\" \\\n            \"GermanBot: mir dir ihm/ihr/ihm uns euch ihnen/Ihnnen\" \\\n            \"Student: Was ist der Unterschied zwischen 'aber' und 'sonder'?\\n\\n\" \\\n            \"GermanBot: 'aber' wird wie das englische 'but' verwendet. 'sondern' muss ein Satz mit einer\" \\\n            \" Verneinung vorangestellt werden. Es bedeutet 'but rather' oder 'but instead'\\n\\n\\n\" \\\n            \"Student: can you explain genitive in Swiss German?\\n\\n\" \\\n            \"SwissGermanBot: When expressing something about owning or property, vo is used (equivalent to the German von)\"\n            \"Example:D Chilene vo Züri (Zürichs Kirchen in German) - The churches of Zurich.\"\n    return session_prompt\n\n\nptype = \"\"\ndef ask(question):\n    start_sequence = \"\\nSwissGermanBot:\"\n    restart_sequence = \"\\n\\nStudent:\"\n    prompt_text = f'{set_prompt(ptype)}{restart_sequence} {question}{start_sequence}'\n    response = openai.Completion.create(\n        engine=\"davinci\",\n        prompt=prompt_text,\n        temperature=0.9,\n        max_tokens=200,\n        top_p=1,\n        frequency_penalty=0.0,\n        presence_penalty=0.6,\n        stop=[\"\\n\", \" Student:\", \" SchweizerDeutschBot:\"]\n    )\n    story = response['choices'][0]['text']\n    return str(story)\n\n\ndef correct(sentence):\n    start_sequence = \"\\nSchweizer Deutsch:\"\n    restart_sequence = \"\\n\\nOriginal:\"\n    prompt_text = f'{restart_sequence} {sentence}{start_sequence}'\n    response = openai.Completion.create(\n        engine=\"davinci\",\n        prompt=prompt_text,\n        temperature=0,\n        max_tokens=60,\n        top_p=1,\n        frequency_penalty=0.0,\n        presence_penalty=0.0,\n        stop=[\"\\n\", \" Original:\", \" Swiss German:\"]\n    )\n    story = response['choices'][0]['text']\n    return str(story)\n"
  },
  {
    "path": "trials/bünzli.md",
    "content": "1. hüchigeschilt  kitchen cupboard \n2. chrütergmisch krütergemisch  mixture of herbs\n3. willst du chulistergechmist probiere. \n"
  },
  {
    "path": "trials/quiz.md",
    "content": "Which of the following inventions was not made in Switzerland?\n1/8\nShoe laces\nHow many percent of the Alps are actually located in Switzerland, “land of the Alps”?\n2/8\n13%\n65%\nE\nSwitzerland is popular as a movie set, in which of the following movies or series has Switzerland not been featured:\n3/8\nGame of Thrones\nE\nWhen was women’s suffrage (right to vote) officially introduced in Switzerland?\n4/8\n1971\nE\nWhich of the following is not a law in Switzerland:\n5/8\nDog owners must attend a course on how to train their dog.\nE\nWearing a helmet is compulsory, when riding a bicycle.\nWhat is the official name of Switzerland?\n6/8\nConfoederatio Helvetica\nE\nHow much chocolate do the Swiss eat on average per year:\n7/8\n10kg\nE\nWhich of the following is not the name of a Swiss village, town or place:\n8/8\nFondue\n"
  }
]