Record audio of unknown length
-
Hey, smarter people! I'm trying to script something that's sadly a bit out of my skill set. Here's a snippet with just a momentary button and a noise generator:
HiseSnippet 1490.3oc6W0saaaCElx1JswscasnWrKEJ1EtCEtVNosqXXnNwItyX0oF1YA8pUvHQaSXJRMIpl3VTfdwtXO.69c2dN1qxdC5av1ghRVRwt4GuzhcwRAJLOGdH+3gemOdT+.gCILTDfLpt+LeBx35lCmwkSZOAS4nt6fL9Lyd3PIIvRaZ6Y93vPhKxvn7SUFLVuBJ9u2+jswLL2gjYBgNPPcHOi5QkYV625GnLVGrKYepWtYuYqtNBdaASDA3orYCjO1YJdLYOrZZkLQeONbBx3qM2nIdiMd7iZzz1dziZ9fQ11Md3F1ivaZCdZhIMebSrMQgj010kJEACkXIIDYTYag6rgSDGw0avAzP5gLhZfMZHryZycDLW0QT8aT6ITla+zDUHBYX1OKsUVm1tsYOpKct8rz2WD6vJKh7IPiREgW4Bvy9CAuk.IibPphFR2zbnS.0Wl4QgmqY1kC2livP1IOTzyEU52LLaKfYvk08vSIcBfAyin1Caz3dVv+c2usZU3tJTZ8Jbf0.hiHv056rRibLQ1V34K3vfZ2Q69NpXpR4LJmXMJh6HoBtkfq8phLPvp4jF18fUlEQta02Tc86e+sbcslAzBKmnPovyhIFScrlPBH0qWu5agU9z255gJywaQaLicHvqpchsFfWNTsmPRdNuV71W8sUsNoqQiVpuj0hQBVpaEeO3zBrFOx6PRP9CuZhvcZQhxZmOhhiNojahBdWNU9beRx3Llt8RnUnjrphfkfPXpxX50mkPu1NRJEbDEVjqZpynnXzC0IFw00+X2cvRb5Z.KGrE9j.IUcRL1g7JPhPSYW2bGR3TovOdtI2hHiqb163wykQdGt0rLMkep0QTW4j4F9yfVSHzwSj4sPC6I7fcBG.QZTBsXsDTEKbiXXYwRak.XhC3ZrP8jplgGRkyxKPdx58Je3qwFKUNZoWRmS3dSy9Toyjki2RKAuvM1Ga7lnddCycGMh3Hy.aEyNu3TkJqb9p.NCk77xllZrTMgkA6uBHWOYnUmWXW.P6E4sUjKUzgxT3wzPQ1STQM9Uyrha+.hONfrunOCOqVH1ymQF.Gh6YcHS3LcH80jEUD703Za0Lp4LAy4DV3pHbr1kzKLnAhHIkOtGVFPgpMS37ODTjcHsSPmJGTRoYnG2Hs9eHg6FO3ug+RbZOOgANsSclI2f1iHORDLM9NJ42fNf5BopYPbIOI.sEiINRoSPSHzv0Rrs9B1L+IBN0QYROiTbtkmHRIpnAKzQw9XJSUALLJDjEceNeHL431XLJe.IHLdguhYi5v+fJh8Dtp9J5fcfz5r9Xk3xMMUJs.2kDT2YNGNGRKPbh6lImS0Jl10iNkAH1KV4C54wnbN4RMiUMBpSKo4mcCOP40AyPGn0cgSlZM0IOMbUS8FlifS1K8AZHrqEN.2BN.vao48uHjKF+EA0JW.q+3z2AxU3jeDTU2k6RNNcA2EnztP4abXIbjdT9A4ecoG93BiQ8wA.ZgFVTqck4ifqvrPyT3xBetsVCkDeUUYdk6gSIGoyX4sp6OVUWq5nnmJUuvNrCYDNhIWvN5hCM.FWHnsF7.kbAH89mrbH89mbFPZyVK.oV+9RxVPU8GDRet4.gP1If7yQPM1rSfs28lVKEafczkvMYq+50+xojttloBWCTRIqRNSwy2VHl5gi0sVo1dx+13U0Nuh4dBZHIVQ4V5ea8TBnzndc29x36w7O2eOlQ4U5Q3hsIka9K4E4Jer91pOo8Z8uu0vKmOEb8TLNjpDf2k+JBCHgIjoDNcp0hjodBtH8MzL9y.B77+3wjhEOK6.skTBZhYVtcqADFAGlQv9p+n0yfmLwAwBmezyEm180WZpgqkpBv5+ao++ZszeAfxmh9T+TrGdXm.wKczs2q3xWM1Bbt4wcistYO0XK6zu1N6N1CTEeoiSwkZg.atpAtwpF3lqZfOXUC7gqZfOZUC7aN6.UOZsUjT3oKYgVW5uqtEWic4XfwGWcf9G70lSWM
What I would like to achieve is to record the audio buffer when the record button is on, and then use that as an external audio file in scriptnode.
I was hoping I could do it with the recorder node, but unfortunately, it needs to know the length of the recording beforehand.
Any help would be greately appreciated! Thank you!
-
You might need a custom recorder implementation. I'm not sure if scriptnode has one for this. I can create one if it turns out there isn't
-
@griffinboy that would be amazing, thank you!
With a feature like this, one could create so many things, even a mini-DAW in HISE
-
@tomekslesicki The way I do it is from the
processBlock
callback of a scriptFX (note that you must not create a scriptnode graph, otherwise it overwrites the callback, so you need a script just for that purpose)HiseSnippet 1921.3oc6X80aaibDmz1LIR2eZyg6g93hfVT4jTcRI9bRf6cQ9uWM5YGAKWiCvv0XE4RoElZW1kKsstCF3dnOzuE8s94neU52f7MnclcIMIsTbr04KEEn1NAbmcFt+lYm42rK6pj9rjDoxws99iiYNterWuwB8v0GR4Bms2vw8S81glnYJhUzZiioIIr.GW24+FTfasEbL+71WuFMhJ7YEhbbNPx8YeKeDWWHsam+HOJZKZ.ae9nRZuTms8kh0kQxT.Oy60xIl5eBc.aWJp1bdN+AZxPG2G605KWlwdwyCCBnO+4AKu7xu5kuZoW0lF1ZIZ+1K+pkd1Ru3Yu7EgNt2ay.tVp5ooZVhi6BqICF2an7LgcANfmv6GwvAsc5AqrU7Vxn.zEQoNqOjGEzMOPk33350sHrMuMr84d6vC3WJuH78KMSPJrnb.zctpva9JvqcY30pD7lBjbKAoErP5gd87U7XcwLHd9HusEvtYHE1mJCEqtNy8aVvacIngP2bD8D1VJXvkVzX4VsdJA9uEWodcXuJQSNkpH6w7kp.xWQxsb.SutbTrT.CZ7H6zOBsYPjrOMhL3XUtIgznD1JESP88SGkFQgnBL6gGAFoXCHxTcbpdszvPlBDUuNWDwELRXpvWykBhTXWFDBJYTC+70+o.DiRYKV+GpWqz5ZDtR8Z0qwCIMxToFnSMS9eSZPvtRM6MhFsAOdI6+P+9pJDFlqQ6VsLQlZWTuFC7J6qCWQHPoR80PvbzpE9WCqtW.9y0G3ZlfhM905znn9PUQiq3uKZBJSDUttEGCHkCqPPw9PSeECxGaTYynYDSLPOj7XxlhAvZfP0pdO92yZr3hlXYHrq0nOgKptSlEYij9vdb+i4AmCKV0WOWDvN+MgM5aBwveewWPDRMIVISCHZIgC4f.pHxSAnxn9CIIzQwQLR+TMYaxP5oLwuUSBkoh.BkbFcLZ0iTL.h6KeD4rgLAQSU.tASLNLOgzmOX.7jdHECVfPFPf0rYS..Feg+UsVgv+88ybe34m7DvaLtSl+X8FqW8XRtljmP3nmTIDeHnyQnxGxOBm7BStBlWVNT3GwnljiKJkcmkLZ10peQcxUmBRCm1bYoGQL0TmFIfUWmgMDoi5yTkKhPEARlpLWdualqxDq9177RJJEaK352DyDuK5VmrhCjkKCUfpZCG2mlwwsVpVKENbfJ6Ad1BCGChK2Kx4Os8FTMM+8.uRXYhYJMG8.2MXmB8prbm071fkbhVFazMqfD5l79W0yubE+QZmwEK+etyY7.8vKE7OUcFx3CFpKKwYRVbn+gLvlXTtoB15MaBX+pBSNxVKR35wkaMe0NMKby5zb8MBuov8gdc4Z+gSGuyME7BaQ+bi2r91eh2lPgout.rK3s02MqMoae8Momax3U8rTIXMsQJaZDWLHqg7z5QehqmsqX+nUtrjMVwhoJ19xtQzwMrbi6AH9ofVR+SPVZS4a+Hj.JWzJUJ6is3aMb1F9.mn.5iYrBaRl28LiMGHnowPcKx1JXmQXih0iyoVoZfSkQvYkglGKwvAFWkwKNMYXipMe5GsXoNA9x3wjPtBNvQFr.44.7vVGQ95utZ+jCmVyqeW6ircbuULcd2Qa+N6AsBfM1cnZEGnI71McTO3nt9r0ybDPl6bHgmcbKbLVLzCBilA+a3mrIaiicylrc9jEbkyDYW4BDuolf9wYCIa8csqjaBNypoAb4V7HS+.K1rIrt+MOxsNO8FlXdK2Lu2+atYtKSelTch4j9YO63debCotmsnjobVMJRdF1shmwxBaKFYckQiiGJEbeTjUibbt5H3.S5bvBWvZeJOBok6klfE2uQzCT1bqN24OfoRLu3660pI7KPosqL.l5daQ8gv53tTrE2C8v97.gJVNeIwZIjVIwwb4tRShuw7KAZCY.hGY5+BWAzc9R4w168fiflGyYyO2N4.bV3jYNGXOA.3Y36zF7rvEU8S7BAO63XHMDV0JNvmANfh0r77SB4p1eaPMNEj0eddAZoBmxiflDaimJN+EtIjRG.s2LlkkirCWj4kVc1gddkwNcoJ.svYmw28BWNB1BKLsnsag4WJqSOMKFqJKebhdmvNyFwJK094Bv5Z7JJ6fg5IVgMXgzzH8Dxct8PCfwsBZ2CN0jdBH81WOcH81W+dfzRcl.Rc96SIZAU0uSH8K71SJgqlw9KoPM13qfse7G5LUrAxctC1I67u99+50Dt9HODW6gTIyRLCyyWSJOYD0va8StezCrSdeuck7DlgQ4yrOS9Fl.uanT09t3ySEei+7TtyeiOj5s3qKsvOWecoOnm4+m9UTta9XX0xwXONx4to3TVDj2kk+jkFmKsZ9yNRgLusYQJydLniO9QCpTuLMGZUsFnAKj74c1iAWsOoHm5W+O57sPWRpxvUNawh125OL3T2u9UdV3Rvjdx++pk+W4pk2MP4CwQS+PrFin9J4w91Szi4xOvHA7ag4.X071AGSZO4m5YDvJdrue0W0DF9rY0vmOqFtzrZ3WNqFt7rZ3KlUCe462Pro0poZ4HaIKbZktaZOUq6lBJjwapNb9OKp.ZQ.
I am not proud to iterate over each sample to reconstruct the final buffer, but I haven't found a way to
referTo
when target buffer is bigger than reference...
Usually I do the opposite (I know the length of my recording in advance)
So if someone has an idea how to copy a smaller buffer anywhere in a bigger one!Now, there might also be a solution through scriptnode, but I have no idea and the "full script way" of the example isn't hard so...
EDIT: We need a
Buffer.copyFrom
method -
@ustk thanks, I almost understand the example ;-) Could you please help me out to get the output of the buffer into the file player in scriptnode?
-
@tomekslesicki when I call
inline function reconstructFromAccumulator() { outputBuffer = Buffer.create(g_accumulator.length * Engine.getBufferSize()); for (b in g_accumulator) { local b_idx = g_accumulator.indexOf(b); // not proud to iterate over each sample but I haven't found a way to "referTo" when target buffer is bigger than reference... for (i=0; i<b.length; i++) { local idx = b_idx * b.length + i; outputBuffer[idx] = b[i]; } ScriptFX1AP.setFile(outputBuffer); } g_accumulator.clear(); }
an object gets assigned to the file player node but the waveform isn't drawn and it doesn't play. I guess it's something obvious I can't get my head around...?
-
@tomekslesicki That's because
outputBuffer
is not an audio file yet, but just raw signal data in a buffer.
It has to be written in an audio file prior loading.
You should be able to get this done using theFileSystem
to create a file at the location you want, andFile.writeAudioFile
for dumping the buffer into it.Now, I wonder if this can be done internally using only a registered audio file or if it has to physically live on the hdd. @Christoph-Hart ?
-
@tomekslesicki here you go
HiseSnippet 2436.3oc6X0saaibElx1LIV6OsYwdQubfQApbhqhTrWmD3lD4e23tw1BVtFKfgqwHxgRyZxYXGNzxZCBvdQunuE8t9TzK5qReCxaP64LCoHkshisa1E6BTmXCxYNyLem++F1VI8XIIRkSkpGLLl4T4Sc6LTn6udeJW3r8FNU9b2cnIZlhXGZsgwzjDluSkJS+03.UlcFGyOu6kqQCoBOVwPNNGJ4drWyi35hQa25a3ggaQ8YGviJI8Rs11SJVWFJSA7LsaCmXp2ozdrconXS457JZRemJOvswWsLi8jEC78oKtn+xKu7yd5yV5YMoAMVh1s4xOaoGuzSd7SeRfSk6roOWKUczTMKwoxLqI8G1oubfvd.GxS3cCY3KMc5.mrc3sjg9nJhi5rdedne6bCUhiSE21ElsoslsuzcGtOez3EluesYBRwJJa.qL03va5wfWyxvqQI3MAHUoDjbsP59tc7T7XcwLHd9D2sEf2LfB9oxPY2znUS84xs3gHRbqTA7H1MvYpu4dtqKgkIz0inmx1RAuLZapsbiFKPf+L+JUqBNvDM4LphXW6VeaSxyIlPp58XZyQzgFEGxFAqZyYEk.xNGrGEaAMnSnTiqOeuFsGHLqcgSbelmT4ChmiUP30kQwRA7Rs4rSimP0dgxtzPRuST4KIfFlvVoXBpmWZTZHEbNvrGcLrHEqGQlpiS0qkFDvTvPUqxEgbAiDjJ7zbofHE1iAgfRFVyK+7W.fXXJa9puo5rkNWyfqTc1pyxCH0xDYVPlYs1Lpu+tRMaOQslfMdI6undeQABBxknYiFMrR.+WwzoJA7xawy3QOhHjDAi4SzRhmhAgcDJI.LlDplffEeTCok0qW2howrE0CYhd59jW.Xvr6FquJ0SCwDQqVHXM..uErPWsqndBNrwRsNMLrKjtW6BVv4Ml4KYmupSFMwfltMYfLMzGTLsh2MEzTceFIg+8LRjTAOw7RUrvgKPfIIAfi1LODeSjAlmYmahTMlhxddvuYent0DNYazCHaJ5AfF0cq3cfyt17yuRlq.0gntnZA5N.BTjDR.nNjxgebLphQ5x6kIS0YQvVqKNyXmbVjSnzChg6dB2+b.oiiMtvmc9dA05lGf.3.TUzbz2Xs5hADCnCw.jzDVthpXveOPVad3PgtATezF0k5GNjvg5.TMW.YGmwxMhncKwX3rfk+7FqP3+gtYFG34G9PLBBwaFfsv0B6GPxkj7PBGg5XNfi.YNFE9H9w3jusH996RgpAcYdTD7CXDOpv5f6xnFaYDXB.PBg6fFBZK1aiIWvfaaZIpJI1RR8oIYhEI84Able0LzFIExCjcLKFqPTFdKLVchiy82dgLpvDnIXmqMYYXsfxtGTDStCrB14wRkdUg+qkT+hhdkOXLIq5DyOdOKlhOsAUSySRnwwLi8vl0mnAOGpwXIAAz1EeFhegXhTA+ujxLSjaCFIzyIy8ps6r4IPl6IyAdL3DLg8cFBV2HrK+NIPnyCIyUe.8r4xMHwJVLUYyKMHyVIBbR3HwJ42w7vLSnYrZzYBGFpJ1sFODSyZUsRCVzHadSgGraoQ8yALZfCpOPAgtSv1rPoDWaup8wj74Wf73kFk7xEfiLxl676R.6ifMHy3js5vxV9DncorsD5HLZGv4skXCpySLPXdLkv10yrbyfy8l16u2eby0O3js160ar49uEsvA00PLfBBUgUuUtZUDOTsTGorFHFWNLO4hSAsNlzbYEfCYpINM5UUW0BqIRi5hICEM9PAARXiS5w88S5oLmLOamjRBJEaK358f.32GSMmr1OHAoLTAhpMzi97L5Qqkp0RgCGXAcOWaqGGChKSi04OsMFYjuOvVBGSLSo4nFTYC1Y.MWKsqYc2fkbpVFajMqkGPD8CepmO5D+AZqgEG+et0.tut+nA9WpV8Y7d80kGwoDAvYrHAndJ8sEVJyGEYsmMA3uFiDHxoSjv0CKyp+iFI0qKDuuaat1q+jw3TS.ifa4GCLlQs+yb2DJi6oK.3Lta8s+HwiepKaip5lS+My5redWpL54kQRNi86NkqkwZ2vUFkZlUu8.Y6P5vZIiJsAMHghqmhzSLoocCwdq4CsxEaRoXIL0YrRa.zudwFjGUZaVgXH3XDDlC3ZgcR..bFjMX4eAjdfJ5FfYZGO.GB3S4ODZ6d1n1.1FC593LjZiy6BpWVtzSr01sFhhZd8oBAKLwnQVhr116YrjJZ9Yqcyhh0CyXXgjgMD.E94bAKY.fEOtAINMo+EPV2v4KwvxSFODZNn.pIYvBFOGfG03XxKdw37zNZRLJ+8MO1Pj+lUs08ZGZ17pyL1GH0.Ac6Pg1NPoJW3Ficfap6wVOSQvaMNEVz09dC7cL4rCXFMu7efexlr4nqXBS1Lexh502pBtNW9RvWH44ScKtq4095uU9atjabNz0Lv7F5LuyuLcl6xzCjpSMenhrmcpbWzgT00lTxTNqB0CFrt4Jn1p9fawLVaY3v39RA2CGxJQNNWMRlhsWsf8UzjCn7PrMQmzDL4dOQGjbD9QopL8gv8qLa7ccaTG9GTtcWoOL0c1h5Al0gsoXa166hbMfh8X57nh9kP5XANluMUoIwcL+aXYMY.hiLb.lxE7Gkhise1F7MnY1T13ysSNDmEn55bnkEBnY3dZMdV3hh9YtHayShgvP3TGSA9BPATr5kmubGTKjGe82DTiSAQ8mmmfVJwo7aPCrswaalugaBgz99LeyxxhQ1gKxzRqL6POu38+I3RaSU.ZgK6f68LidCbgEKsfFPwxGMVK3lRwXVYYJMcNkMvZwJOp8qch403GhXGzTeoSXCV.MMTeowct4PCfwMBZ2AXtouDjd2KmLjd2K+.PZoVWBRs96SvZAY0uWH8qb2WJ0aoXvMCEdCu.19g2zZhXCF24ifmr0+96+qWg45SbQbsOVJ41Xyv370jxSinl5V+O2O5d1Iuq6tRdByTQ4KrOS9Zl.+BJRUyOFec83q8WWuxzW0GGu4s7iiOyO6933+B3pQi886mMGic3Xc1MEmwBgXsrXlrP27QGOlYGoPl2prHLYeFzkuWO134HSRgVUqgReEi7ks1mExnIEwQ+1+QqWCcFoJS8wamsn402VbU9qeiqEtDLPm7+uR6OOuR6OITM+o3LhndJ4IdVF5Xb58Li.5svPnZV2cv2IMu7mOJBpxchm23a0kV3iusKbwa6BW51tvu51tvkusK7I21E9zO7BwlPqlpkQ1TSf8Q6MsrTqrofBQ4lLBm+KKIRO0
I improved a few other things as well. There are still some flaws but it gets the job done
-
@ustk Epic, thank you! Your previous suggestion got me to where I wanted to be already, but this improves it further :-) I really appreciate it! What should I modify to get a stereo input?
-
@tomekslesicki said in Record audio of unknown length:
What should I modify to get a stereo input?
just push a second buffer in the accumulator
g_accumulator.push([Buffer.create(bl), Buffer.create(bl)]);
then write the buffers
channels[0] >> g_accumulator[g_accumulator.length-1][0];
channels[1] >> g_accumulator[g_accumulator.length-1][1];
and modify the loop in
reconstructFromAccumulator()
to account for this 2D array -
@ustk sorry for being a little bit immune to wisdom, but I got stuck at this part:
and modify the loop in reconstructFromAccumulator() to account for this 2D array
Thank you for your patience!
-
@tomekslesicki try to create a blank project with a simple 2D array and iterate over it with imbricated loop (you'll find a lot of content for doing so)
Once you get that done, we'll try to integrate buffers -
@tomekslesicki Alright so I updated again
- Stereo recording
- Dropped that nasty sample iteration for a real man buffer reference copy (15-20 times faster)
HiseSnippet 2924.3oc2Zs0TajbEdDvXao8RVuwOjG6hJUEgWhPxvhsKp0V.FrIgKpPrd2sbQnZMSORSXltmzSK.YWtp8gjpxa4mPdK+N1eIoRdNu3WxyImS2yMcwXff2DGvf0b5aem6mSOzRJbXwwBoUoJGLHhYU5isaOfq5sdOpO2ZqmXU5Ss2gFqXRhgzZChnwwLWqRkl9oHgRkmwR+0ad7Zz.J2gkSxx54BeG119g9pbpsZ9q8CB1j5xNvOrvrWp4VNB95h.Qe.OSaW2Jh5bLsKaWJNsorsdFMtmUo6ZW+KWlwt+hdttzEWzc4kW9gO3gK8vFTu5KQ6zX4Gtz8V5926A22ypzM1v0WIjsUTEK1pzLqIbGztm3Tt4.dterem.F9PCq1vIaHuoHvEYQjp0587CbakJnhsrJY2JWrMsQrcG6c7c8ynmK99L8.j7UTT.VZpgg2zCAuFEgW8BvaBPpTAHYafzssa6H8iT4if34ir2hCZSOJnmJBkc6GtZeWewl9AHRrKUBzHlMvZputh85BXYbUsP5wrMkvCYaS0kqWedB7q4VoRkEtakxGzyOlDy8ihhXJheXT.KDVZLgRPCIlfPwShHYNBoKShqfQ774zfjQf0epzWAGHQAyFFKfQnbWRf.rZbI9bjLmnQLYagHhzJfN.1p6tPkJfQTrhbBURL3eyusA4qHZy5ZcYJ8hZSQXkIZpNqYpDXtyB7Q9VP8ZGHT35S2qr8.EUU0bc9z2WySvzSkWvjWWDFI3vCUm0LLdBUpzMPzA33tGISWiGMHlsBYgEHJPfDY.2ZABmi0RDpuxm2k3Ijv3.Au.Z27cg53zOre.ELmfs5EGp2mSAGMRGFHpiYxS.IGtXJYw5wLGR.i2U0CDlvQwhnR1ABTJhhbfvI.fIz.3zo5iUIDjv9N54ivynoT8jLpKoJUAaGDmPe.5suVsZyAbYEedfOGTu84NJeAmH3Fg.JfjhfpNoRm4AAXPe1bUdUkxEDJZhqTobkx9djpISoLLmxFMJ00cWghsGuZCvJbIyOnVYzI34kNiF0qW2LC3eRlpujCO75JkALEKBX0hUToZMF2oWHUdb04zGOHN4BBmARQPB4.7shkYapHHefeTAwz.d2.2gTK0RD3OBfm9f0lMx9NJvgJb07IVMAa4vQDMBZdMXAc9lX0hQxZY75fZrCDJs5HxdsY33ZnyCXnxADDnCaB2H7zlCEceQQRkxnkS.IFTgSTJbWxF7tv4hves9ddLYa+Wxxk0I1j4AM5nmDoGFaVlt85C7ITEssYRfkuYypYTPUimadxnTNL8L7gEgZQwILolKRiOkC2JkQK5pfkMX2ODijXElvlpi7cOaLd0m6xNaOOX4yo8G0OmJxb5KknSVGzCGY9TVLEERIcfwHEkGTeItRybhAhZf0AwEr8vyHZRfSmDzDqxfPGCBhEfhySsfzuaOEt.7GLRAX4Bg1Qwc.jxFLBfSAr4XonMAav7NkBfFbAvPzLSr3pEi9f6OA9e8QLOwCrgHw53sD.UyS38CMgeimqVNjUrvHihBvchFSChCDUGQK+BM6c37oR86R5jXUMe1mztPZlqC4QOpvtqkB8fsQyJIrflCyYYiH.DU9JBXdFSl0QD4ybmEY6rfeEL6RDNz9JQHDtD3m.Ty8ZcTEsolCDdjqiNxYmozQIvvbEMVvoHSb.XmEIjpU4taCY7xy1Lx4By80UlnO76Z8oNxTHGMjWE4IDRPfuvHjIQWXNT1E9YPB.lE849+t9rg7sylzWQl8Ya0diifnKGMK4KHvIn8qaO.LkCwp71It5bv.yV6T5IyNlKNf.ilHOwhNrZhhAxD9aYNXtkht9dvwhLk4PviSW1lrZAh4kzLmNLIV2jVPjBcTZ6USe3SPJMegXTFS18wHHPHk6sTVfJeNnUCQfJY+BrHGN6zDwTxpCJpChgBmDsDPlurc.G2juvqlerFBygNzlZOzKWSb1W0Z+89Uar9AGs4da+jM1+0nr1qlRzVIgTzvp2LksxsLpTHyaRhRsxGFmL5PPJxIMVR5h.lbhCi5W44svpfGeGlrXBdbhP43CW9q8au72hUm6Xx6UXhB9Vbe0dfo7aqlcqjjkXoxInBlpRWn7mlTn7Z8UJA2xGpG9V1lDkVZDWrgFqudKzxHcefsDNlHlT4ibPomvNABcXJ.ur8SXwGC4t0yMIAMzRx69TOK6D+dZyA4G+uo4o9tpdYD9AYydLLJaQJVEZEXFCRflPDtlnLE6LA6eKY.PeMT6.X087Xe0fh82cs0txEEh21tkuxo2jw3TS.ifZ48AFSZx6Sr2.By6nxA3L1a9sum5napwkQUrSaBIQ5XLW.W+jF0Jhjrd2lxtREIqKTlwJYtlCUve03rPaymWLh1MsS.DjMizJilwJoshBa.jKdw5jEJrM57sISLowiBMXDJv3+IcYHvv8Pozmhjv9JFP5QOgM4NNFtnNHdYwPOE6cppSOJmyBh0bjopbS2EIUvkmFzD6FJUPMHKktRe13nIEBMTwgiHPh5G2q5HUf1IXrRPARGl1+AVafHZ.IEk.ozO9h5Gh0tLzQ7hIUL8urwgvbWo3RabIVZiC0s+b4hcaegMzab99Y6K5iMXtCERhAA9r2EJOTzW5vVOgWvaiXJLDt4453ynqdaPone3eAekLXirqt.FrQ5f4Q+uRgusF+xUFwU7isyu+fK70pT5OZStzdjWPy7Kox7FeXpL2koNUHOVeAXIe1pzMQERE6zaWxZUH5xoqq6N2jCATKZZsDACh5I39NHIyLRw4pgh9XxZCXeFM9.pe.lzoc+XLTwd71XoV3kcVZ5mC8io23aZWuF7MD7dWgKLzM1j5.h0AsnXR6aaiUt.oNv.AYoPJfzgLbz24YgAwcL8tQMhL.wg5JJlxFzGEriMWGH9DjZbJi84VwOGGEJb154lZZ.NC2Sivy.WbpehMV65QQ56SyZHF3yAFPxpUb7h4iMPd30eYPMNDX0eVpCZAGmhOAoC2B6oMcC2.LoccYt5kkXiriOOgKMyYG5Y4OeFnRaQk.Zglnv8dlrm.UX9RyKpHe4YzZBcfEgdkEKPp8wrSMRrhTM2hN5WiWByNnndrS3ILOZ+.0Xzst7PCfwkBZ2.pCTMFjdyimLjdyieGPZoliAol+4IHs.u52Jj9I16KDpMkLniStyfQv12+plSDa.cqqAMYy+9K+8mi35irQbsOFJ4pHyP670DhiwqxK9ZHezsLCdS6cE9wLcDkO27YxSYb75sDxFWGu0lnK7asozzm2KcowU7ktLy6qW5xLWrRzOe38APSWC8NhJmhw152OyF7SXAfcWh8ShYbJ0gse1QvEooMyMY1mAY761kMr+xjXnUUJHLXNk6zbeF9tCxso94+klaCYIoRcrxqlrnwEWVbd5qelsAtDznm7ehd6GUyrqgFmu1w6UuI5Kc.j2oJ+VYuras4+SyeY2FBDjx4E1DyXCIzKR3aF5pYr9tliEX869gs.OJoBJ7jJGU7O80ko8LWXaDjk9vwlFCKgudxOf.r1j3CG.+Y1snu2LHthdp21fWa6s2buDPBehjg9FmKH+au7N+0GuleD5vgQ9xKozLN4O7O9mOFqoYqbe6l+oleC8DFdo9IEdkwtay5BmYQJGvBiDsGvGJWX6Pn50dPavCWozcZh+kJrAmBRD2haRqdP1u877hYpg1FXaOPX9quYcrE+hCtUWNzKl4B8KRe89wJQXJCn6xBqu0zbzKrWdoZvWdeA96GtN7qE2654YqqubyScAMW+oZKgLUNZS7+3NXFDmYD9eSD+iwE07+KmQH0QJNxwbGZnE5szT.YKWekGks2AelzX7WWTHzGxQNNCuUisv6cUW3hW0EtzUcge4UcgKeUW38upK7Au6EhsItZxKsGx2YYsSqMLgJKkEmtzzV+a71R2JI
This is now a serious candidate for the snippet waiting room
-
@ustk genious, thank you!