\documentclass[11pt]{article}
\usepackage{amsmath,amssymb,amsthm}
\usepackage{tikz}
\usetikzlibrary{arrows}

\DeclareMathOperator*{\E}{\mathbb{E}}
\let\Pr\relax
\DeclareMathOperator*{\Pr}{\mathbb{P}}
\newcommand{\R}{\mathbb{R}}

\newcommand{\eps}{\epsilon}
\newcommand{\inprod}[1]{\left\langle #1 \right\rangle}
\newcommand{\poly}{{\rm poly}}

\newcommand{\handout}[5]{
  \noindent
  \begin{center}
  \framebox{
    \vbox{
      \hbox to 5.78in { {\bf CS 395T: Sublinear Algorithms } \hfill #2 }
      \vspace{4mm}
      \hbox to 5.78in { {\Large \hfill #5  \hfill} }
      \vspace{2mm}
      \hbox to 5.78in { {\em #3 \hfill #4} }
    }
  }
  \end{center}
  \vspace*{4mm}
}

\newcommand{\lecture}[4]{\handout{#1}{#2}{#3}{Scribe: #4}{Lecture #1 }}

\newtheorem{thm}{Theorem}[section]
\newtheorem{claim}[thm]{Claim}
\newtheorem{lemma}[thm]{Lemma}
\newtheorem{define}[thm]{Definition}
\newtheorem{cor}[thm]{Corollary}
\newtheorem{obs}[thm]{Observation}
\newtheorem{remark}[thm]{Remark}
\newtheorem{example}[thm]{Example}
\newtheorem{construction}[thm]{Construction}
\newtheorem{conjecture}{Conjecture}
\newtheorem{THM}{Theorem}
\newtheorem{COR}[THM]{Corollary}
\newtheorem{question}{Question}
\newtheorem{fact}[thm]{Fact}
\newtheorem{prop}[thm]{Proposition}
% 1-inch margins, from fullpage.sty by H.Partl, Version 2, Dec. 15, 1988.
\topmargin 0pt
\advance \topmargin by -\headheight
\advance \topmargin by -\headsep
\textheight 8.9in
\oddsidemargin 0pt
\evensidemargin \oddsidemargin
\marginparwidth 0.5in
\textwidth 6.5in

\parindent 0in
\parskip 1.5ex

\begin{document}

\lecture{4 --- Sept. 9, 2014}{Fall 2014}{Prof.\ Eric Price}{Zhao Song }

\section{Overview}

In today's lecture, we will discuss the following problems:

\begin{enumerate}
\item Count-Min \cite{CM05}
\item Count-Sketch \cite{CCF02}
\item Fourier analysis of Count-Sketch \cite{MP14}
\end{enumerate}

{\bf Motivation} All these things are dominated by top few elements
\begin{enumerate}
\item URLS on the web
\item Words in Shakespeare
\item IPs in router
\end{enumerate}

\section{Preliminaries}

\begin{define}
Let $x$ denote a vector of length $n$, $x_{(i)}$ = the $i^{th}$ largest term.
\end{define}

\begin{define}
Let $x_{(1,\cdots,k)}$ denote the vector that zeros every coordinates but takes top-$k$ largest terms, and $x_{(k+1,\cdots,n)} = x - x_{(1,\cdots,k)}$.
\end{define}

\begin{define}
Let $H = (1,\cdots,k)$ (Head set) and $T=(k+1,\cdots,n)$ (Tail set).
\end{define}


\paragraph{Observation} Many kinds of data come from power law
distributions, such as $x_{(i)} \propto i^{-\alpha}$, where
$\alpha\approx.8$.

\begin{claim}
$\frac{\|x_{(k+1,\cdots,n)}\|_2}{\|x\|_2} \propto \frac{1}{k^{\frac{2\alpha-1}{2}}}$
\end{claim}

%\begin{proof}
%$\| x_{(k+1,\cdots,n)} \|_2^2  = \overset{n}{\underset{i=k+1}{\sum}} i^{-2\alpha}$
%\end{proof}

Make a sketch $A\in \R^{m\times m}$, and $m \approx k\log^c n$.

Given $y= Ax$, we want an estimate $\hat{x}$ of $x$ such that
\begin{equation*}
\| \hat{x} - x \| \leq c\| x - x_{(1,\cdots,k)} \| = c\| x_{(k+1,\cdots,n)} \|
\end{equation*}
where $c$ is a constant factor. (What norm do you care about? You can choose $\ell_1,\ell_2,\ell_\infty...$)

For $\ell_1$ norm:

\begin{equation*}
\| \hat{x} -x \|_{\infty} \leq \frac{\epsilon}{k} \| x_{(k+1,\cdots,n)}\|_1 \implies  \| \overline{x} - x \|_1 \leq (1+\epsilon) \| x_{(k+1,\cdots,n)} \|_1, where ~ m \approx O(\frac{k}{\epsilon}\log n)
\end{equation*}
where $\overline{x}$ contains the largest $k$ coordinates of
$\hat{x}$.  Similarly, for $\ell_2$, we have

\begin{equation*}
\| \hat{x} -x \|_{\infty} \leq \frac{\epsilon}{\sqrt{k}} \| x_{(k+1,\cdots,n)}\|_2 \implies  \| \overline{x} - x \|_2 \leq (1+\epsilon) \| x_{(k+1,\cdots,n)} \|_2, where ~ m \approx O(\frac{k}{\epsilon^2}\log n)
\end{equation*}
where $\overline{x}$ contains the largest $k$ coordinates of
$\hat{x}$.  (You will prove these in your homework.)

What's the difference between these norms?  Well, for power law
distributions we get:

\begin{claim}
$\frac{\|x_{(k+1,\cdots,n)} \|_1}{\| x \|_1} \approx \frac{1}{k^{\alpha -1}} ~\text{this~is~true~if}~\alpha>1$
\end{claim}

\begin{claim}
$\frac{\|x_{(k+1,\cdots,n)} \|_1}{\| x \|_1} \approx \frac{1}{k^{\frac{2\alpha-1}{2}}} ~\text{this~is~true~if}~\alpha>\frac{1}{2}$
\end{claim}

Note that in the common case of $0.5 \leq \alpha \leq 1$, only the
$\ell_2$ guarantee is useful.


In this class we will give a $\Theta(n\log n)$ time algorithm to do
recovery. Next class we will improve this to $o(n)$ time($\approx
\Theta(k\cdot\text{poly}(\log n))$.

\section{Count-Min}
Some other lecture notes also provide the details of Count-Min. 

Lecture 3 of Course ``Sublinear Algorithms for Big Data'' at the University of Buenos Aires, 

http://grigory.github.io/files/teaching/sublinear-big-data-3.pdf .

 Lecture 5 of Course ``Algorithm for Big Data'' at Harvard University, 

 http://people.seas.harvard.edu/~minilek/cs229r/lec/lec5.pdf .
 
{\bf Sketch}:

We think about storing a ``table'' with $R$ rows and $B$ columns, and
a counter $y_v^{(u)}$ for each cell $(u, v)$ of the table.

\begin{enumerate}
\item Choose $R$ pair-wise independent hash functions $h_1, h_2,
  \cdots, h_R : [n] \rightarrow [B]$.
\item For each hash function/row $h_u$, we need $B$ counters.
\item $\forall u \in [R], \forall v \in [B], y_v^{(u)} = \underset{i,h_u(i) = v}{\sum} x_i$.
\end{enumerate}

This is a linear function of $x$, so it can be expressed as a matrix.  

{\bf Recovery Algorithm}

Given $y$, we recover our estimate $\hat{x}$ of $x$ by:

\begin{enumerate}
\item In each row, estimate $\hat{x}_i^{(u)} = y_{h_u(i)}^{(u)}$.
\item Overall, estimate $\hat{x}_i = \min_u \hat{x}_i^{(u)}$.
\end{enumerate}


The intution of this algorithm is trying to separate large terms from small terms.

{\bf Analysis}:

Let $H=(1,\cdots,k)$ and $T=(k+1,\cdots,n)$. For a particular hash function $h_u$:

\begin{equation*}
\begin{split}
\| \hat{x}_i^{(u)} - x_i \| & = \underset{j\in H, h_u(i)=h_u(j)}{\sum} x_j + \underset{j\in T, h_u(i)=h_u(j)}{\sum} x_j \\
& \leq \underbrace{0}_{with~ probability ~1 - \frac{k}{B}} +\underbrace{\|x_T \|_1 /B}_{in ~expectation}\\
& \leq \underbrace{0}_{with~ probability ~ \frac{9}{10}} +\underbrace{ \frac{\|x_T \|_1}{k} }_{with~probability~\frac{9}{10}}\\
\end{split}
\end{equation*}
where we set $B=10k$.

Thus for each $u$ and $i$, by a union bound we have
\begin{equation*}
\| \hat{x}_i^{(u)} - x_i \| \leq \frac{\| x_T\|_1}{k} ~with~ probability ~\frac{8}{10}.
\end{equation*}

then it implies that

\begin{equation*}
\hat{x}_i = \underset{u}{\min}~ \hat{x}_i^{(u)} \leq x_i + \frac{\|x_T\|_1}{k}~ with ~probability ~1-(\frac{1}{5})^R
\end{equation*}

Choose $R= O(\log n)$, then
\begin{equation*}
BR = O(k\log n), ~ 1-(\frac{1}{5})^R = 1-n^{-c}, ~where ~c ~is ~a ~constant ~value.
\end{equation*}

What if some coordinates are negative?

For some error $\sigma = O(\|x_T\|_1/k)$, we have that
$Pr[|\hat{x}_i^{(u)} - x_i |\leq \sigma] \geq \frac{4}{5}$.  Then
after $R$ samples, with $1-e^{-O(R)}$ probability we will have that at
least $\frac{n}{2}$ of the $\hat{x}_i^{(u)}$ will land in $x_i \pm
\sigma$. Their median then to land in that region.

\section{Count-Sketch}


\subsection{Other references}

Some other lecture notes also provide the details of Count-Sketch. 

Lecture 3 of Course ``Sublinear Algorithms for Big Data'' at the
University of Buenos Aires,

http://grigory.github.io/files/teaching/sublinear-big-data-3.pdf . 

Lecture 5 of Course ``Algorithm for Big Data'' at Harvard University, 

http://people.seas.harvard.edu/~minilek/cs229r/lec/lec5.pdf .

%(Note all your errors go to same direction).

\subsection{Setup}

One issue with count-min is that if the vector is positive everywhere,
then all the errors go in the same direction.  The idea of
count-sketch is to introduce random signs in the summation, so that
the errors tend to cancel each other out.  This converts the bound
from $\ell_1$ to $\ell_2$, which is more useful.

{\bf Sketch}:

We think about storing a ``table'' with $R$ rows and $B$ columns, and
a counter $y_v^{(u)}$ for each cell $(u, v)$ of the table.

\begin{enumerate}
\item Choose $R$ pair-wise independent hash functions $h_1, h_2,
  \cdots, h_R : [n] \rightarrow [B]$ and $s_1, \dotsc, s_R : [n] \to \{\pm 1\}$.
\item For each hash function/row $h_u$, we need $B$ counters.
\item $\forall u \in [R], \forall v \in [B], y_v^{(u)} = \underset{i,h_u(i) = v}{\sum} s_u(i) x_i$.
\end{enumerate}

This is a linear function of $x$, so it can be expressed as a matrix.  

{\bf Recovery Algorithm}

Given $y$, we recover our estimate $\hat{x}$ of $x$ by:

\begin{enumerate}
\item In each row, estimate $\hat{x}_i^{(u)} = s_u(i)y_{h_u(i)}^{(u)}$.
\item Overall, estimate $\hat{x}_i = \text{median}_u \hat{x}_i^{(u)}$.
\end{enumerate}

The only difference from Count-Min is the introduction of the signs
$s_u$, and the use of the median for estimation.

{\bf Analysis}:

Let's bound the term $\| \hat{x}_i^{(u)} - x_i \|$ for every $u\in [R]:$

\begin{equation*}
\begin{split}
\| \hat{x}_i^{(u)} - x_i \| & = \underset{j\in H, h_u(i)=h_u(j)}{\sum} x_j + \underset{j\in T, h_u(i)=h_u(j)}{\sum} x_j \\
& \leq \underbrace{0}_{with~ probability ~ 1-\frac{k}{B}} +\underbrace{ \Delta }_{\underset{h}{E}  \underset{s}{E}  [\Delta^2] = E \sum x_j^2 = \|x_T\|_2^2 / B}\\
\end{split}
\end{equation*}

Then, we have
\begin{equation*}
\begin{split}
& \Delta^2 \leq \frac{\|x_T\|_2^2}{k} ~ with ~ probability ~ \frac{9}{10} \\
\implies & \|\hat{x}_i^{(u)} - x_i \| \leq \frac{\| x_T \|_2}{\sqrt{k}} ~ with ~ probability ~ \frac{4}{5}\\
\implies & \|\hat{x}_i - x_i \| \leq \frac{\|x_T\|_2}{\sqrt{k}} ~ with ~ probability ~ 1- n^{-c} ~ (by ~ setting ~ R= O(\log n))\\
\end{split}
\end{equation*}

\section{Fourier Analysis of \cite{MP14}}
You can actually give a tighter analysis of Count-Sketch, which shows
that \emph{most} coordinates are estimated to higher precision, if
your hash functions are fully independent. As we described in an
earlier class, the assumption of fully independent hash functions is
unfortunate, but it can be justified using cryptographic hash
functions and computational assumptions on the adversarial input, or
assuming the input has high entropy.


Note that the details of this analysis also can be found in Eric
Price's presentation slide of SODA'2015. Here is the link :
http://www.cs.utexas.edu/~ecprice/slides/concentration-slides.pdf.

\begin{thm}
  Assume that $h$ and $s$ are fully independent hash functions, and
  consider the output $\hat{x}$ of Count-Sketch.  Then $\forall t \leq
  R$, we have
\begin{equation*}
|\hat{x}_i - x_i| \leq \sqrt{\frac{t}{R}} \cdot \frac{\| x_T\|_2}{\sqrt{k}}
\end{equation*}
with probability $1-e^{-\Omega(t)}$.

This implies that $\E[\hat{x}_i-x_i]\leq \frac{1}{\sqrt{R}}\cdot
\frac{\|x_T\|_2}{\sqrt{k}}$ after excluding $e^{-\Omega(R)}$ events.
\end{thm}


Before we get into the prove, let's look at a simpler problem:

\subsection{Estimating a symmetric random variable's point of
  symmetry}

Suppose we have an unknown distribution ${\cal X}$ over $R$, which is
symmetric about unknown $\mu$.  How can we best recover $\mu$ from a
set of samples $x_1, \dotsc, x_R \sim \mathcal{X}$?


For example, you might consider the following distribution:
\[
{\cal X} =  \left\{
\begin{array}{l l}
    mean ~\mu, ~standard ~deviation~ \sigma  & \quad \text{with ~probability }~\frac{1}{2}\\
    \mu \pm \infty & \quad \text{with ~probability }~\frac{1}{2}
  \end{array}
\right.
\]
%${\cal X}$ : mean $\mu$, standard deviation $\sigma$ with probability $\frac{1}{2}$;
%${\cal X}$ : $\mu \pm \infty$ with probability $\frac{1}{2}$.

\begin{enumerate}
\item Mean
\begin{enumerate}
\item Converges to $\mu$ as $\frac{\sigma}{\sqrt{R}}$
\item No robustness to outliers
\end{enumerate}
\item Median
\begin{enumerate}
\item Extremely robust
\item Doesn't necessarily converge to $\mu$
\end{enumerate}
\end{enumerate}

We show that it will work if you take the median of pairwise means:

\begin{equation*}
\underset{i\in\{1,3,5,\cdots\}}{\text{median}} ~ \frac{x_i + x_{i+1}}{2}
\end{equation*}
which converges as $O(\sigma/\sqrt{R})$. (Similar to Hodges-Lehmann estimator\footnote{http://en.wikipedia.org/wiki/Hodges–Lehmann\_estimator})

{\bf Why does median converge for $(\mathcal{X}+\mathcal{X})/2$?}
\begin{enumerate}
\item Without loss of generality, assume that $\mu = 0$.
\item Define the Fourier transform ${\cal F_X}$ of ${\cal X}$: ${\cal F_X} (t) = \E_{x \sim \mathcal{X}} [\cos (\tau x t)]$, where $\tau = 2\pi \approx 6.28$.
\item Convolution $\iff$ multiplication: ${\cal F_{X+X}}(t) = ({\cal F_X}(t))^2 \geq 0$ for all $t$.
\end{enumerate}

\begin{thm}
Let ${\cal Y}$ be symmetric about 0 with ${\cal F_Y}(t)\geq 0$ $\forall t$ and $\E[Y^2]=\sigma^2$. Then $\forall \epsilon \leq 1$
\begin{equation*}
Pr[|y|\leq \epsilon \sigma] \gtrsim \epsilon.
\end{equation*}
\end{thm}
%less/greater than approximately : \lesssim and \gtrsim
Let's consider the proof when $\sigma=1$.
\begin{proof}

\begin{equation*}
{\cal F_Y}(t) = \E[\cos(\tau y t)] \geq 1-\frac{\tau^2}{2} t^2
\end{equation*}

\begin{figure}[!h]
\centering

\begin{tikzpicture}[>=stealth',shorten >=1pt,auto,node distance=3cm,
  thick,main node/.style={scale=.6,circle,fill=black!20,draw,font=\sffamily\bfseries},gray node/.style={scale=0.6,circle,fill=red!40,draw,font=\sffamily\bfseries}]
  [scale=.8,auto=left,every node/.style={thick,->,>=stealth',auto,circle,fill=blue!20}]
  

\pgfmathsetmacro\left{1.5}
\pgfmathsetmacro\dx{2}
\pgfmathsetmacro\dy{-0.25}
\pgfmathsetmacro\ep{0.05}
\pgfmathsetmacro\xep{0.05}
\pgfmathsetmacro\s{3}

%\draw (0,0) rectangle  +(\x,\y); 
%\draw (-0.6,1.3) rectangle  +(\x,\y); 

%\draw (0,\bottom) -- (0 ,\top);
%\draw (1.0*\dx,\bottom) -- (1.0*\dx ,\top);

%\draw (\movexx+2*\t,\moveyy+\t) -- (\movexx+\t ,\moveyy+2*\t);
%\draw (\movexx+\t,\moveyy+2*\t) -- (\movexx+0.000 ,\moveyy+\t);

%%%first equation
\node[] (s1) at (0,0){$Pr[|y|\leq \epsilon] = {\cal Y} \cdot $};
\draw[right of=s1, xshift=-.5cm, yshift=-.2cm] plot[domain=-1:1,samples=100,id=sinc2] function{abs(x) < .3 ? .5 : 0};
\draw[right of=s1, xshift=-.5cm, yshift=-.2cm] plot[domain=-1:1,samples=100,id=sinc3] function{0};
\draw [<->] (3.6,\dy) -- (3.6,\dy+0.5);
\node[] at (3.8,0) {$ 1$};
\draw [blue] (\left+1,\dy+0.05) -- (\left+1,\dy-0.1);
\draw [blue] (\left+1.3,\dy+0.05) -- (\left+1.3,\dy-0.1);
\node[] at (\left+1.2,\dy-0.2) {${\epsilon}$};

%%%second equation
\node[] (s2) at (1,-2){$\geq {\cal Y} \cdot$};
\draw (0+\left,\dy-2) -- (0+\left+\dx,\dy-2);
\draw (\left+0.7,\dy-2) -- (\left+1+\xep*0.6,\dy+0.5-2);
\draw (\left+1.3,\dy-2) -- (\left+1-\xep*0.6,\dy+0.5-2);
%\draw (\left+0.7-\ep,\dy+0.5-\ep-2) -- (\left+1.3+\ep,\dy+0.5-\ep-2);
\draw [<->] (3.6,\dy-2) -- (3.6,\dy+0.5-2);
\node[] at (3.8,0-2) {$ 1$};
\draw [blue] (\left+1,\dy-2) -- (\left+1,\dy-0.1-2);
\draw [blue] (\left+1.3,\dy-2) -- (\left+1.3,\dy-0.1-2);
\node[] at (\left+1.2,\dy-0.2-2) {${\epsilon}$};


%%% third equation
\node[] (s3) at (1,-4){$= {\cal F_Y} \cdot $};
\draw[right of=s3, xshift=-.5cm, yshift=-4.2cm] plot[domain=-1:1,samples=100,id=sinc2] function{0.2*(sin(5*x)/(5*x))**2};
\draw[right of=s3, xshift=-.5cm, yshift=-4.2cm] plot[domain=-1:1,samples=100,id=sinc3] function{0};


\draw [thin, <->] (3.6,\dy-4) -- (3.6,\dy+0.35-4);
\node[] at (3.8,0-4) {$ \epsilon$};
\draw [blue] (\left+1,\dy-4) -- (\left+1,\dy-0.1-4);
\draw [blue] (\left+1.5,\dy-4) -- (\left+1.5,\dy-0.1-4);
\node[] at (\left+1.2,\dy-0.3-4) {$\frac{1}{\epsilon}$};

%%%Fourth equation
\node[] (s4) at (0.7,-6){$\geq$};

%%%left
\draw[right of=s3, xshift=-0.5cm, yshift=-6.2cm] plot[domain=-1:1,samples=100,id=sinc2] function{(0.4 - (2*x)**2) > 0 ? (0.4 - (2*x)**2) : 0};
\draw[right of=s3, xshift=-0.5cm, yshift=-6.2cm] plot[domain=-1:1,samples=100,id=sinc3] function{0};
\draw [<->] (3.6,\dy-6) -- (3.6,\dy+0.5-6);
\node[] at (3.8,0-6) {$ 1$};
\draw [blue] (\left+1,\dy-6) -- (\left+1,\dy-0.1-6);
\draw [blue] (\left+1.3,\dy-6) -- (\left+1.3,\dy-0.1-6);
\node[] at (\left+1.2,\dy-0.2-6) {${\tiny 0.2}$};


\node [] at (4.2,-6) {$\cdot$};

%%%right
\draw[right of=s3, xshift=\s*\left+2.3cm, yshift=-6.2cm] plot[domain=-1:1,samples=100,id=sinc2] function{0.2*(sin(5*x)/(5*x))**2};
\draw[right of=s3, xshift=\s*\left+2.3cm, yshift=-6.2cm] plot[domain=-1:1,samples=100,id=sinc3] function{0};
\draw [thin, <->] (6.6,\dy-6) -- (6.6,\dy+0.35-6);
\node[] at (6.8,0-6) {$ \epsilon$};
\draw [blue] (\s*\left+1,\dy-6) -- (\s*\left+1,\dy-0.1-6);
\draw [blue] (\s*\left+1.5,\dy-6) -- (\s*\left+1.5,\dy-0.1-6);
\node[] at (\s*\left+1.2,\dy-0.3-6) {$\frac{1}{\epsilon}$};

\node [] at (7.4,-6) {$\gtrsim \epsilon$};


%\node[main node] (s1) at (0.5,1.0*\dx){};


%\node[gray node] (s2) at (2*\dx,4.0*\dx){};



%\draw[blue] (2*\dx,3*\dx) rectangle  +(1*\dx,2*\dx); 

%\draw[green] (6*\dx,7*\dx) rectangle  +(2*\dx,2*\dx); 

%\draw[yellow] (1.0*\dx, 7.0*\dx) -- (1.0*\dx, 9.0*\dx);

  \path[every node/.style={font=\sffamily\small}]
%	(n11) edge (n6)
	;
\end{tikzpicture}
%\caption{%Each cross ``+'' position stores either a red point or a black point. From the column 2 to 9, the black points are omitted. After some preprocessing, we want to report the number of the red points in many given queries, e.g. (blue) rectangle, (green) square, (yellow) right angle triangle.}%Case (1); Case (2); Case (3); Case (4)}
%}
\label{fig:directed}
\end{figure}

where we use that the Fourier transform of the triangle function is
$(\frac{\sin x}{x})^2$ is positive.

\end{proof}

\bibliographystyle{alpha}

\begin{thebibliography}{42}

\bibitem[CCF02]{CCF02}
Moses~Charikar, Kevin~Chen, and Martin~Farach-Colton.
\newblock Finding Frequent Items in Data Streams.
\newblock {\em ICALP}, 2002.

\bibitem[CM05]{CM05}
Graham~Cormode and S.~Muthukrishnan.
\newblock Summarizing and Mining Skewed Data Streams.
\newblock {\em SDM}, 2005.

\bibitem[MP14]{MP14}
Gregory~T.~Minton and Eric~Price.
\newblock Improved Concentration Bounds for Count-Sketch
\newblock {\em SODA(best student paper)} 2014.



\end{thebibliography}


\end{document}






%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

