Ableton Liveで曲を作る際のハモリパートの打ち込みが面倒になったため、ハモリパートを生成してくれる Max for Liveパッチを探しましたが、丁度よいものが見つからなかったので作ってみました。
入力されたMIDIノートから、指定した度数 translateした MIDIノートを生成する。度数はラジオボタンで選択する。Key=Cとする。
いきなりで恐縮なのですが、ハモリパート生成ロジックをパッチャーの世界だけで作るのは骨が折れるため、 Node for MaxとTypeScriptを使って実装しました。
まずは環境を作成します。
$ npm init -y
TypeScriptのインストールをします。
$ npm i --save-dev typescript
$ npx tsc --init
設定ファイルを変更します。
{
...
"target": "ES2020",
..
"outDir": "./build",
...
}
必要なライブラリをインストールしておきます。max-apiはMAX環境下でのみ動作するため、@types/max-apiのみをインストールします。
$ npm i --save-dev @types/max-api
$ npm i --save-dev @types/node
まずはTypeScriptの環境を作成して、ハーモニーを管理するクラスを作成します。(src/Harmony.ts)
export class Harmoney{
distance: number;
notes = [0, 2, 4, 5, 7, 9, 11 ];
constructor(distance: number){
this.distance = distance;
}
getHarmizedNote(absoluteMidiNode: number){
if (this.distance == 8) {
return absoluteMidiNode + 12;
}else if(this.distance == -8){
return absoluteMidiNode - 12;
}
const note = absoluteMidiNode % 12;
const octave = Math.floor(absoluteMidiNode / 12);
const index = this.notes.indexOf(note);
if( index == undefined ){
throw new Error("invalid note");
}
let target_index = index + this.distance;
let target_octave = 0;
if(target_index < 0){
target_index = this.notes.length + target_index;
target_octave = -1;
}
if (target_index >= this.notes.length) {
target_index = target_index - this.notes.length;
target_octave = 1;
}
const harmizedNote = this.notes[target_index];
return harmizedNote + (octave + target_octave) * 12;
}
}
Max APIのイベントハンドラを定義します。(src/main.ts)
import maxAPI from "max-api";
import { Harmoney} from "./Harmoney";
let harmoney = new Harmoney(0);
function setDistance(num: number){
harmoney.distance = num;
}
function getHarmony(){
return harmoney;
}
maxAPI.addHandler(maxAPI.MESSAGE_TYPES.BANG, async () => {
await maxAPI.outletBang();
});
maxAPI.addHandler(maxAPI.MESSAGE_TYPES.NUMBER, async (num: number) => {
try{
let harmony = getHarmony();
let note = harmony.getHarmizedNote(num)
await maxAPI.outlet(note);
}catch(e){
maxAPI.post("number error:" + JSON.stringify(e));
}
});
maxAPI.addHandler("distance", async (msg: number)=>{
try{
setDistance(msg);
maxAPI.post(`distance: ${msg}`);
}catch(e: any){
maxAPI.post("distance error" + e.message);
}
});
distanceメッセージでハモリの設定を変更します。
例えばdistance 3
の場合 、ルート音から3度上(つまり4度)の音を出力するように設定を変更します。
Numberが入力されたら設定に従って変更したNote numberを出力します。
コードをビルドします。
$ npx tsc
ビルドされたファイルを読み込むために、JavaScriptファイルを作成しておきます。
require("./build/main.js");
これで Node for Maxを利用する準備ができました。
今回はharmoner.jsと同じディレクトリにパッチャーを作成しました。 node.scriptノードでJavaScriptコードをロードします。
ハモる度数の設定には radiogroup を使用しました。 radiogroupは 0から順に数字が割り当てられており、設定を変更するとその値が出力されます。
そのままだと UIに記載している値と実際に割り当てたい度数が異なるため、dict を使用してマッピングを行いました。dict の第3引数は 以下のJSONファイルのパスです。
{
"0" : 0,
"1" : 2,
"2" : 3,
"3" : 4,
"4" : 5,
"5" : 8
}
MIDIの変換は midiparse / midiformat を使うことで簡単に実装できました。一番左の outlet / inlet がMIDIノートの情報で、Note numberと Velocityのペアです。
確認のために BEAPで作成した、2音が左右に分かれて出力されるシンセサイザーを入れていますが、ここはなんでもよいです。 著者もこの後、m4l用にmidioutに変更して使用する予定です。
node.scriptは自由度が高くて面白いですね。MAXの世界を無限に拡張することができそうです。 一方で、やや動作が不安定な感じもしました。このパッチャーではナイーブに呼び出していますが、安定した利用には工夫が必要そうです。
このパッチャーは発音中に度数を変更すると音が出っぱなしになるなど不安定になります。要改善ですね。
以上です。
----------begin_max5_patcher14465.3oc68s0iiabkvOOKv9efPNOsYhBq6E+dXAbb10qAFmDX6j7fwhFrkn
TSORjZon5YlrXyu8u5BIEuTjrnjnDUaMvn61r3kpNmSctUmK+u+q+Kua1ywe
NX+Lm+eN+ry6d2+q3JuScM4UdW9Ed2rs9edwF+8pab11f868WGL68YClF74T
0.nhKEcXa7gzMAopm.jeY80R+xt.8Wb1Lm+67wBWpdGwO+K+NBr3EsyOcwKg
QqeJIXQp9gPtr4tu2APnxeQbk+DJ94wWk3qGFk+wgpK9+8u9uH+s3Wu2504h
3saChRatN+s.m+7hpWeQ7l3D87ycN2E4AguW9Wdx+V9Wdth+DKl1kmnqhiR2
G9OTPC.RrPLB9bKe6Q9aU29ruNIzeyLCPOHoKnGfCUPOWt7WTrB5AZE5At7P
OZ5KSVPmqEfNO3sBxQltPN.zBHGCOmiD+C6x4HHgbafh3oKTjaAPjby13hRV
NY231MfyctfVCCtU.teHNdxJsffs.zA4yQWsMtspdg6kR8BZmpW3o1koWedp
U+XnbQTvmDyklKxMw9Ke1OZ8fWqpGx75E0+5ERTqZTOJSc41bzBQaooMtSzD
vkplrDOOs1fJ8.A7QXp2FpZa3xvUwIa8aaUAaEYEJgDsQeh6DewnJ9XDJQsm
DKknxQDpqfEhVBQG3O1ICDdVMUBRJlZu5mTvc44cy+wzfjf3iiFF7oWC2G9b
3lvzuTkxc0p8Ao4b+bkr6JMc2Du3iAKWl3ud+hj3MapPcrXS3hOl9RR7g0uT
YffH+m2D7hgGQOxqFFQ+kxYnVb4mWuMdYsKEmrLHo5q8yoI9ZTBnGR5lPo4B
H6tRTMkw8cKICgnZUP0l.gU5B..zQfAUeH7O3uT.T9Yv+8CbtEbm2GtNRH.t
DVpAnrCpBTOlzww4rDTBsH8QUPFGphO3u9ujDuPH+N9WUDFsPDDr84fkCjrn
LRua4eLjRN.CfKK+qCjNnxaSuDd2Q7rPgwPArIHYeXbT46+cy72sqz0eW4GR
Rd7KZcY4u+30BizWid7ZIARR.8qv83k8SDqrTwx5PhlH5yzBMRkuIA3OI5P3
QI3ZB17olhxTR.tem+hrMTBJ3hwOBvvTkvQgvxVgWR7slPnxjbV7tfnvncIA
6EZv3m1.9rLXk+gMoOUQAc3bWi2vpr4o4QMqv96lsNIbYbjbhT8SKud9mTPT
n24SprlT2Rj+NSOtfNS.fZaz8hE6g8O6mn17tIn5nowwaZarMAqRyFeWXTTc
.ZZ7tNFMIb8Kc8zOGKFcamud0P6e5Pjd3mDTIoOs2+0ZP9T+Maxztq1W3y9Q
gBE6BRC03Cn6wQaveATanWMMzRA8+hfOEtLUyspB4g3AB2kSXM6HZeY35f8o
0tXpfcXsKsO8KZTP4qcHmY8SoAa2sQrZpcGhsNg6S2+R7m1mcm4jeU.EG8Ob
kc9kkUTcftU8upRze0W47iaDS.mkweJxINwY+Vg0xu336n4M5HtgJOoYsrZ3
OJZkGx.CTn1MdbscrMM7oMKHd2QIm4LiNYHSUKKpBX14r+SUFoMtKsa2gYYN
hKr6P5q9aNDT0Fjd7ZPCPLpOPLFvly4dbOnm9eLgMJd3RduWhD5.hiZ7ANJ1
pFfscwWsIBq9Kvnnr1Dm0gHMKDq0pnsZh2rQDWMwbZC4odZecoDxg40oqaQP
WGB6pdOFE34Nu8apgPudD747Gh2rr5RrEIfVJErOIg8KMrUIhvJ2QGREsPxX
+RGsQBoURIGjjxtjV1uDydjZ1ijydjd1sDzVkh1hjz1jlZmDUakpZVxZCFR0
kiz7F5UdRUYJoNkX96.bbabqcsitofFT8g6SXSleuj+p5dSyhdZxFntLHuFi
ZxEmBgMD4Ydp3J50zSg8IuulL+Zx8uF3M2yFWA6EWcwQNbqPNPsBAZjCBpvT
2SHm8AaDnGvnuURep.G+8EBIwrCIoTPlq15voVtABc0vQpu4rtgvfdgvFfns
ZRQ6NiCqNrQzwSUAR5ER0f3H2loFhWTSpnkAe9n2cey.fI1.fgHsRsWE.70i
B1fQxUYy74X++gwQKcXxJOBV4Gl4QX3Tjsv9ZKrOrAJEaCJMy0bPks3HdiSV
9VKAnWby2qOx58NRalbVkDu0I8kv8N9OuWcjAB0RcV3GEEm57bfiXgGD9ZvR
GgpgAycJd3JWuz8e7kpefe5kChuTp+hO5DKLpc0l3O4H+XuFGtLX47FSyMgQ
AKhOnI1w8PB4Nm3B7nf2a7ut8TTHjULIHLkdDZCfgZoWTxcjVE0iCfSDZCrS
shdTk3aChBd0uyM5VoEA+nK2XZ++ftqzB+YmMNOelXD6UzqPYuyF6.sA6jgQ
z9Ek+.8b8POnAnX48K9YszcIiM2ryGYXkFK.l1Gi5XwggsDYb8zWuVPz0Da.
tCPEVYO.flcRt5PhwyRsGmPnB26.TgU19BcefJFeTgUNrwidmiItG3OYk+MI
SbLwaDw1VcP.LvzVpsFtLafFPW1LLqrCCBz9XQK4zZenAl5No77AeVYnj7nJ
jZhSYWCvG3skOdsyVGA37p4D89.v0Bh.o2z56XaUKI4M1C3ee7gjEEGUplKl
igk4xf8ogQEAiwOWX1noathy7.DJmhTIWjxOdXOYdBnj+b5zUm7xiOjkWFr3
FLMY2GSS5Pll3a1zjbeLMwCYZB6cqGPGL6HpKiik+EkCQDzsaumjaAz10G8t
i0BZHnOxc4xCX6xSpE3c15CNDzG+9a2GbH69X2mqO6oOuCYeJizL6Wg2NkBT
yS3zWbKXPp5lSwbKln2IJsplmf6.DOaPrJ7tsST6oP42tI5fLDHeYcKlnC1T
.vsYdhF5VdvckxVfKfxVEYAKXpu.H8r.bGl+edd8pvMaTX2mxc60r0I9KCqG
hXUtU0OA4zCXDA5ozqASgLLQ8WYU+Efgj0o16Al+dfdx.yRooTVEiQ9WsDqV
MeOV+ZN9VplcRyjYJxxmzINyS9ooIgOeHU6eLSXySMQMrJCg5LajVuI9Y+M0
RHiVSGjJq2KdZ+sI70f4pCXoLn7kPCtpblJJ.KHom8gvnO57W286+ixrk7mB
2J.0ku6JYiu3VKkE95cbkRqqJdzFjU9WHtdLWta1+DbrzQPWijoxPXCVvhq4
eUmTblLlHeMnw6.JT1GoB3PNxCBnsDGqpOdI.xLKSExc9IBfSZPxS5rMptCs
M3L6lIH4wodbTUd7HlpzHI9Kr.LpXzCxreowJ340UdV0dui+vHzp1i3AXTLS
UrnzRSDOFo3up8BNjFu8HQzed0pVoJZ.SJNHvFP5UwKNrWWNDNIrX9xpFbz1
G+L9xsdhYkfT4vpndyxUNcNpdVtR7lyHXn7OQj7S9sqbKtIS0Bto1vWsAIhY
goyB9rDYuuf8aG4cpAzyk5kVYi+k7kdQmqWTnYMp0y+EZZ224+VuvXFUh+Eu
piWVYdxG1lw1UwfRs2qldakt8vnvTYrhqEf0680BK+J2pPUzOpRz5tuq3n0c
IjsxMuUH3uy21Q8na6N1+RbRZkOXqes86BBVtIbqgTjs7skKfCVEycET5YY8
5IPYEVj5zXi1J3rpJ.JWMEf5nh83XJ.jwCVJ9EqBvCbeptTKoYbmyLIlRNyO
IYMWb8QVsI1O0nRIQRrev.VZcJ32r38dRwnVCIGigFEAWESBkl+.4ZQm4nRN
scT4HHCsBh9RIapFl4A2+l6.97t3nrf0.1NqqJb8ItWF19kYnKYBYECcW2N3
vVkmccFaFYF2565fXkTTQBtprr6p7zjl3GsWVADb1t2Yu+1capYJp8kqldX4
cx0mF2Si+imlwlNsz6o.0bcKIP6CD7PRiS9mNvp4a9ECXWudzMPPNu2htj.h
CXBI14Pbfz.Icxrvcsoh.cUA3+1QBL2nDKL.XLqWpZYnxwc87v4dwAJKJj7i
kWgdfwvojCu96uDD4bHRS5Gr78NJgJ6cNrOv4G9FmEGRdMX+bGG08c7tjdU1
OwQ7EBR1EuQ89jIIq3wplgrUz.8+LI3+46kE7Q68YFS.QIL..kq3o2cgOyD.
mGdMaXdM6G9lSvoY0dn2DtLCB61kYFHurlMEkMmJvQLXt7A7CGn8vAZObf1.
cfljsSwFQK8gVihD3kvbpuSI.VJS8p5krie16Rek0kNohI1NcMR8e5fw.W0O
lhFCP58fSzkBTTVoXFiuI5+2ueIkGypMZDJzofw.LzCuQNE8FIhcRkq1Gti7
g6Hugti7ut6R6Lx+5t6QWQZ1CBUZIIeYm7lsfOsWFi57s4dHk0EPHjgJNSI4
Y3q6Th34BSFoXxPXaamw6MXHRXsZytgk2Mylcca5.3QcUlq6lI6oOy0AEkSL
S+Eiag46DFTXstxheUHUp9KBmCwFre2NKzM.Xu7VY2BDycNh0djozqyTExqZ
3LUHk1zBZrqMk29GVP+vB56E4yKCV0iAgkrFV7hkQLr72vap0vZdM+L7LrDt
pv7lLut8Fu1Y693G01TZgTZXFSy7F2or.pbVhfKaVrWWVE61s8tMh73tEzXr
4t0JKcOjlkdttIbotILpASPZAnLxGO4kD4pqQQuYvtP7Ic5mDWXVnhVVf8DD
69gu9as5bwDqFy5SC8dqfo410bgv3hf.ts09MLZBl9QvAheZtrY5FAGSw.J.
xNICMP.PS9V2n3K3tNnYP3SB9iwnlve.413D8lUdKK6SaHxos383MW7sTnn5
vJ2xEHpr1Mmtg0TEW0rRQcofaMJ4VmOgWa0UXiEjaLUAaw4mAOPF.bLXS0Ms
B151CrML5JBZ6jmvlvkAS7iOqeaE334z51Jfby5lNvoRvzU1GsGntTYfd.cM
iWjgRxNoqlNQDBteWb9dit5zdzB1NU+7Nl+WDOKjIVgTRnFpPfUPqdZSEOwY
Ub2FI4aQLrY1MFEYrRtt10F9mxZeaFe2Yta33adb8jvN+nfM1cxqxyQVUNFw
YM.Q24HDGP3cc7mUnjd1ewGWmDeHZYC7gs1EHDQUY1pdaMa6dsS0H9IC.nHu
RVMoWVi6QMVJwvOYW40ZJhWuCZmEkmq0NNq54V03HC5H5.kd9utC+i2EmTzx
Jmi7twjjfxjj7bRxbjK65RaBNUZSJULwY.gcVY+i7fRsAkJhxvYENAtG1UWQ
GPtPD2fKLlbDptknSAHT2QMxkmzjbpjlptFHySnJTovu9AsYMZybDrqQ+oYM
wXodJeihfaIBTSU0kxjoVTzaaqzE0rFVZpLtz6VnQbF517NMTobt7yPtsyPT
8xpzketvrctTujYc4mJjgLUfi5TAYMJhznfRccnxseFB6XFNlT4HqIsLsVlX
SQCUYrqDdFaMTjL56PQCYWwMAZMHNqvaAI2P111FHDNhSPHaPvvwkfCBscxv
F+4xPDOMtBsAMqvzVVhSGo4hczKiONxPwztKF5iLVxcHrKuEpJa+LDdiXWZM
9D1MwUIygpXuUin5s3Uj+7Y+Na8nmrkrqOa1W0d9myJcg4VJWM1m2M+u8Mec
oHEe1qgAe50v8gOGtIL8KkstcV7pU6CpY7ewZY1l3EeLX4xD+06WjDuYSYaN
msXS3hOl9hv.80uTY.cfv8hgGQOxqFFQ+kxcrewkedccScyBbwpu1OqZrxUV
XlObl9OXlY0fiyE.dAzt.VZLIRL5MBBW4FWFPeHLpNik3Wzx.XCGE9XPO7Ma
hOr7AEwEfhPAI6hlf2CMgpxKPn5SPk61GMAdbnI99u6O9cOkF+jNH890DkQU
p.RwWa6yAKsht38V9WGgLkIO7rg7.4ooKn8xx.T4sET3pwbYdyVEJfgAI6q6
00Y961U55UETJHj9Es.L96OdsvH80nGuVRfjTIyWgGurehXkkJVVGzma4rOS
KcRoJuWlDcHrrr8RN3blhFVU5814uHammfVuX7RQ7kNmQw7VAWRxBM8Rk43r
3cAQgQs5TZgR.q7OrI8o1Nt4J2vproo4Qa4njmsNIbYbjbhT8SKud9m7mUEN
j5kOD8sD4uyziqK+xsM5dwh8v9m8ST6wqEt5yRii2z1XaBVklM9tvnn5.zz3
ccLZR35W55oeNVL51Ne8pg1+zgH8vOIHRReR5X9Z2n+lMYAdPsuvm8iB25mF
jlcn1P2ii1fMDn1PuZZnkBx+EAeJbY5K076d6k1Zik05REa5RXprTqq70Njy
U+ozfs6jwqYs6PryIbe59Wh+z9Zk25JfhV8W+kH1f+pux4ahiDbWRc7cjRZb
xZvqNowhq7GB724jEDPe0WcBgIFn+vtPFkXHNj+dGttIqRo1jzSW6XQ7jiAQ
Xmw1RQSo+jiBwdi2HZV.VvT7bQTKBvH30MB0kDdC6HOeyDR58FCuLjRvotLf
cihF8yKZGaFiyCIZ4Xtf4b.lCxOUXBq.ZbVw130JdF6uNU7GBhVZUFZHSNih
1q5i5RwsstTzexjfgn4ThqKLuFywvxzFhLmKfo.PkXB+Qco3QcondprBu7Ix
pjUiUElBnskkh5LuLlGq.qJLErISoZRvYJXjT36rT1i1aow0ySITj.zQFF+l
nrWWvVgQg9K93n.ZkJZ79yKmpPdmj9H.NXNlI++xilMg.SJXNfSDCMwxkssg
KCE6.2GbhHAt0AqeIDR0qb50F5SD+f0goMhXSH8ecMsLb8+bRlca8pdCGpRZ
PpmB1hPSuxt8B+MB13BnHSnbnCY9DKKYYVBgI5Dt2yyBHL85BgEJctKJNMXp
xOm1K6BNVAhElVgpqUNgM4jd9u63N8Jr4Xa8.ElL4pk4ksC27czhw3HvblGT
XibolYimJiwDpdwX.HU8WXFDQKzJvqm5JdqkaJ6Jo3193SsBPlaOEfrVeLrE
kdLaeX6p5XysprfOL7XiBVl1YFdTOLsTEO+rpWYs6GCZupTQy5xjLth7FM2i
vHTt5O4blmKp5K2XJO7njk8njk8vgPmWYNqzg8BsxcOfWiWHXWu7rpg2U82S
9qbZU6xxN0RyJMQlV58Ss8D6n53P6FouTmfT2IFHs2ZtIU2qhtsfztzreYvF
+u3LRkzB0oLex0Cdlk.WBkJ6SKPghKYNASZD0D77l+ojv01niOCNm5x.TuRd
0ySaTH6Mx4OC5+.XA59kTVsnkM4pGZSUOnAP1xT5l5AsStDPQrc8kS5bVk4I
yGW+0ssxsy+iNqbVMsj8Q75u7URUNpEoidDwVX1TS52uUXh5n.VMENAC.1xs
E1xHST8JzNA2Uf8k9.GNw7ANtW.LhRTA8BQHLtQbS3AmbtD+24PwSNWzhoVC
lQF.ySGx5xtqca7x1XSmll3TeX6wCH6NfySFYPr8P70oX.EXidAsTGx94l0N
Es+1zwdtMNayjKgqDbHkclf+tcE2yUO.NJSc7Zvl3ExzhoCRDi2yzgNw01Sf
Eyj+hwOK5D3bHE34hYY+D9qQpl09oAcQwzX7IC0BB0ei6zqD0xYxU4Wk7TZb
R20nNNiSBejoNfPKUjMyVsyj5.LmvQk+2aRpkCBiSOzJwxeRPL7WRBiSpKfo
EmMg0tBXNzCBgEk.M0oHqUMqYFwbx8T5JzktVSW1Gdn0P3v.saXZv1rLaZ1G
72qts+jZ+iyrifMmYuW9i+qv0uz4M7g3OYb7AbDupsv4GcYqcBjd8EJhQzAA
.P8KBencvoAUC3JU55JN3kY5musaS8SP9qGiDhETk+PLExv5xenG2E40yWS8
SXAgmm7PmUUQQWwSqqmhYsHr9eMCesVT.8frFkPui20UnbM1MO.oilWGjDFs
1tlqhL4NzNX0kpcRya187+PPpF3bbObfP6p3i+uYLE9wzfcW78w8W69EaLlC
AXdQIVWlgh.O3bu5w46i83uw2i24IgtQQ0Jo2b9Mfoky0fmFQNDxZRjqKyAS
qCgdZBzI1pgfNlzmfAY5xkqmuMNJdjx.lKPX8BrDFiP5RxfG5l.jUATpvzFY
ufsMUD993k+8WBB170xn5Rnx5G9O9iCIWP8nZ0LaV4I5ghObcjvbMUwdwfHz
AGDnWq.w77hXxx6S6OUpnr4b.k.YYrAw7Bex1A.+WeQ43IF1awqVI4CH+.Wx
Xd66Evzelbwh2sd1eNwaameercYVNzSpG.B4Up0ZqYs7loRKzq+QAtX7bjbC
edmdPF+R4Auf2zqwN92rqQA.bQy8.tLRQpJTH2P2o8dKDFS8eVILuR92rsE9
sDc9s0Oag1bTHPX1Ehbr0IvyQmn2LMb2dOKCpaIrIZB10UAu96iWjNjdpKIu
aW7F.A1e2AjqTPmq6zNH1zCAppFV+ze14G+tu8O80evZ+2A3BkFELa3kxKL9
ak8k.5.JmWTfNRRbKwmhClbgOprDD2Q7iBlS7H.9wX.9TM68XUm7rhFa.vxn
GgRUprns.FBlRNt42.5LP2G.HerbhCxVfLTk9vYJU.lVAH0ANE65B8pEgn2S
csQ.a.Lb..lNc4uz8sQUMtIWVcsVqnI6CaoCNV4DgOdxmNxq6X9HKeW4iPp9
AmT6NOl9xWq97nMwc5Ds3K.o1FDdDzMr3KbxAme+MG7r02HFb9jGoAhzuCt1
FXVS1Box+lCY5ERyXKAqFyJsIXf5OEKsGHps.Yc8FaJl+CSU1BDaiHOcb8NY
quRBg6.n3G+NxDrDKArEH6pOPG26Lw7XaS9qLGsLFh4mRojnsxZGQsdfSHvA
vxLHXDAG3IQ2kGxQ2kcW9iF2JVGBZWOuhl4M6QKl+9uEymQWd21h444tu+As
4arlJeFk4cUSkGimSkrKyCXGN8As48VSkmYeSNFN58PTJbnME5wbx.lRSF6a
WnzwexXaKv8Jz1YIdV2oW4i+jw5NCOBL9SFq6lzzwexfsFxnPnia2AFaMjAN
9M1cL01ICd7IfwDqgLiOOOr8hltBSFqY.iFezDxZldzNZk8ti8LDX6LDbqlg
1IduCXHXR.CAc.CG0Yn8b0GeQLHq4pmuWdLmLVyUm5cq1hZufG7sZGf0hivd
iOJ0ZwQP73OYPVKN5JPrasYalLv65PIY8TzjZyWm8iVauIb7sDGYs5Njwm9B
xGjJx3wcxXOaSxMhRx9oHz8FseDRFn1Wi4bAOglKVyWGXfcQONdbLm2VyeEM
9lTauWDGesFTeBnUxFcuNSFhU7tnWmIicjLWAzj066HiuuF.1qIv36fUfsFg
xv2HwcfA4ZwIBzBQOAIukNDnJmxTiNybwhL+4y9c1pTuDJcZlYqopmh4ypUe
PQ5JTIYGdd27+R7lufONXXvmTIOd3lr3sO+H8jYd99fZm3YwRY1l3EeLX4xD
+06WjDuYS4CZalpfIj9RR7g0uTY.ckR3ECOhdjWMLh9KkGgbEW9400Oeur9o
S0W6mSS70G8YwByb9YzYI338lKHGyZ.XmKvEBDPA70Xvla7XYALc11x0+xUW
AE.zx.cCgw3XPh7A+kKKO5u5oQ.sRiTO9Vm0DN1AIwwlefQRBntr2PH53sTm
JBcQRPFGRhO3u9ujDuHX+93e8PUzBEPv1mCVNPZBiofuYl.tpc+rrc+D2dYB
T4sETDEE4h6lsJT.aBR1WOfRl4uaWoqWUFof13WzRoN1FimI9p5qQOdsj.II
PVXPb7x9IhUVpXYcPmuXy9b4x8tJvLRhNDVVnYoX2XlhrTR8sem+hrcSBx2h
wKkk+zrrAoc3kDeqIDpLImEuKHJLp0.tQn.vJ+CaRepsvytxMrJadZdzVBC6
YqSBWFGImHU+zxqm+I+YiUQG8sD4uyziqKYrsM5dwh8v9m8SJUyXNNZZb7l1
FaSvpzrw2EFEUGflFuqiQSBW+RWO8ywhQ214qWMz9mNDoG9IAUR5SxfNp1M5
uYSV.4W6K7Y+nvs9oAogZ7Az83nM3u.pMzqlFZof9eQvmBWl9RsXJRp.4hjv
coEQszwQBWKTtr1ESErCqco8oeQiBJesC4bpeJMX6tMxpgQ06Pr0Ibe59Wh+
z9r6Lm7qBnn0XQ5RTU.9pux4G2Hl.NKi+TjSbhy9swwou336n4M5HtgSHRss
Hw5UrCn5RMotKl0WEm751abb1+oQobwItvtCopZL04kJw8lS2X.aNm6w8f4g
JnrEinUZ0p1XFpwGHHo0.DrMwWsIBqYvCZPTVahy5PjlEh0ZUzlopAVOh3pI
lSmxA5RU.UmEBXdyTm1nftND1U8dLJvqZTR1iPudD70nhZzpDPKkB1mjv9kF
1pDQX0NfZ6REsPxX+RGsQBoURIGjjxtjV1uDydjZ1ijydjd1sDzVkh1hjz1j
lZmDUakpZVxZCFR0kiz7F5UdRUYJoNkX96.plfrMExTCJ+tNKr0VIrosRUps
EVmFxf7ZLpohWpNk8xRFQck2EvqydnC48MBe7Jx8uF3M2yFWA6EWcwQNbqPN
YkNNMxAkWymtePN6C1HKKGi9VIUUN58G+8EBIwrCIkmVUxeRsbCD5pgiTeyY
cCgA8BgM.Qa0jhV8KCWW.iPcj+mMgTMHNZKOPaK0XeS.fI1.fgHsRsWE.70i
B1fQxUYy74X++gwQsuf20jsDpO1Rt8yhoStKXaPoYtlCpqKCbik9qaoDfdwM
eut3rs2QZyjypj3sNouDt2w+48pyKPnVpyB+nn3TmmCbDK7fvWCV5HTMLXtS
wCW45kt+iuT8C7SubP7kR8W7QmXgQsq1D+IG4G603vkAKm2XZJOdyEwGzD63
dHgbmSxZAEl9qaOEU01xV6EoAltk.j0kEzIqN4NRqhMw9K0R5OKnMvN0J5QU
huMHJ3U+N2nakVD7itbio8+C5tRK7mc1377YhQrWQOyk1xSA6.sA6jgQz9Ek
+.8b8POnAnX48K9odq9bT3lc9HCqzXAnaO4.cacTGNFVfLtd5qanbwVEa.tC
PEVYO.flcRt5RdsmkZONgPEt2AnBqr8E59.UL9nBqbXiG8NGSbOvexJ+aRl3
Xh2Hhss5f.XfosT6lElNaLft0hYeq7oAZerPcGjOz.ScmTd9fOqLTRdTERMw
orqA3C71xGu1YqCjb8bhde.3FUE9ndO1VSYUfIveirKnYFyzUFFX9lqVT+HT
NEoZlwJ+3UpO9c5zUm7xiOjkW8b435MMY2GSS5Pll3a1zjbeLMwCYZB6cqWV
d5fNV.M4PDAc616gZjlhckph2crVPCA8QtKWd.aWdFRuvo95CNDzG+9a2GbH
69X2mqO6oOuCYeB7FxJ71oTfgzQeRJtELHUcAva2D8NQoU07DbGf3YChUg2s
chZOEJ+1MQGjg..1sahNXSA.2l4IZna4A2UJaAt.JaYnTFLQW.jdV.tCy+Ok
pC4E8m9YqS7WFVODwpbqpeBxoGvHBzSoWClBYXc8r2i6h7LDiUMeOv72CzSF
XVJMkbEOttB42VrZ078X8qo0BmttPtqSbFaph6mXhZXUFB0Y1HsdS7y9apkP
FslNHiaad7XikrLn7kPS88EUT.VPRO6CgQez4ut62+GkYK4OEtU.paqakJuU
6Zm8JksIn4DWOlaQKy.k2FVajIUFhYvB9aM+qFkDeY.Q9ZPi2ATnoOREsgbj
GDPaqqMKevRPiYVlGj67SDPlzfjmzoZjEcIqlYG4wodbj0MOkFqfZMP.0Fui
+vHzp1i3AXTLSd2dZQIhGiT7W0dAGRi2djB5OuZk8sp5hSArAjdU7hC600Bg
SBKlurpAGs8wOiub6894iPpbXUTuo3JmJaIIUSwUh2bFACk+otaQKO12Qr0X
zfDwrjzdZNFu2zqrD54R8Rqrw+R9Runy0KJzrF054+BMs667eqWXLiJq+hW0
wKqLO4CayX6pXPo16USosR2dXTXpLPw0Bv589ZgkekaUnG5GUYYc22Ubz5Vk
vV4N2JD424q5nFzscG6eINI0tu19cAAK2Dt0PxwV91xktA6nu3LNp6rrdkDn
rpJRsYrQUEbV8D.kqiBPcHwdbLE.x6GQBYuXUncf6SukFUUMlIYTxY9IIn4h
qLxpMw9oF0HIRh8CFvRqSo9lks2SxE0Zv3XLnnH3pXRnzvGHWK2DTpcS0Fpb
DDfVAQeoDLUCy7f0eyc.edWbTVXZ.am0UEV9D2KCO+xbyqyDxL2bW2NXuVkg
cmuv7s1s9tNHVFEEhfqJ+5tpJMoI9Q6kE9.ms6c16uc2lZVfdyaQw.2Si4im
lqlNazmVsE5.ACjz3j+oCrZZlOUZ81796Yx34.lPbcNDGHMMRmCKbWaJDPWU
.9ucj.ymSmim0eiXVHij654gy8eCTVHH42v1H+Y3mq+9KAQNGhzj9AKeuiRh
xdmC6Cb9guwYwgjWC1O2wQceGuKoyj8SbDegfjcwaTuOYtwJdrpIFaE0O+OS
B9e9dYcdzdukwDPTBC.P4Zc5cW3sLAv4g+xFl+x9gu4DbWVsG5MgyxfvtcVl
AxKqYSQYyoBbDClKe.+v0YObc1CWmMPWmIY6TrQzRum0n1.dIrk56TBfqKSc
b8OlEeyorWx5RgTwDamttn9OcvXfq5GSQKAH8ddI5x+IJq7Kiw2Dk+62ijxi
V0t96tGiAXnG9gbJ5GRD6jJQsObD4CGQdCcD4ec2E0Mjc75lvNgzruCpz8Q9
xN4MaASZuLtz46w8PJ6JfPHCUbTRxysGpEJMWXrHESFBOa6LauA2PBqUq0Mr
7tYVqq6KG.OpqxPc2LAO8YnNnn9gY5uXbKLbmvfB6zU15qhgR0eQ3bH1fk61
YatA.6k295VfXtyQr1iFkdcipPXUC2nBozl1NmU2ybeX67CameaHbdYvpdrF
rjcvhWrLDgk+FdSsCtIulgYCbUI4871tIls1Yy83G0VSZgHZXQiLEq4wxFlM
SM3IW1fXutrG1saKcaDmwcKkobgDC1K+bOjledthIbohILpAiOZAnLxmJ4kD
4pqHQuYvtP7IcnmDWXVrgVVZ8DD69gu9as53vDqFyJSC8dqfo410Jgv3hn9s
s09MLHBl9AtAheZNqY5F3FSw3H.xNIqLP.PS9V2nvJ3tNVYP3SB9iwnlve.4
1397l0YKK6JaHxos383MW7sTVn5vD2xkCprlKmt8zTEW0rtPcofaMJvVmOgW
aUQXikeaLUAaw4G8NPF2aLXS0MsB151CrML5JBZ6jmvlvkAS7CNqeaE334z5
1Jfby5cNvoRLzU1AsGntTY7c.cMiWjQPxNoelNQDBte+a9di94zdzB1NU+7N
lvWDOKjIVgTRnFpPfUPqtYSEFwY0W2FozaQnqY1GF5jFIWQ6Zi8SYcpMiu3L
eMb70NttQXmeTvF6NvU4wGqp7h3rdcn6bDhCH7tN0yJjQO6u3iqShODsrAxv
ViBDxmpLaUuslcXu1IYD+jA.TjWISlzKqw8DFKkC3mrS7ZMavq2rryhry0ZW
lU8DqZbXAcDQfRe9W2U+w6hSJ5NkyQd2XRRPYRRdNIYNxkccoMAmJsIkJl3L
fvHqr+QdPo1fREQY3rZj.2C6pKdCHWHhav+ESNBU2Rzo.Dp6fE4xSZRNURSU
CBj4IzCpTHW+f1rFsYNB10nyzrlXrT6iuQ8tsDApoB3RYxTKpussUkhZVtJM
UwV5cKzHNCcadmFJJNW9YH21YHpdET5xOWX1NWpWcrt7SExPlJvQcpfrFEQZ
T6ntNT41OCgcLCGSpbj0jVlVKSrongBJ1UBOisFJRF8cnngrq3l.sFDmU3sf
jaHaaaCDBGwIHjMHX33RvAg1NYXi+bYHhmFWg1flESZKqloizbwN5kwGGYnt
Y2EC8QFK4ND1k2BUkseFBuQrKsFeB6l3pj4PUr2pQ77V7Jxe9remsdzS1R10
mM6qZO+yYUovbKkqF0y6l+29lu93PgAe50v8gOGtIL8KkMscV7pU6CpY4ewB
Y1l3EeLX4xD+06WjDuYSYCNmsXS3hOl9hv570uTY.c7u8hgGQOxqFFQ+kxco
ewkedcc6byhWwpu1OqZfxUVXlOVl9ORlY0.hyEPcAnt.VV93XJ7flwlqFQ48
DlKW2ZuP5eQKCeMbF3iAsv2rI9vxGTCmK0fBL1E8.pS5AcCEiPzc2MtaezC3
wgd36+t+328TZ7SUiLu27TEUo.HEessOGrzJZh2a4ecDxT9HBAVPZf35Cpk1
KqBPkWVPg6EykyMaUn.DFjrutmVm4uaWoqWU3nfH5WzBs3u+30BizWid7ZIA
RJkL+Cd7x9IhEVpXUcPePky9LszQip7XYRzgvxxyK4TyYJ5WUw0am+hrMcB5
7hwKEhW5zCEyaEbIoJzjKUliyh2EDEF0pinEB9W4eXS5Ssc9xUtgUYSSyi1x
YGOacR3x3H4Do5mVd87O4OqJPH0KSH5aIxemoGWWckaaz8hE6g8O6mn1hWK3
zmkFGuosw1DrJMa7cgQQ0Anow65Xzjv0uz0S+brXzsc95UCs+oCQ5geRPjj9
jzY70tQ+MaxhzfZegO6GEt0OMHM6frgtGGsAWHPsgd0zPKEj+KB9T3xzWp4q
81qb0FqZ0kpkzkvTYIRW4qcHmi9SoAa2ICPyZ2gXmS39z8uD+o80pd0U.Es5
i9KQv.+Ueky2DGI3tj536Hkx3j0+VcRiEW4OD3uyIKpe9pu5DhKLP+wYgLrv
PbH+8NbsTVJ0lTb5ZG7gmbPGB6LXVJ547mbXG1a.FQyBpBlhmKhZQDEAutgj
tjvaXGy4alXPu2f1kgTBN0k6qaT3medg2XyfZdHgGGyELmCvbP9IASXEPiyJ
XFuVAvX+kjh+PPzRqRICY1XTz8TeTBJtskfh9ydDLDMmRbcg40RNFVlmPj4b
ALE.pDD3OJAEOJAE0SbU3kOsUqypwbRqBssBTz4qKeiMvpZPAaxTRlDrkBFI
s8NKM8n8V+a87TRDI.cnfwuIZ50ErUXQn+hONJfVoVFu+7xfJj2IoLBfCliY
x+u7vWSHsjBlC3DwPSrLWaa3xPwNv8AmHRfacn4WBgT8JmdAf9DwOXcbYiH1
D.+WW6JCW+Omj4xVu51vgpTDj5ofsHzzq1ZuveifMt.JxDZF5PlOwxIVlkPX
hN8587r.BSutPXgFm6hhSClp7yo8xtfiUfXgcUn5pjSXSNom+6NtSupWN1V2
OgIStBVdYivMeGsXINBLm4AEFHWpc03oxOLgpWLF.RU+ElAQzBsB75o3g2Zk
kxt5FtsO9TqVi41SsFq0GCaQUFy1G1tBL1bqp82CCO1n1jo8jgG0CSKUVyOq
RSV6Nwf1qJUzrlHIiqHuQy8HLBkq9SNm44hp9xMliCOpNYOpNYO7Fz4UQyJc
RuPq70C303EB10KuTEordee2jxTV14UZViIxzRoepsmUGUG4Y2Hkk5Dj5Nw.
o8VaMo5tQzsEj1kZ8KC13+EmQp5UnNe4StnuyrD3RnTYmXAJzZIyCXRKnlfm
z7OkDt1FE7Yv4TWFf5UxkddZKBYuQN4YP+G8JP2Qjxp4rrIWoOap59L.xVlR
2T2mcxU6IhsqubRmyphNY9f5utMNtc9ezYkypokrOhW+UpRpxKsHcbiH1Byl
ZR+9sB6SGEvpo.IX.vVtsvVFYhpWg1C3tBruzA3vIlCvw8BfQThJbWHBgwMh
XBO3jye3+NGJdx4eVL0ZvLx.Xd5PVW1WsaiW1Fa5zzDm5CaOd.Y2oadxHChs
mfOmqsYwF8BZoji8yMqTJZmsoi5ba7zlI+AWIxPJ6LA+c6JtmqdzaTl530fM
wKj4CSGjHFumoCchqsG+JlI+EieVzIv4PJvyEyx9I7WiTMq8SC5hhow3SFpE
Dp+VyoWIpkyjqxuJ4oz3XtqQcbFGC9HSc.gVpHalsZmK0wbBGU5e32jTKGDF
mdnUhk+jfX3ujDFmTW.SKNaBqcEvbnGDBKJ3YpiPVqZVybg4j6ZzUnKcsltr
O7PqwugAZ2vzfsY4zzrO3uWca+I09GmYGAaNydu7G+Wgqeoya3Cwex33C37c
UagyO2xVa5G85KTDini..f5WD9P6TSCphuUpP0UbvKyzOea2l5mf7WOFIDKn
J1gXJjg0E6POtKxqmul5mvBBOO4INqpYhthmVW8DyZEX8+ZF9Zsnb4AYMJXd
GuqqPwYrad.RGMuNHILZsc8QEYZcncvpKU6jl2r64+gfTMv43d3.g1UwG+ey
XJ7ioA6t36i6uL8K1XLGBv7hpotL2DAdv4d0Cx2G6weiuGuySBcihpURu47a
.SKmqAOMhbHj0jH2y8lbLdcB5ml.chsZHnCH8IXDltb454aiihGoze4BDSu.
KgwHjtXL3gtI.YUzjJLsQ1yWaSEguOd4e+kffMesLjtDpr9g+i+3PxBTOpVM
yl0bhdn3CWGILWSUkWLHBcvQ.50JJLOuvkr79z9yiJJaNGPIPVFaPLuvmrc.
v+0WHNdhw7V7pUR9.xOvkLf29dAL8mQ+2Wp3cqm8mS7Nz42GaWNkC8j5AfPd
kZg1ZVKuYpwB85eTfKFOGI2vm2WGjwuTdvK3M85gi+M6ZK..WzbOfKiTjmBE
xMzMUu2BgwT+mUByqj+MaageKQmea8yVnMGEBDlcgHGaTB7bzI5MSu0s2yxf
5VBahlfMXUvq+93EoCo84Rx6sEuAPf82H.4JEz459pChM8Pfp5f0O8mc9wu6
a+Se8Gr1+c.tPoQAyFdojBi+VYeIfNfB4EEnijD2R7o3fIW3iJK3vcD+nf4D
OBfeLFfOUydOVtIOqnwF.rL5QnTkJKZKfgfojia9MfNCz8A.xGKm3frEHCU4
NblREfoU.RcfSwttPuZQH58TCZDvF.CG.foyU9KcKZTUfaxkUWqQJZx9vVZV
iUNQ3im7oi75NlOxx2U9HjpevI0tyi4t70pqNZSbmNQq7BPpsAgGAcCq7Bmb
v42ee.Oa8MhAmO4QZfH86fqsAl0jsJp7u4PldgzL1RvpwrRaBFn9Sw55AhZK
PVWrwlh4+vTks.w1HxSGWuS1hqjP3N.J9wuiLAquR.aAxt5Czw8NSLO11j+J
yQKigX9oTJIZqr1QTqG3DBb.rLCBFQvAdRzK4gbzcYuj+nwsh0gf10yqn0cy
dzP4u+an7Yzk2sMTddt66ePa9FqExmQYdW0B4w34TI6x7.1gSePadu0B4Y12
RigidGCkBGZKfdLmLfozjw9lCJc7mL11vauBMYVhm080U93OYrtOvi.i+jw5
dGMc7mLXqgLJD531KfwVCYfieabGSscxfGeBXLwZHy3yyCaunoqvjwZFvnwG
MgrloGsiFWu6XOCA1NCA2pYnch26.FBlDvPPGvvQcFZOW8wWDCxZt546kGyI
i0b0od2psn1K3Aeq1AXs3Hr23iRsVbDDO9SFj0hitBD6Va1lIC7tNTRVOEMo
170Y+n01aBGeKwQVqtCY7ouf7AohLdbmL1y1jbinjreJBcuQ6GgjAp80XNWv
Sn4h070AFXWziiGGy4s07WQiuI016EwwWqA0m.ZkrQ2qyjgXEuK50YxXGIyU
.MY89Nx36qAf8ZBL9NXEXqQnL7MRbGXPtVbh.sPzSPxaoCApxoL0nmLWrHye
9remsJ0KgRmlY1ZpqXQqd+D0YuSXwXlSLGyIoPk.jrRLTWDbUFOsQpNh7jEv
CBEyboHFBBvxthTVQ8nbJ.XJP8NEfPsDq4HTXcPZohgRKwWWWwVm4D8x3RWr
97H.B0C6R83T84ZywyA.FkfYXWNvEIK4Pn9.DvKN0vxvEoNI9KCi25uS+Gph
BnXIL+W1erRbTCBQZEBIegh8J9IeoRJs79VgcfAC6fPYMq.H6zDLFfyAxRpD
C1GrK+p8TOEyYPLKX6y0NIcU4KZwWpbf2cWxu5tTKdVauOHldI8sEtqIm482
US2NygluwhijGaNfRohc1bWWL0kKamIDxbw0nBTDvkS3d.lratOZa2aiJWww
y8XHiel626jSmrzqqJM3745nShqncoLXQ6k9ZtAeSr+RENcnK81ID.cyoW2F
Kvx76q95WmcPWWN86WjDtK0YepeR5kheO2F..w..f5NZD.V..ROr+RAAvcAA
f596.1zte50eKvtjfcAQKcVFJfAQKBtPv.hE56fjI3NDQfBZ.BVvUDHDy6At
5L.ihWFLOiP3E+jswQAIB46mjFfsHcnangtgX5xzaIPHDiK.FtxVMNrOI2fg
J4Vlpt586UjEuLXUl4LEW5Sx45kRhbKv9DATLvI4PTTXqrgOEHdOaAU4lAQn
RYisf5gFksfOqlJkzK40vfOoJJUgaxxi2iayVsZePsHo73DZS7hOFrbYh+ZA
Ya7lMUzbQUH1ReQ.YW+RkAzZ47hgGQOxqFFQ+kxy7lhK+755wMXVS5rxkNQo
oGKR53sxpGXXZbxbAjT.9lY.U2s8Ef4phaCWneLCBTEpTh.Gqw6PjqPiLnbm
F1MqrTNJbdt55iBwCVeTLCMIzGMyF7vSvFbS0CRy0tdyUBHhtrIaBNPt5vgs
gKCWEmr0O8TgCsndBqKf.UnFZycLBHip36KKE+bDgJKIh79DMwFEPhXWx91z
Rg2sjh2ezKMuuRwkta3EYvvKLNiCChPvTrGhfTcXJxHQBobMgLZ42ULU8ihh
OFh7y5SstAx6wHfhYiOt3y0swAWNGoR5F.ApfUTpPCHFz0CK1t4w6WgGYI.O
eNULUykTQKjwJqnjkKE4yDZ5JWgYkgCon0x+Wl2EuzTsgGcVTKUOcqkVVk6V
O0jIik5VqoiQ3LMjbg.Ji6Ak0DU7PEInuspw1eFDstSnygqMik+JtTtMmfCq
3h55tn2HN05YfmMyfZwVPc2deElA.VKyfKALvJr.fNhv.B0loP4iN5L+dHqH
7nWtOnUjYWrOG1p0GrFhWvQaWrfOT11YFyUWsjTtn2S6Hup+e.t9r5Abjtz1
c7fbNyE.vpEvEDhI+fnd2DfJEp+WfOHn2OnamnHfvPGENBSly4PDl.Id.tGU
1Vf7zZ210XxJJSiwDJHixK2L0F7xrxsYge415griEO+x9A6cAV63TafYoHER
fP.yYTL0ykH1jw7fpS9gn0RuyAoBssZNnLQ9IFG7xs16cajJhZtPePtUXWR2
.aIWMITQvFy.7joKM.cMnYLA2qMb3kYsakfaL7xArsRLsZZcg9fDq+fWn8t1
787tnetd4TfuXeNnUblHWtumcDnfK6GreVuWNDHzJBlZwpUc1OdZEsnLlAA0
X0Iq00XFEvCfz1zL3xrvg1.o8tXbBpEtlcqA8nXihcyfZgl6k0PMHvZF9WFx
afcFmd4zcBvutFJAXW.CknT3buFNWMyPIcYYq5+2nY1DvJAzfKGCWfUBnwnQ
bSAfXkPTzH5DI0T.Z0T.NlSAjUSAzXNEvVMEvi4TfZ0TfLlSg94n.GQIU1si
.vZYGA3psiPMEfi4T.Y0T.MlSArUSA7XNEHVMEHWNIBTq9fzwZMiuxJQXm2V
ufRcsx2gvKmYN0cCYGqvKi59VonKvrkpYGLk+tcuFjjW4rzepYa8+EcJHnOS
YglbQ5+e8IKNKIPF4NY01J8k7SV7RXZvhzC5F.vrOSyhBCUU1JI5PXNgaVQ3
Zl5vCkGe29c95kk5PF+W+WD2v+erzZcGM
-----------end_max5_patcher