{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "Following Section 6.1.3 of [Müller, FMP, Springer 2015], we introduce in this notebook a phase-based approach for computing a novelty function. \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Phase Representation\n", "\n", "In the definition of the spectral-based novelty function, we have only used the magnitude of the spectral coefficients. We now show how the phase information can be used for onset detection. In particular, we exploit the fact that stationary tones have a stable phase, while transients have an unstable phase. As usual, let $\\mathcal{X}$ be the discrete STFT of the DT-signal $x$ using the sampling rate $F_\\mathrm{s}$, the window length $N$, and the and the hop size $H$. Using the [**polar coordinate representation**](../C2/C2_ComplexNumbers.html), we write the complex coefficients $\\mathcal{X}(n,k)\\in\\mathbb{C}$ as\n", "\n", "\\begin{equation}\n", " \\mathcal{X}(n,k)= |\\mathcal{X}(n,k)| \\,\\,\\mathrm{exp}(2\\pi i\\varphi(n,k))\n", "\\end{equation}\n", "\n", "with the phase $\\varphi(n,k)\\in[0,1)$. Intuitively, the phase $\\varphi(n,k)$ determines how the sinusoid of frequency \n", "$F_\\mathrm{coef}(k)= F_\\mathrm{s}\\cdot k/N$ has to be shifted to best correlate with the windowed signal corresponding to the $n^{\\mathrm{th}}$ frame. Let us assume that the signal $x$ has a high correlation with this sinusoid (i.e., $|\\mathcal{X}(n,k)|$ is large) and shows a steady behavior in a region of a number of subsequent frames $\\ldots,n-2,n-1,n,n+1,\\ldots$ (i.e., $x$ is locally stationary). Then the phases $\\ldots,\\varphi(n-2,k)$, $\\varphi(n-1,k)$, $\\varphi(n,k)$, $\\varphi(n+1,k),\\ldots$ increase from frame to frame in a fashion that is linear in the hop size $H$ of the STFT. Therefore, the frame-wise phase difference in this region remains approximately constant:\n", "\n", "\\begin{equation}\n", " \\varphi(n,k)- \\varphi(n-1,k) \\approx \\varphi(n-1,k)- \\varphi(n-2,k).\n", "\\end{equation}\n", "\n", "This is illustrated by the following figure, where the angular representation of the phases is indicated by the circles.\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Principal Argument Function\n", "\n", "When one considers phase differences, one needs to take care of **phase wrapping** discontinuities that are due to the fact that the phase is periodic. Besides **phase unwrapping** strategies, another alternative is to use the **principal argument function** \n", "\n", "\\begin{equation}\n", " \\Psi:\\mathbb{R}\\to\\left[-0.5,0.5\\right]\n", "\\end{equation}\n", "\n", "which maps phase differences into the range $[-0.5,0.5]$. To this end, a suitable integer value is added to or subtracted from the original phase difference to yield a value in $[-0.5,0.5]$. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2024-02-15T08:47:17.986343Z", "iopub.status.busy": "2024-02-15T08:47:17.986045Z", "iopub.status.idle": "2024-02-15T08:47:20.654717Z", "shell.execute_reply": "2024-02-15T08:47:20.654033Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaIAAACICAYAAAClS++LAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAc4klEQVR4nO2deZxU1ZXHvz/sJirqGEXFfQviNsoYcDROXCJGxYUkbmTcE4cPSTAxiRgXXKKJApPgOgmJxqBGhcyoiARjFJcYV0BQwQ0VkMUAiSAEDAJ95o/7qimKquqq7qp6r16d7+fTn66q9+q+c/tU17nnnPvOkZnhOI7jOHHRKW4BHMdxnMbGDZHjOI4TK26IHMdxnFhxQ+Q4juPEihsix3EcJ1bcEDmO4zix4obIcRzHiRU3RI7jOE6suCFyao6kGZKOrNUYkmZL6tOR6zUaknpImippuaTv1vjaHf58OPWFGyKnw0Rf9J9I+oekhZJ+K2mzQueb2X5m9nRHrlmJMRqZEozzJcDTZra5md1SSzmqoVtJ50manfV8XsbYSbpGUkWv55SHGyKnUpxkZpsBBwG9gSG5J0hqqrlUNSKFc9sVmBG3EE5j4IbIqShmNh94FNgfWle8P5L0GrBCUlP2Kjh6fLGk1yR9LGmMpI0z40naWdKDkhZL+ruk27Le1yfrvNmSLpP0hqQlkVe2MTlI2kHSA9F4s9oKO0m6VNJ7UYjqDUlfzblm7twOygpp/W80n59kvcckfS7r+ajM8Wi8wdHfYoWk30jaTtKj0XhPSPpsKXMp9neVdA+wC/BI5MVekjPnJ4GjgNui43uVKHtZeiwkR87nYx9JT0taGoXsTs6Rteh1s1gLFFosNEXHnZhwQ+RUFEk7A32BqVkvfx04AdjSzNbkedvpwHHA7sABwHnRWBsB44E5wG7AjsDoIpc/EzgW2BPYixyvTFIn4BHg1Wiso4GLJB1bZMz3gC8C/wL8GPidpO3zzY3w//QQMArYCrgf+CrlcQpwTCT/SQSjfjnQNRr/u2XMJe/f1czOBj4g8mLNbHi2AGb2JeBZYFB0/J0SZS9Lj23JIak5muOfgG2BC4F7JfUo5bo5/A3oVsBz3RlYXOIcnSrghsipFGMlLQX+AjwDXJ917BYzm2tmnxR47y1mtsDMPiJ88fSMXj8Y2AEYbGYrzOyfZvaXIjLcFl3nI+CnBCORTW9gGzO71sw+NbP3gduB/oUGNLP/jWRrMbMxwMxIrnxzO4Swur7FzFab2YPAy0XkzcetZrYw8iyfBV4ys6lmtopg5P6tjLkU+rtWi0rpMcMhwGbA0GiOTxIMWq5eS5nni8AagnFvRdImhMXLM6VM0KkOaYtrO/HxFTN7osCxuW28969Zj1cSvrQgrFTnFPCi2rrOnKxxMuwK7BAZzAwbEb7w8yLpHOAHhJU8hC/GrgWuuQMw39bvrdLW3HNZmPX4kzzPM5tASplLob9rtaiUHjPsAMw1s5as1+YQPKpSrtuKmS2RdCNwo6SZ0cubASOB5cDdZcrmVBA3RE4taG/Tq7nALpKaSvwS2znr8S7AgjzjzTKz7qVcXNKuBC/jaOAFM1sraRqgrNOy5/YhsKMkZRmjnQnhvQwrgU2znncD5pUiTw5lzSUP7dFJe2UvpsdiciwAdpbUKcsY7QKUGirM5QqCsZ4MdAYeJnhKfcxsRTvHdCqAh+acJPMy4ct9qKQukjaWdFiR878jaSdJWxHyKmPyjLcs2mCwiaSNJO0vqXeB8boQvigXA0g6n2gTRgFeICS9B0UbF/qxfhgPYBrwn9G1jwOOKDJeMcqdSy4LgT3KvOY02id7MT0Wk+MlYAVwiaRmhe3WJ1E8T1iQKLx6CbB1dN2vmtlhZjanPeM5lcMNkZNYzGwt4Yvnc4Sk9jzgjCJvuY+Q2H4/+vlJ9sGs8XoCswgJ7DsIGxHyXf8N4OcEA7MQ+FfguSLyfgp8DfgmsBQ4i5DTWJV12vciGZYSNleMLTKfgpQ7lzzcAAyJdqNdXOJ72iV7G3osKEf09zwZOJ4wv18A55jZWyXKW0ieFYQFw7KOjONUDnmrcCcNKNyseEGRPFUsSHoJGGlmv41bFsdJKu4ROU4FkXSEpG5RaO5cwnbiP8Ytl+MkGd+s4DiVpQfwe8KOrPeAU83sw3hFcpxk46E5x3EcJ1Y8NOc4juPESmJCc9F20JsJ+/zvMLOhOcePJOz7nxW99KCZXdvWuF27drXddtutorI6juM45TFlypS/mdk2+Y4lwhBFtaj+h1Bjax4wSdK4aPtsNs+a2YnljL3bbrsxefLkCknqOI7jtAdJBe/XSkpo7mDgXTN7P7p3YDTQL2aZHMdxnBqQFEO0I+vX5JrHhvWkAA6V9GpUFn+/QoNJGiBpsqTJixenuKhuSwvccw/stRfcdFPc0jiVZO1auP122GMPuOOOuKVxKsnq1XDbbbDrrjAmt/hHY5IUQ6Q8r+Vu53sF2NXMDgRupchd3Wb2azPrZWa9ttkmb0iy/nnuOTjkEDjnHJg5E159NW6JnEoxcSIcdBAMGACzZsHrr8ctkVMJzGDCBDjgALjwQvjgA5g+PW6pEkFSDNE81i9YuRM5BSvNbJmZ/SN6PAFolpRdBbkxmDULTj8d/uM/YP58GDUKdt89rLKc+uadd+Dkk6FPH/j4Yxg9Grp2dd2mgenT4bjj4IQTYM0aGDsWOnd23UYkxRBNArpL2l1SZ0JPlXHZJ0R3qyt6fDBB9r/XXNK4WLYMLrsM9tkHxo+Hq64KX1znnhs+0GvKrbDvJIYlS+D734f99oOnnoLrr4e33oIzzoDmZtdtPbN4MXzrW3DggfDyyzBiBMyYAf36uW6zSMSuOTNbI2kQ8Bhh+/adZjZD0sDo+EjgVOBbktYQ+rL0t0a4G3ftWrjzThgyBBYtgrPOghtugJ12WndOc7OvrOqR1ath5Ei45ppgjL75TbjuOujWbd05rtv6ZNUquOUW+MlPYMUK+Pa3g5633nrdOa7bVhJhiKA13DYh57WRWY9vA26rtVyxMnEi/OAH8Npr8IUvwCOPwMG5XQWApib/QNcTmVzBxRcHz+dLXwor5QMP3PBc1219YQYPPgiXXALvvw99+8LPfhYiGbm4bltJSmjOySY3VzBmDPzlL/mNELiLX09Mnw7HHgsnnhi83YcfhieeyG+EwHVbT0yZAkceCaeeCptsAo89Bn/4Q34jBK7bLNwQJYmPPoKLLgq5gqefDiG4t94KmxOUb2NhhK+sks+iRTBwYDA4kybBjTcGo3Tyya7bemfBAjjvPOjdG954A375S5g2Db785eLvc922kpjQXEOzenX48P74x7B06bpcwXbblfZ+X1kll1Wr4Oab4ac/DbmC73wHrr56/VxBMVy3yWXlSvj5z2Ho0KCjiy+GK66AfymxN6HrthU3RHFiFlz3iy+Gt9+Go48OuYIDDihvnKam8IXnJAczeOCBkCuYNSts2/3Zz2Dvvcsbx1fNyaOlBe6/Hy69FObNg1NOgWHDYM89yxvHdduKh+bi4vXXg+t+0knhS2vcOHj88fKNEPjKKmlMmQJHHAGnnQabbhpyBePHl2+EwHWbNJ5/Hg49NOxe3XbbEEL/v/8r3wiB6zYLN0S1JpMr6NkzfGHddFMwSiedVDxXUAxfWSWD+fPDfV29eoXcXqm5gmL4Ft9kMGcO9O8Phx0Gc+fCb38bcn1HHNH+MV23rXhorlZ0NFdQDP9Ax8vKlSHsNmxYWOEOHlxerqAYHnaNl+XLw6ahESOgUye48soQbt1ss46P7QvIVtwQVZtK5QqK4S5+PLS0wH33hYoXmVzB8OGhUGmlaG4OCxentqxdG7yeIUNg4UI488xgkHbeue33lor/37bioblqMnnyulxBly7wpz+1P1dQDF9Z1Z5M0dmzzw65gmeeCbmCShohcN3GwZNPwuc/D//1X0GfL70Ev/tdZY0QuG6zcENUDTK5gt69Q65g5EiYOhWOOaY61/OVVe2YPTvUgMsuOjtpEhx+eHWu57qtHTNnhhpwRx8dbqMYPTosOArdSN5RXLeteGiukqxcCf/93yE8s2YN/OhHIWxTiVxBMXxlVX2WLQuhmRtvDLmCq64K4dYuXap7Xddt9VmyBK69NvQI2njjUHT2ootCdYRq0tTkYdcIN0SVoKUF7r03GJ3580OJj2HDKh+mKYSvrKpHvqKz119f+TBNIVy31WP1avjVr8KmoUJFZ6uJ67YVN0Qd5bnnQgn/SZNCXPn+++GLX6ytDL5qrg6lFp2tJr4jsvKYwaOPwg9/GELnRx0VPN1C9f6qheu2Fc8RtZfcXMFdd4V+I7U2QuAf6EqTr0FdsaKz1cQXGZUlX4O6iRNrb4TAdZuFG6JyyTSo23vvsEK++urwxXXOOSF3EAdNTe7iV4JiDerae7NxR/HwTWUo1qDOdRs7Hporldxcwdlnhy+q7AZ1ceEeUccopUFdXPiquWOU0qAuLly3rbghKoXsXMFhh4V7gXr3jluqdWQ8IrP4Vnf1SDkN6uLCV83to5wGdXHhum3FQ3PFyM4VLFsWGtQ9+2yyjBCEDzQEr80pjXIb1MWFr5rLp9wGdXHhum3FDVE+8jWoe/PNthvUxUXGEPnqqm3a26AuLnzVXDrtbVAXF67bVsoOzUnqAvzTzNK3/M5tUHfBBeFGt1Ib1MVFU6TG1avDDXnOhlSz6Gw1yayaPexamNyis+U2qIsL94haadMQSeoE9AfOBHoDq4DPSFoMTAB+bWYzqypltcltUNenT+i82J7eQHGQ8Yj8Q70htSg6W02yw65NntJdj0o1qIsL32TUSimhuaeAPYHLgG5mtrOZbQt8EXgRGCrprCrKWF0yuYJMg7pHHgnFSevFCMG6Lyh389cnu0FdNYvOVhMPu+Ynt0FdpuhsvRgh8NBcFqUssfqY2QZm28w+Ah4AHpDUXHHJqs2iRaFe2O23Bxf+ppvC1s7m+puKe0Q5zJ8Pl18Od98N22wTwq0XXFCfHoWHXddnzpxQw3HMGNh++9CqIc57+DqCh11baVN7GSMk6XlJRxU7py5YtSoUJe3eHX7zGxg0CN59F773vfo0QuAeUYaVK0NOb6+9QjWEwYNDReWBA+vTCIF7RBmWLw+Lix49YNy40KDunXfC5oR6NEKwTrctLfHKkQDK0eAAYJCkiZIOrZZAVcMsuO777BNWVIcfHsJyN98MW20Vt3Qdo9E9opaW0C+mR4+wAeH448Mux+HDk5+wbotsj6gRWbsW7rgjLBxvuCFsyX777bDgqESX1DhpdN1mUbIhMrPpZnYKMBi4QtJ4ST0rJYik4yS9LeldSZfmOS5Jt0THX5N0UMmDZ+cKNtsMHn885IJ69KiU+PHSyB5RdoO67barXoO6uGhkjyi7Qd2ee1avQV1cNLJuc2iPT/sucB0wD5hcCSEkbQT8D3A8sC/wdUn75px2PNA9+hkA/LKkwWfPhl69wirqV78KDer69KmE2MmhET2ifA3qXn65eg3q4qIRV835GtTFVXS2mjSibgtQcuBc0pMEI/BP4I3o57wKyXEw8K6ZvR9dazTQL7pGhn7A3WZmwIuStpS0vZl9WHTkjz4KobjLL4cttqiQuAmjkVZWcTWoi4tG0m1cDeriopF0u3hx0cPlZHAvBt40s086JFB+dgTmZj2fB/x7CefsCGxgiCQNIHhN7L7DDjB0aEWFTRyNsLKKu0FdXDSCt5vkorPVpBF0u2oV3HprKDpbhDZDc1LYV2hmrxQyQplzOkC+91s7zgkvmv3azHqZWa+ttt++g6LVAWn/QE+cCAcdBAMGwOc+F3IF99yTfiME6V5kZIrOHnAAfPe70LNnCJ3ffnv6jRCkX7cPPRTKpA0eHIpFF6GkG1olXShpl+wXJXWW9CVJdwHndkBkCN5N9rfKTsCCdpzTmKR1s0Jug7oxY9KZKyhGWsM32Q3qklx0tpqkVbdTp4aut1/7WgixZorOFqEUQ3QcsBa4X9ICSW9ImgXMBL4O3Ghmozoo+iSgu6TdJXUmlBQal3POOOCcaPfcIcDHbeaHGoW0eUSFGtQltehsNUnbqjlfg7okF52tJmnT7Ycfwje+EXY6zphRVtHZUnJEpwP/AEYAc4D5wCdmtrQDIq+Hma2RNAh4DNgIuNPMZkgaGB0fSahr15ewa28lcH6lrl/3pMUjatRcQTHSsmpOcoO6uEiLbj/5JNTmHDoUPv0UfvjDUHR2yy1LHqIUQ5SpprApsDchL3MBFdq6ncHMJhCMTfZrI7MeG/CdSl4zNdS7R1QPDeriot5XzfXQoC4u0qDbTNHZuXNDKG748HbV+2vTEJnZep6HpBOAsZIONLO/l31Fp/LUs0c0fXrofvv44+Hu+YcfDgVoGy1MU4h6XjVPmRJ0++c/hzDrY48ltzdQHNSzbl94IYTPX3opbCS6555QNKCdlNIG4ge5LwFLgWGS3jCzEe2+ulMZ6tEjyi46u8UW4b6gb38bOneOW7JkUY+6XbBgXdHZrbeu76Kz1aQedTtnTvCARo+uaNHZUj4Zm+d5rRMhVFfnxZ5SQj19oOu1QV1c1FP4pl4b1MVFPel2+fKQAxoR+R1XXhnCrRWq91dKaO7H2c8lHUO4WfR7Zlb8dlmnNtRDaK7eG9TFRT2Eb1pa4L774LLL6rNBXVzUg27Xrg3ls4YMgb/+Fc48M1Q2qfA9fKWE5u6MHm5C2KzQBJzmRihBJN0jmjIlxJOffRb23z80qDvmmLilqg+Svmp+/vmg25dfDrmCe+9NX72/apF03T71VMjxTZsWmhCOHQv/nlvwpjKUEpp7Jvq9AngfmBrtYHOSQlI9otwGdSNHhi3ZnisonaSumnMb1I0aFSqg12tvoDhIqm5nzgzVEB5+GHbZJeSDqnwPXymhubuqdnWnMiTNI8rNFQwe7LmC9pK0VfPy5SE0M2JEMDoVzhU0FEnT7dKl4b69W2+Fz3wm5HG///2aFJ31pWkaSIpHlC9XMHx4enoDxUFSVs1r14YdUkOGwMKFVcsVNBRJ0e2aNaFFztVXh24F3/hGuPG4hjeSux+dBpLgEaW9QV1cJEG3aW9QFxdJ0O2jj4ais4MGhd+vvBI64ta4mokbojQQp4vfKA3q4iJO3TZKg7q4iFO3M2aEorN9+4brjx0bqtz37Fl7WXBDlA7icPGXLQshuL33Dm3Xr7oqVMs+91xPWFeSOHSbKTq7777BG8oUnT3jDK94UUni0G2m6OwBBwTPdsSIYJT69YtVt54jSgOdOoUPUS1WVo3aoC4uarlq9qKztaWWus00qLvuunVFZ6++Grp2rf61S8ANUVpobq7+ymrixHBfwWuvwRe+EDwhD9NUl1qsmr3obDzUSrcPPRR2Nr73XmKLznoMJS00N1dvZeUN6uKj2qvmTIO6E09s3AZ1cVFt3b7ySmhQd8opYTv2H/8YGtQlzAiBG6L00NRU+ZVVboO6G25o3AZ1cdGpU/iptG5zG9TdeGPjNqiLi2p5RAsWwPnnQ69eIf/zi1/Aq6/CscdW9joVxENzaaGSHpHnCpJFJXXrDeqSQ6W3b69cGRrUDRvW7gZ1ceGGKC00NXX8A+25gmRSKd16g7pkUanQXEvLugZ18+Z1qEFdXHhoLi10dLPC9OnBdfdcQfLoqG6nTIEjj4RTTw3lWh57LLG5goaiEmHXF14IG4fOOivUc3z66VDlvo6MELghSg/tXTUvWgQDBwaDM2mS5wqSSHt1u2ABnHce9O4Nb74ZGtRNm+ZdUpNEe3U7Zw707x+M0AcfhPJLkyd3qEtqnHhoLi2Uu2r2BnX1Q7m69QZ19UO5us0uOiulpuisG6K0UOrKyhvU1R+l6tYb1NUfpeo25UVnPTSXFkpZWU2ZElz3006DLl1Cg7rx490IJZ1SdPv886F52dlnw7bbris660Yo2ZSi2+yis3vsAS++mLqis26I0kKxLb7z54cacL16hd1wI0fC1KneJbVeKLZqzuQKDjsseEGjRoVcnxedrQ+K6XbmTPjKV0LR2SVLws64556rWpfUOPHQXFrI94HOzRVccknomOq5gvoi3yIjt0HdVVcF/XbpEo+MTvvIp9slS8J9e7fdVvMGdXERuyGStBUwBtgNmA2cbmZL8pw3G1gOrAXWmFmv2klZB2S7+N6gLl1k6zbluYKGI1u3q1eHBnXXXBNbg7q4SEJo7lJgopl1ByZGzwtxlJn1dCOUh4xH5A3q0kdGt96gLn1kdDthQmjNcOGFsTaoi4skGKJ+wF3R47uAr8QnSh3T3BxyA96gLn00N4fK596gLn00N4fq2CecEDyjmBvUxUUSDNF2ZvYhQPR72wLnGfAnSVMkDSg2oKQBkiZLmrx48eIKi5tQunWDjTbyBnVppFs36NzZG9SlkW7dYNNNE9OgLi5kZtW/iPQEkM/HvAK4y8y2zDp3iZl9Ns8YO5jZAknbAo8DF5rZn9u6dq9evWzy5MntF75eWLEiuPh1UODQKZPly8P9X1tsEbckTqVZtiwYns03j1uSqiNpSqG0Sk02K5hZn0LHJC2UtL2ZfShpe2BRgTEWRL8XSXoIOBho0xA1DL5bKr00wJdUw+KLCyAZoblxwLnR43OBh3NPkNRF0uaZx8CXgek1k9BxHMepGjUJzRUVQNoa+D2wC/ABcJqZfSRpB+AOM+sraQ/goegtTcB9ZvbTEsdfDrxdBdGTSFfgb3ELUUMaab4+1/TSKPPd1cy2yXcgdkNUbSRNbpTt3o00V2is+fpc00ujzTcfSQjNOY7jOA2MGyLHcRwnVhrBEP06bgFqSCPNFRprvj7X9NJo892A1OeIHMdxnGTTCB6R4ziOk2DcEDmO4zixkipDJOk0STMktUgquB1S0nGS3pb0rqRi1b4TjaStJD0uaWb0e4PSSNF5syW9LmmapLqqd9SWrhS4JTr+mqSD4pCzUpQw3yMlfRzpcpqkq+KQsxJIulPSIkl5b05Pk25LmGtq9NouzCw1P8A+QA/gaaBXgXM2At4D9gA6A68C+8YtezvnOxy4NHp8KTCswHmzga5xy9uO+bWpK6Av8Cgg4BDgpbjlrvJ8jwTGxy1rheZ7OHAQML3A8TTptq25pkav7flJlUdkZm+aWVtVFA4G3jWz983sU2A0oRVFPZL2Fhql6KofcLcFXgS2jGoW1iNp+my2iYWixR8VOSU1ui1hrg1NqgxRiewIzM16Pi96rR6peAuNhFGKrtKkz1LncqikVyU9Kmm/2ogWC2nSbSk0il43IPZW4eVSrKWEmW1QMDXfEHleS+we9jZaaJTKYZbVQkPSW1ZCC40EUIqu6kqfbVDKXF4h1Oz6h6S+wFige7UFi4k06bYtGkmvG1B3hsiKtJQokXlAdm/lnYAFHRyzahSbbwO00ChFV3WlzzZocy5mtizr8QRJv5DU1czSWDQzTbotSoPpdQMaMTQ3CeguaXdJnYH+hFYU9UjaW2iUoqtxwDnRDqtDgI8z4co6pM35SuomhRaekg4m/A//veaS1oY06bYoDabXDag7j6gYkr4K3ApsA/xB0jQzOza7pYSZrZE0CHiMsEvpTjObEaPYHWEo8HtJ3yRqoQGhmy3RfIHtgIeiz3imhcYfY5K3LArpStLA6PhIYAJhd9W7wErg/Ljk7SglzvdU4FuS1gCfAP0t2nZVb0i6n7BbrKukecDVQDOkT7clzDU1em0PXuLHcRzHiZVGDM05juM4CcINkeM4jhMrbogcx3GcWHFD5DiO48SKGyLHcRwnVtwQOY7jOLHihshxHMeJFTdEjpNAJH1e0lNZz/eX9EKcMjlOtXBD5DjJ5E1gr6zn1wJXxiSL41SVVJX4cZy0YGYrJf1T0paERnmfNbMnYhbLcaqCe0SOk1zeAPYGrgOGxCyL41QNN0SOk1xmEAp9ysyei1sYx6kWHppznOQyg9ACvnfcgjhONfHq247jOE6seGjOcRzHiRU3RI7jOE6suCFyHMdxYsUNkeM4jhMrbogcx3GcWHFD5DiO48SKGyLHcRwnVv4fKrR9r0oXxnQAAAAASUVORK5CYII=\n", "text/plain": [ "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |