Overview

Differential expression analysis with 2hpa control and all replicates.

Replicates removed for not passing quality control tests: ‘7hpf_2012_N1’, ‘2hpf_2012_N6’

Spearman Correlation

Spearman’s rank correlation coefficient is a nonparametric measure of rank correlation, recommended for data that does not necessarily come from a bivariate normal distribution (Wikipedia). Below, we plot the Spearman correlation of the RPM (reads per million) for all genes that have an average RPM ≥ 1.

Pairwise PCA

Principal component analysis (PCA) is a statistical procedure that uses an orthogonal transformation to convert a set of observations of possibly correlated variables into a set of values of linearly uncorrelated variables called principal components (Wikipedia). Below is a PCA of the 8hpf control versus the other developmental timepoints.

MA and Volcano plots

MA plot: The log2 fold change (M) plotted against the log2 average (A) of the normalized read count for each gene. Significantly differentially expressed genes are plotted in red.

Volcano plot: The log2 fold change (M) plotted against the -log10 (eg. 1e^-10 = 10) of the adjusted p-value.

1hpf/2hpf

3hpf/2hpf

4hpf/2hpf

5hpf/2hpf

6hpf/2hpf

7hpf/2hpf

8hpf/2hpf

Heatmaps

The first heatmap was made by hierarchically clustering the euclidean distances of the log2 fold change for genes with p-values less than 1e^-5 at any time point.

The second heatmap uses the same hierarchical method to cluster timepoints as well as genes.

LS0tCnRpdGxlOiAiMiBocGEgQ29udHJvbC0gVHdvIFJlcGxpY2F0ZXMgUmVtb3ZlZCIgCmF1dGhvcjogIktpcnN0ZW4gR290dGluZyIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgICAgdG9jOiB0cnVlCiAgICAgIHRvY19kZXB0aDogMgogICAgICB0b2NfZmxvYXQ6CiAgICAgICAgY29sbGFwc2VkOiBmYWxzZQoKLS0tCgoKYGBge3IgaW5pdGlhbGl6ZURhdGEyaHBhQ29udHJvbCwgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gImhpZGUiLCBtZXNzYWdlID0gRkFMU0UsIGVycm9yID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgY2FjaGUgPSBGQUxTRX0KCiMjIHVzZXIgaW5wdXQgdG8gJ0RFU2VxMkFsbC5SZGF0YScKCmxvYWQoIi4vb3V0cHV0L0RFU2VxMnR3b2hwYS5SZGF0YSIpCnNldHdkKCIuLyIpCgojIyBGaXJzdCBsaXN0IHRoZSBSIGxpYnJhcmllcyBJIHdhbnQgdG8gdXNlCmxpYnJhcmllcyAgICAgICAgPC0gYygiREVTZXEyIiwgImdwbG90cyIsICJSQ29sb3JCcmV3ZXIiLCAna25pdHInLCAnZ3JpZCcsICdncmlkRXh0cmEnLCAidGlkeXZlcnNlIiwgJ2tpUnN0ZW4nKQoKIyMgTm93IHJlYWQgaW4gdGhlIGxpYnJhcmllcwpsYXBwbHkobGlicmFyaWVzLCBmdW5jdGlvbih4KXsKICAgIGxpYnJhcnkoeCwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFLCBxdWlldGx5ID0gVFJVRSkKICAgIH0pCgojIyBJbml0aWFsaXplIGtuaXRyIG9wdGlvbnMKb3B0c19jaHVuayRzZXQoZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0iaGlkZSIsIGZpZy5rZWVwPSJhbGwiLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgZmlnLnBhdGg9ImZpZ3VyZXMvIiwgY2FjaGUgPSBGQUxTRSkKb3B0c19rbml0JHNldChyb290LmRpciA9ICIuLyIpCgpwdmFsIDwtIGFzLm51bWVyaWMocHZhbCkKCmBgYAoKCiMgT3ZlcnZpZXcKCkRpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2lzIHdpdGggMmhwYSBjb250cm9sIGFuZCBhbGwgcmVwbGljYXRlcy4KClJlcGxpY2F0ZXMgcmVtb3ZlZCBmb3Igbm90IHBhc3NpbmcgcXVhbGl0eSBjb250cm9sIHRlc3RzOiAnN2hwZl8yMDEyX04xJywgJzJocGZfMjAxMl9ONicKCgojU3BlYXJtYW4gQ29ycmVsYXRpb24KClNwZWFybWFuJ3MgcmFuayBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBpcyBhIG5vbnBhcmFtZXRyaWMgbWVhc3VyZSBvZiByYW5rIGNvcnJlbGF0aW9uLCByZWNvbW1lbmRlZCBmb3IgZGF0YSB0aGF0IGRvZXMgbm90IG5lY2Vzc2FyaWx5IGNvbWUgZnJvbSBhIGJpdmFyaWF0ZSBub3JtYWwgZGlzdHJpYnV0aW9uIChXaWtpcGVkaWEpLiBCZWxvdywgd2UgcGxvdCB0aGUgU3BlYXJtYW4gY29ycmVsYXRpb24gb2YgdGhlIFJQTSAocmVhZHMgcGVyIG1pbGxpb24pIGZvciBhbGwgZ2VuZXMgdGhhdCBoYXZlIGFuIGF2ZXJhZ2UgUlBNICYjODgwNTsgMS4KCgoKYGBge3Igc3BlYXJtYW5fY29ycmVsYXRpb24yaHBhQ29udHJvbCwgZmlnLmNhcCA9ICIifQoKIyMgTWFrZSBhIHNwZWFybWFuIHBsb3QKCgpmaWx0ZXJlZFJQTXMgPC0gbm9ybUNvdW50cyAlPiUgZ3JvdXBfYnkoSUQpICU+JSBtdXRhdGUocnBtRmxhZyA9IGlmZWxzZSgobWVhbihycG0pID49IDEpLCB5ZXMgPSAneWVzJywgbm8gPSAnbm8nKSkgJT4lIHVuZ3JvdXAoKSAlPiUKICAgIGZpbHRlcihycG1GbGFnID09ICd5ZXMnKSAlPiUgc2VsZWN0KElELCBTYW1wbGUsIHJwbSkgJT4lIHNwcmVhZChTYW1wbGUsIHJwbSkKCgoKcnBtZmlsdCAgICAgICAgPC0gZGF0YS5mcmFtZShzZWxlY3QoZmlsdGVyZWRSUE1zLCAtSUQpLCByb3cubmFtZXMgPSBmaWx0ZXJlZFJQTXMkSUQsIGNoZWNrLm5hbWVzID0gRkFMU0UpCnNwZWFybWFuICAgICAgIDwtIGRhdGEuZnJhbWUoY29yKHJwbWZpbHQsIG1ldGhvZCA9ICdzcGVhcm1hbicpLCBjaGVjay5uYW1lcyA9IEZBTFNFKQpzcGVhcm1hbiRJRCAgICA8LSByb3duYW1lcyhzcGVhcm1hbikKc3BlYXJtYW5UaWR5ICAgPC0gc3BlYXJtYW4gJT4lIGdhdGhlcihTYW1wbGUsIGNvcnJlbGF0aW9uLCAtSUQpCgojIyBhbmQgcGxvdCBpdCEKCmdncGxvdChkYXRhID0gc3BlYXJtYW5UaWR5LCBhZXMoeCA9IElELCB5ID0gU2FtcGxlLCBmaWxsID0gY29ycmVsYXRpb24pKSArIGdlb21fdGlsZSgpICsKICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdyA9ICJ5ZWxsb3ciLCBtaWQgPSAnd2hpdGUnLCBoaWdoID0gInB1cnBsZTQiLCBtaWRwb2ludCA9IDAuOCwgbGltaXQgPSBjKDAsMSkpICsKICAgICAgICBnZ3RpdGxlKCdTcGVhcm1hbiBDb3JyZWxhdGlvbiBvZiBTYW1wbGVzJykgKyB4bGFiKCcnKSArIHlsYWIoJycpICsKICAgICAgICAgICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkKYGBgCgoKIyBQYWlyd2lzZSBQQ0EKClByaW5jaXBhbCBjb21wb25lbnQgYW5hbHlzaXMgKFBDQSkgaXMgYSBzdGF0aXN0aWNhbCBwcm9jZWR1cmUgdGhhdCB1c2VzIGFuIG9ydGhvZ29uYWwgdHJhbnNmb3JtYXRpb24gdG8gY29udmVydCBhIHNldCBvZiBvYnNlcnZhdGlvbnMgb2YgcG9zc2libHkgY29ycmVsYXRlZCB2YXJpYWJsZXMgaW50byBhIHNldCBvZiB2YWx1ZXMgb2YgbGluZWFybHkgdW5jb3JyZWxhdGVkIHZhcmlhYmxlcyBjYWxsZWQgcHJpbmNpcGFsIGNvbXBvbmVudHMgKFdpa2lwZWRpYSkuIEJlbG93IGlzIGEgUENBIG9mIHRoZSA4aHBmIGNvbnRyb2wgdmVyc3VzIHRoZSBvdGhlciBkZXZlbG9wbWVudGFsIHRpbWVwb2ludHMuIAoKYGBge3IgUENBMmhwYUNvbnRyb2wsIGZpZy5mdWxsd2lkdGggPSBUUlVFLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDEwfQoKcGNhc19kYXRhIDwtIGxhcHBseShjb250cmFzdF9uYW1lcywgZnVuY3Rpb24oeCl7CiAgICB5IDwtIHBsb3RQQ0EocmxkX2FsbFtbeF1dLCByZXR1cm5EYXRhID0gVFJVRSwgbnRvcCA9IDEwMDAwKQogICAgeSRJRCA8LSB4CiAgICB5Cn0pCgpwY2FfZGF0YSA8LSBiaW5kX3Jvd3MocGNhc19kYXRhKQoKZ2dwbG90KGRhdGEgPSBwY2FfZGF0YSwgYWVzKHggPSBQQzEsIHkgPSBQQzIsIGxhYmVsID0gbmFtZSwgY29sb3VyID0gZmFjdG9yKGNvbmRpdGlvbikpKSArCiAgICAgICAgICAgIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsgdGhlbWVfYncoKSArIGdlb21fdGV4dChoanVzdCA9IDAsIHZqdXN0ID0gLTAuNCkgKwogICAgICAgICAgICB4bGFiKCJQQyAxIikgKyB5bGFiKCJQQyAyIikgKyAKICAgICAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMC45OCwgMCkpICArCiAgICAgICAgICAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAuMiwgMCkpICsKICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogICAgICAgICAgICBmYWNldF93cmFwKH4gSUQsIHNjYWxlcyA9ICJmcmVlIikKCmBgYAoKCgojIE1BIGFuZCBWb2xjYW5vIHBsb3RzIHsudGFic2V0fQoKTUEgcGxvdDogVGhlIGxvZzIgZm9sZCBjaGFuZ2UgKE0pIHBsb3R0ZWQgYWdhaW5zdCB0aGUgbG9nMiBhdmVyYWdlIChBKSBvZiB0aGUgbm9ybWFsaXplZCByZWFkIGNvdW50IGZvciBlYWNoIGdlbmUuIFNpZ25pZmljYW50bHkgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIGFyZSBwbG90dGVkIGluIHJlZC4KClZvbGNhbm8gcGxvdDogVGhlIGxvZzIgZm9sZCBjaGFuZ2UgKE0pIHBsb3R0ZWQgYWdhaW5zdCB0aGUgLWxvZzEwIChlZy4gMWVeLTEwID0gMTApIG9mIHRoZSBhZGp1c3RlZCBwLXZhbHVlLgoKYGBge3IgbWF2b2wyaHBhQ29udHJvbH0KCgp4IDwtIGNvbnRyYXN0X25hbWVzW1sxXV0KCnBsb3RzIDwtIGxhcHBseShjb250cmFzdF9uYW1lcywgZnVuY3Rpb24oeCl7CiAgICBkZiAgICAgIDwtIGFsbF9yZXN1bHRzX3RpZHlERiAlPiUgZmlsdGVyKGNvbnRyYXN0SUQgPT0geCkgJT4lIHNwcmVhZChkZWFfSUQsIGRlYV9WYWx1ZSkgJT4lIG11dGF0ZShsb2diYXNlTWVhbiA9IGxvZyhiYXNlTWVhbikpCiAgICBwdmFsICAgIDwtIGFzLm51bWVyaWMocHZhbCkKICAgIGlmKGlzLm51bGwoZGYpKXsKICAgICAgICBtZXNzYWdlKHBhc3RlMCgiUHZhbHVlIHRvbyBzdHJpbmdlbnQgZm9yICIsIGNvbnRyYXN0LCAiLiBNQS9Wb2xjYW5vIHBsb3Qgb21taXRlZC5cbiIpKQogICAgfSBlbHNlIHsKICAgICAgICBwdmFsICAgICAgICAgICAgICAgICAgPC0gYXMubnVtZXJpYyhwdmFsKQogICAgICAgIGxvd2VyX2xhYmVsICAgICAgICAgICA8LSBwYXN0ZTAoIkdlbmVzIHdpdGggQ291bnRzOiAiLCBucm93KGRmKSwgIlxuVXA6ICIsI2NyZWF0ZSB0aGUgbGFiZWwgb2YgdGhlIGxlZ2VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyhzdWJzZXQoZGYsIGxvZzJGb2xkQ2hhbmdlID4gMCAmIHBhZGogPCBwdmFsKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBEb3duOiAiLCBucm93KHN1YnNldChkZiwgbG9nMkZvbGRDaGFuZ2UgPCAwICYgcGFkaiA8IHB2YWwpKSwgIlxuIikKICAKICAgICAgICBkZiA8LSBkZiAlPiUgbXV0YXRlKHNpZ25pZmljYW5jZV9ncm91cCA9IGlmZWxzZShwYWRqIDw9IHB2YWwsIHllcyA9ICd5ZXMnLCBubyA9ICdubycpKQogIAogICAgICAgIGxlZ2VuZF9sYWJlbHMgICAgICAgIDwtIGMocGFzdGUwKCJwYWRqID4gIiwgcHZhbCwiOiAiLCBucm93KGZpbHRlcihkZiwgc2lnbmlmaWNhbmNlX2dyb3VwID09ICdubycpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInBhZGogPCAiLCBwdmFsLCI6ICIsIG5yb3coZmlsdGVyKGRmLCBzaWduaWZpY2FuY2VfZ3JvdXAgPT0gJ3llcycpKSkpCiAgICAgICAgbWEucGxvdCA8LSAgIGdncGxvdChkZiwgYWVzKHggPSBsb2diYXNlTWVhbiwgeSA9IGxvZzJGb2xkQ2hhbmdlLCBncm91cCA9IHNpZ25pZmljYW5jZV9ncm91cCwgY29sb3VyID0gc2lnbmlmaWNhbmNlX2dyb3VwKSkgKwogICAgICAgICAgICAgICAgICAgICAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArCiAgICAgICAgICAgICAgICAgICAgICBnZ3RpdGxlKCdNQSBwbG90JykgKyBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogICAgICAgICAgICAgICAgICAgICAgeGxhYigiQSA9IE1lYW4gb2YgbG9nMihBYnVuZGFuY2UpIikgKyB5bGFiKCJNID0gbG9nMihGb2xkIENoYW5nZSkiKSArCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZ3JheTI0IiwgInJlZCIpLCBuYW1lID0gbG93ZXJfbGFiZWwsIGJyZWFrcyA9IGMoImdyYXkyNCIsICJyZWQiKSwgbGFiZWxzID0gbGVnZW5kX2xhYmVscykgKwogICAgICAgICAgICAgICAgICAgICAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdCA9IDApLCBjb2xvdXIgPSAiYmxhY2siLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgICAgICAgICAgICAgICAgICAgICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gMSksIGNvbG91ciA9ICJncmF5NjYiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgICAgICAgICAgICAgICAgICAgICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gLTEpLCBjb2xvdXIgPSAiZ3JheTY2IiwgbGluZXR5cGU9ImRhc2hlZCIpICsKICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJywgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTIwKSkKICAgICAgICB2b2xjYW5vLnBsb3QgPC0gICBnZ3Bsb3QoZGYsIGFlcyh4ID0gbG9nMkZvbGRDaGFuZ2UsIHkgPSAtbG9nKHBhZGosIGJhc2UgPSBjKDEwKSksIGdyb3VwID0gc2lnbmlmaWNhbmNlX2dyb3VwLCBjb2xvdXIgPSBzaWduaWZpY2FuY2VfZ3JvdXApKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbV9wb2ludCgpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBnZ3RpdGxlKCdWb2xjYW5vIHBsb3QnKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgeGxhYigiTSA9IGxvZzIoRm9sZCBDaGFuZ2UpIikgKyB5bGFiKCItbG9nMTAoQWRqdXN0ZWQgUC1WYWx1ZSkiKSArIAogICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJncmF5MjQiLCAicmVkIiksIGxhYmVscyA9IGxlZ2VuZF9sYWJlbHMsIG5hbWU9bG93ZXJfbGFiZWwpICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZV9idygpICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBmYWNlID0gImJvbGQiKSwgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0yMCkpCiAgICAgZ3JvYiA8LSAgIG1hcnJhbmdlR3JvYihsaXN0KG1hLnBsb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sY2Fuby5wbG90KSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSB0ZXh0R3JvYih4LCBncCA9IGdwYXIoZm9uc2l6ZSA9IDQwLCBmb250ZmFjZSA9ICdib2xkJywgY2V4ID0gMiksIGhqdXN0ID0gMS44KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBucm93ID0gMSwgbmNvbCA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzPWMoMC4zOCwgMC42MikpCiAgICAgaW52aXNpYmxlKGdyb2IpCiAgICB9Cn0pCgpuYW1lcyhwbG90cykgPC0gY29udHJhc3RfbmFtZXMKYGBgCgpgYGB7ciBwbG90bWF2b2wyaHBhQ29udHJvbCwgZmlnLmtlZXAgPSAiYWxsIiwgZmlnLmhlaWdodCA9IDEwLCBmaWcud2lkdGggPSAyMCwgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9Cgpmb3IoaSBpbiBjb250cmFzdF9uYW1lcyl7CiAgY2F0KHBhc3RlMCgiXG5cblxuIyMiLCBpLCAiXG4iKSkKICBwcmludChwbG90c1tbaV1dKQp9CgpgYGAKCgojSGVhdG1hcHMKCgpUaGUgZmlyc3QgaGVhdG1hcCB3YXMgbWFkZSBieSBoaWVyYXJjaGljYWxseSBjbHVzdGVyaW5nIHRoZSBldWNsaWRlYW4gZGlzdGFuY2VzIG9mIHRoZSBsb2cyIGZvbGQgY2hhbmdlIGZvciBnZW5lcyB3aXRoIHAtdmFsdWVzIGxlc3MgdGhhbiAgMWVeLTUgYXQgYW55IHRpbWUgcG9pbnQuCgpUaGUgc2Vjb25kIGhlYXRtYXAgdXNlcyB0aGUgc2FtZSBoaWVyYXJjaGljYWwgbWV0aG9kIHRvIGNsdXN0ZXIgdGltZXBvaW50cyBhcyB3ZWxsIGFzIGdlbmVzLgoKYGBge3IgcGFpcndpc2VIZWF0bWFwczJocGFDb250cm9sLCByZXN1bHRzID0gImhpZGUiLCBmaWcuY2FwID0gIiIsIGZpZy5rZWVwID0gImhpZ2gifQoKCmxmY190YWJsZSA8LSBhbGxfcmVzdWx0c190aWR5REYgJT4lCiAgZ3JvdXBfYnkoR2VuZSkgJT4lCiAgbXV0YXRlKHNpZ25pZmljYW50ID0gaWZlbHNlKGRlYV9JRCA9PSAncGFkaicgJiBkZWFfVmFsdWUgPD0gcHZhbCwgeWVzID0gVFJVRSwgbm8gPSBGQUxTRSkpICU+JSAjIGxhYmVsIGFsbCBzaWduaWZpY2FudCBnZW5lcwogIGZpbHRlcihhbnkoc2lnbmlmaWNhbnQpLCBkZWFfSUQgPT0gJ2xvZzJGb2xkQ2hhbmdlJykgJT4lCiAgc2VsZWN0KC1zaWduaWZpY2FudCkgJT4lIAogIHVuaXRlKGNvbG5hbWUsIGNvbnRyYXN0SUQsIGRlYV9JRCkgJT4lICMgbWFrZSB0aGUgdGFibGUgd2lkZSBmb3JtYXR0ZWQKICBzcHJlYWQoY29sbmFtZSwgZGVhX1ZhbHVlKQoKCiMjIGNyZWF0ZSBhIHRhYmxlIG9mIHNpZ25pZmljYW50IGdlbmVzIHdpdGggdGhlIGNsdXN0ZXIgY29sb3JzIGFzc2lnbmVkCgpzaWduLnRhYmxlIDwtIGFsbF9yZXN1bHRzX3RpZHlERiAgJT4lIAogIHNwcmVhZChrZXkgPSBkZWFfSUQsIHZhbHVlID0gZGVhX1ZhbHVlKSAgJT4lIAogIGZpbHRlcihHZW5lICVpbiUgbGZjX3RhYmxlJEdlbmUpICU+JQogIGdyb3VwX2J5KGNvbnRyYXN0SUQsIEdlbmUpICU+JSAKICBtdXRhdGUoc29ydGJ5ID0gLWxvZyhwYWRqLCBiYXNlID0gYygxMCkpKnNpZ24obG9nMkZvbGRDaGFuZ2UpKSAlPiUgCiAgdW5ncm91cCgpICU+JSBnYXRoZXIoZGVhX0lELCBkZWFfVmFsdWUsIC1HZW5lLCAtY29udHJhc3RJRCkgJT4lIAogIHVuaXRlKGlkQWxsLCBjb250cmFzdElELCBkZWFfSUQpICU+JSBzcHJlYWQoa2V5ID0gaWRBbGwsIHZhbHVlID0gZGVhX1ZhbHVlKSAlPiUKICBkcGx5cjo6cmVuYW1lKCdUcmFuc2NyaXB0SUQnID0gR2VuZSkKCgpoZWF0bWFwLmlucHV0LnRhYmxlICAgICAgICAgICA8LSBkYXRhLmZyYW1lKGxmY190YWJsZSkKcm93bmFtZXMoaGVhdG1hcC5pbnB1dC50YWJsZSkgPC0gbGZjX3RhYmxlJEdlbmUKaGVhdG1hcC5pbnB1dC50YWJsZSRHZW5lICAgICAgPC0gTlVMTApoZWF0bWFwLmlucHV0LnRhYmxlICAgICAgICAgICA8LSBuYS5vbWl0KGRhdGEubWF0cml4KGhlYXRtYXAuaW5wdXQudGFibGVbd2hpY2gocm93bmFtZXMoaGVhdG1hcC5pbnB1dC50YWJsZSkgJWluJSBzaWduLnRhYmxlJFRyYW5zY3JpcHRJRCksIF0pKQpjb2xuYW1lcyhoZWF0bWFwLmlucHV0LnRhYmxlKSA8LSBjb250cmFzdF9uYW1lcwoKCnByZXR0eWNvbG9ycyAgPC0gY29sb3JSYW1wUGFsZXR0ZShyZXYoYnJld2VyLnBhbCgxMSwgIlNwZWN0cmFsIikpKQpjb2wuYnJlYWtzICAgIDwtIHNlcSgtMywgMywgbGVuZ3RoLm91dCA9IG5jb2woaGVhdG1hcC5pbnB1dC50YWJsZSkpCgoKIyMgTWFrZSB0d28gaGVhdG1hcHMsIGFsbG93IGN1c3RpbWl6YWJsZSBncmFwaGluZwoKaHIgPC0gaGNsdXN0KGRpc3QoaGVhdG1hcC5pbnB1dC50YWJsZSksIG1ldGhvZD0iY29tcGxldGUiKSAjIENyZWF0ZXMgcm93IGRlbmRyb2dyYW0KaGMgPC0gaGNsdXN0KGRpc3QodChoZWF0bWFwLmlucHV0LnRhYmxlKSksIG1ldGhvZD0iY29tcGxldGUiKSAjIENyZWF0ZXMgY29sdW1uIGRlbmRyb2dyYW0KCm15Y2xyICAgICA8LSBjdXRyZWUoaHIsIGsgPSA3KSAjIHNldCB1cCB3aGVyZSB0aGUgZ3JvdXBzIHdpbGwgYmUsIGNoYW5nZSAnaycgZm9yIG1vcmUgb3IgbGVzcyBncm91cHMKbXljb2xyICAgIDwtIGMoIkdyZWVuIiwgIlJlZCIsICJCbHVlIiwgIk9yYW5nZSIsICJQdXJwbGUiLCAiUGluayIsICJZZWxsb3ciKSAjIG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoIGFzICdrJwpteWNvbHIgICAgPC0gbXljb2xyW2FzLnZlY3RvcihteWNscildICMgcHVsbCBvdXQgdGhlIGNvbG9ycyBhc3NpZ25lZCB0byBlYWNoIGdlbmUKbXljb2xyLmRmIDwtIGRhdGEuZnJhbWUoQ2x1c3Rlcl9Db2xvciA9IG15Y29sciwgVHJhbnNjcmlwdElEID0gbmFtZXMobXljbHIpKSAjIGNyZWF0ZSBhIGRhdGEgZnJhbWUgb2YgdGhlIGNsdXN0ZXIgY29sb3IgZWFjaCBnZW5lIGJlbG9uZ3MgdG8KCgppZihuY29sKGhlYXRtYXAuaW5wdXQudGFibGUpID4gMSl7CiAgICAjIyBNYWtlIGEgaGVhdG1hcCB3aXRob3V0IGEgY29sdW1uIGRlbmRyb2dyYW0KICAgIGNvbC5icmVha3MgICAgPC0gc2VxKC0zLCAzLCBsZW5ndGgub3V0ID0gbmNvbChoZWF0bWFwLmlucHV0LnRhYmxlKSkKICAgIGhlYXRtYXAgICAgICAgPC0gaGVhdG1hcC4yKGhlYXRtYXAuaW5wdXQudGFibGUsIG1hcmdpbiA9IGMoMTUsNSksIGNvbCA9IHByZXR0eWNvbG9ycywgZGVuZHJvZ3JhbSA9ICdyb3cnLCB0cmFjZSA9IGMoIm5vbmUiKSwgUm93dj1hcy5kZW5kcm9ncmFtKGhyKSwgQ29sdiA9IE5BLCBsYWJSb3cgPSBGQUxTRSwga2V5ID0gVFJVRSwgYnJlYWtzID0gY29sLmJyZWFrcywga2V5LnlsYWIgPSAiR2VuZSBDb3VudCIsIGtleS54bGFiID0gImxvZzJGb2xkQ2hhbmdlIiwgY2V4Q29sID0gMS41LCBSb3dTaWRlQ29sb3JzID0gbXljb2xyKQogICAgdGl0bGUobWFpbiA9IHBhc3RlMCgiQ2x1c3RlcmluZyBvZiAiLCBucm93KGhlYXRtYXAuaW5wdXQudGFibGUpLCIgR2VuZXMiKSwgbGluZSA9IDApCiAgICBwYXIoY2V4Lm1haW49MC45KQp9CgoKaWYobmNvbChoZWF0bWFwLmlucHV0LnRhYmxlKSA+IDIpIHsKICAgIGsgPC0gaWZlbHNlKG5jb2woaGVhdG1hcC5pbnB1dC50YWJsZSA8IDUpLCAzLCA1KQogICAgbXljbGMgIDwtIGN1dHJlZShoYywgayA9IGspICMgY3JlYXRlIGdyb3VwaW5ncyBmb3IgdGhlIGNvbHVtbiBkZW5kcm9ncmFtCiAgICBteWNvbGMgPC0gYygiR3JlZW4iLCAiUmVkIiwgIkJsdWUiLCAiT3JhbmdlIiwgIlB1cnBsZSIpCiAgICBteWNvbGMgPC0gbXljb2xjW2FzLnZlY3RvcihteWNsYyldCiAgICAjIyBNYWtlIGEgaGVhdG1hcCBvZiB0aGUgbG9nZm9sZCBjaGFuZ2VzIHdpdGggY29sdW1uIGRlbmRyb2dyYW0uCiAgICBoZWF0bWFwICAgICAgIDwtIGhlYXRtYXAuMihoZWF0bWFwLmlucHV0LnRhYmxlLCBtYXJnaW4gPSBjKDE1LDUpLCBkZW5kcm9ncmFtID0gJ2JvdGgnLCBSb3d2ID0gYXMuZGVuZHJvZ3JhbShociksIENvbHYgPSBhcy5kZW5kcm9ncmFtKGhjKSwgY29sID0gcHJldHR5Y29sb3JzLCB0cmFjZSA9IGMoIm5vbmUiKSwgbGFiUm93ID0gRkFMU0UsIGtleSA9IFRSVUUsIGJyZWFrcyA9IGNvbC5icmVha3MsIG1haW4gPSBwYXN0ZTAoIkNsdXN0ZXJpbmcgb2YgVGltZXBvaW50cyBvbiAiLCBucm93KGhlYXRtYXAuaW5wdXQudGFibGUpLCIgR2VuZXMiKSwga2V5LnlsYWIgPSAiR2VuZSBDb3VudCIsIGtleS54bGFiID0gImxvZzJGb2xkQ2hhbmdlIiwgY2V4Q29sID0gMS41LCBSb3dTaWRlQ29sb3JzID0gbXljb2xyLCBDb2xTaWRlQ29sb3JzID0gbXljb2xjKQp9CgpgYGAKCgoKYGBge3Igc2Vzc2lvbjJocGFDb250cm9sLCBlY2hvPUZBTFNFfQp3cml0ZUxpbmVzKGNhcHR1cmUub3V0cHV0KHNlc3Npb25JbmZvKCkpLCAic2Vzc2lvbkluZm8vMmhwYTJSUlNlc3Npb25JbmZvLnR4dCIpCmBgYAoKI1tSLXNlc3Npb24gaW5mb3JtYXRpb25dKHNlc3Npb25JbmZvLzJocGEyUlJTZXNzaW9uSW5mby50eHQpCgo=

Privacy Policy

Terms of Use