From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============0665337113144541402==" MIME-Version: 1.0 From: Zeng, Oak To: kbuild-all@lists.01.org Subject: Re: [PATCH] drm/ttm: ioremap buffer according to TTM mem caching setting Date: Tue, 02 Mar 2021 22:45:15 +0000 Message-ID: < > In-Reply-To: <34b706ca-d15f-223f-e1a3-2ec071d578a2@gmail.com> List-Id: --===============0665337113144541402== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable [AMD Official Use Only - Internal Distribution Only] Hi Daniel, Thomas, Dan, Does below message mean the calling ioremap_cache failed intel's driver bui= ld? I can see both ioremap_cache and ioremap_wc are defined in arch/x86/mm/= ioremap.c - why ioremap_wc doesn't break intel driver's build? Are we supposed to use memremap (offset, size, MEMREMAP_WB) to replace iore= map_cache? When I read here https://lwn.net/Articles/653585/ I felt that io= remap_cache returns an address annotated with _iomem while memremap returns= an address without __iomem annotation. In our use case, GPU memory is trea= ted as UEFI SPM (specific purpose memory). I am not very sure whether memre= map (thus no __iomem annotation) is the right thing to do. What I am sure i= s, we have tested ioremap_cache and it works fine on AMD system. I will send out a test patch replacing ioremap_cache with ioremap_wc, to tr= igger Intel build robot to see whether it fails Intel build. I suppose it w= ill not fail Intel build. Regards, Oak From: Christian K=C3=B6nig Sent: Tuesday, March 2, 2021 6:31 AM To: amd-gfx(a)lists.freedesktop.org; dri-devel(a)lists.freedesktop.org; Dan= iel Vetter ; Dave Airlie ; Thomas = Hellstr=C3=B6m (Intel) Cc: Zeng, Oak ; kbuild-all(a)lists.01.org; Kuehling, Fe= lix ; Kasiviswanathan, Harish ; Deucher, Alexander ; Huang, J= inHuiEric ; Koenig, Christian Subject: Re: [PATCH] drm/ttm: ioremap buffer according to TTM mem caching s= etting Hi guys, adding the usual suspects direct. Does anybody of hand know how to check if= an architecture supports ioremap_cache()? For now we only need this on X86, but I would feel better if we don't use a= n #ifdef here. Regards, Christian. Am 02.03.21 um 05:12 schrieb kernel test robot: Hi Oak, Thank you for the patch! Yet something to improve: [auto build test ERROR on drm-intel/for-linux-next] [also build test ERROR on drm-tip/drm-tip linus/master v5.12-rc1 next-20210= 302] [cannot apply to tegra-drm/drm/tegra/for-next drm-exynos/exynos-drm-next dr= m/drm-next] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Oak-Zeng/drm-ttm-ioremap-b= uffer-according-to-TTM-mem-caching-setting/20210302-064500 base: git://anongit.freedesktop.org/drm-intel for-linux-next config: parisc-randconfig-r012-20210302 (attached as .config) compiler: hppa-linux-gcc (GCC) 9.3.0 reproduce (this is a W=3D1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/= make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/0day-ci/linux/commit/225bb3711439ec559dd72ae5a= f8e62d34ea60a64 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Oak-Zeng/drm-ttm-ioremap-buffer-ac= cording-to-TTM-mem-caching-setting/20210302-064500 git checkout 225bb3711439ec559dd72ae5af8e62d34ea60a64 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=3D$HOME/0day COMPILER=3Dgcc-9.3.0 make.cross = ARCH=3Dparisc If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot All errors (new ones prefixed by >>): drivers/gpu/drm/ttm/ttm_bo_util.c: In function 'ttm_resource_ioremap': drivers/gpu/drm/ttm/ttm_bo_util.c:95:11: error: implicit declaration of fun= ction 'ioremap_cache'; did you mean 'ioremap_uc'? [-Werror=3Dimplicit-funct= ion-declaration] 95 | addr =3D ioremap_cache(mem->bus.offset, bus_size); | ^~~~~~~~~~~~~ | ioremap_uc drivers/gpu/drm/ttm/ttm_bo_util.c:95:9: warning: assignment to 'void *' = from 'int' makes pointer from integer without a cast [-Wint-conversion] 95 | addr =3D ioremap_cache(mem->bus.offset, bus_size); | ^ drivers/gpu/drm/ttm/ttm_bo_util.c: In function 'ttm_bo_ioremap': drivers/gpu/drm/ttm/ttm_bo_util.c:379:17: warning: assignment to 'void *= ' from 'int' makes pointer from integer without a cast [-Wint-conversion] 379 | map->virtual =3D ioremap_cache(bo->mem.bus.offset + offset, | ^ drivers/gpu/drm/ttm/ttm_bo_util.c: In function 'ttm_bo_vmap': drivers/gpu/drm/ttm/ttm_bo_util.c:500:16: warning: assignment to 'void *= ' from 'int' makes pointer from integer without a cast [-Wint-conversion] 500 | vaddr_iomem =3D ioremap_cache(mem->bus.offset, | ^ cc1: some warnings being treated as errors vim +95 drivers/gpu/drm/ttm/ttm_bo_util.c 74 75 static int ttm_resource_ioremap(struct ttm_bo_device *bdev, 76 struct ttm_resource *mem, 77 void **virtual) 78 { 79 int ret; 80 void *addr; 81 82 *virtual =3D NULL; 83 ret =3D ttm_mem_io_reserve(bdev, mem); 84 if (ret || !mem->bus.is_iomem) 85 return ret; 86 87 if (mem->bus.addr) { 88 addr =3D mem->bus.addr; 89 } else { 90 size_t bus_size =3D (size_t)mem->num_pages << PAGE_= SHIFT; 91 92 if (mem->bus.caching =3D=3D ttm_write_combined) 93 addr =3D ioremap_wc(mem->bus.offset, bus_siz= e); 94 else if (mem->bus.caching =3D=3D ttm_cached) > 95 addr =3D ioremap_cache(mem->bus.offset, bus_= size); 96 else 97 addr =3D ioremap(mem->bus.offset, bus_size); 98 if (!addr) { 99 ttm_mem_io_free(bdev, mem); 100 return -ENOMEM; 101 } 102 } 103 *virtual =3D addr; 104 return 0; 105 } 106 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org _______________________________________________ amd-gfx mailing list amd-gfx(a)lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx --===============0665337113144541402== Content-Type: text/html MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.htm" PGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiIHhtbG5zOm89InVy bjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgeG1sbnM6dz0idXJuOnNjaGVt YXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIgeG1sbnM6bT0iaHR0cDovL3NjaGVtYXMubWlj cm9zb2Z0LmNvbS9vZmZpY2UvMjAwNC8xMi9vbW1sIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv VFIvUkVDLWh0bWw0MCI+CjxoZWFkPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNv bnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KPG1ldGEgbmFtZT0iR2VuZXJh dG9yIiBjb250ZW50PSJNaWNyb3NvZnQgV29yZCAxNSAoZmlsdGVyZWQgbWVkaXVtKSI+CjxzdHls ZT48IS0tCi8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KQGZvbnQtZmFjZQoJe2ZvbnQtZmFtaWx5OiJD YW1icmlhIE1hdGgiOwoJcGFub3NlLTE6MiA0IDUgMyA1IDQgNiAzIDIgNDt9CkBmb250LWZhY2UK CXtmb250LWZhbWlseTpEZW5nWGlhbjsKCXBhbm9zZS0xOjIgMSA2IDAgMyAxIDEgMSAxIDE7fQpA Zm9udC1mYWNlCgl7Zm9udC1mYW1pbHk6Q2FsaWJyaTsKCXBhbm9zZS0xOjIgMTUgNSAyIDIgMiA0 IDMgMiA0O30KQGZvbnQtZmFjZQoJe2ZvbnQtZmFtaWx5OkNvbnNvbGFzOwoJcGFub3NlLTE6MiAx MSA2IDkgMiAyIDQgMyAyIDQ7fQpAZm9udC1mYWNlCgl7Zm9udC1mYW1pbHk6IlxARGVuZ1hpYW4i OwoJcGFub3NlLTE6MiAxIDYgMCAzIDEgMSAxIDEgMTt9Ci8qIFN0eWxlIERlZmluaXRpb25zICov CnAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKCXttYXJnaW46MGluOwoJ Zm9udC1zaXplOjExLjBwdDsKCWZvbnQtZmFtaWx5OiJDYWxpYnJpIixzYW5zLXNlcmlmO30KYTps aW5rLCBzcGFuLk1zb0h5cGVybGluawoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsKCWNvbG9yOmJs dWU7Cgl0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30KcHJlCgl7bXNvLXN0eWxlLXByaW9yaXR5 Ojk5OwoJbXNvLXN0eWxlLWxpbms6IkhUTUwgUHJlZm9ybWF0dGVkIENoYXIiOwoJbWFyZ2luOjBp bjsKCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKCWZvbnQtc2l6ZToxMC4wcHQ7Cglmb250LWZhbWls eToiQ291cmllciBOZXciO30Kc3Bhbi5IVE1MUHJlZm9ybWF0dGVkQ2hhcgoJe21zby1zdHlsZS1u YW1lOiJIVE1MIFByZWZvcm1hdHRlZCBDaGFyIjsKCW1zby1zdHlsZS1wcmlvcml0eTo5OTsKCW1z by1zdHlsZS1saW5rOiJIVE1MIFByZWZvcm1hdHRlZCI7Cglmb250LWZhbWlseTpDb25zb2xhczt9 CnNwYW4uRW1haWxTdHlsZTIwCgl7bXNvLXN0eWxlLXR5cGU6cGVyc29uYWwtcmVwbHk7Cglmb250 LWZhbWlseToiQ2FsaWJyaSIsc2Fucy1zZXJpZjsKCWNvbG9yOndpbmRvd3RleHQ7fQouTXNvQ2hw RGVmYXVsdAoJe21zby1zdHlsZS10eXBlOmV4cG9ydC1vbmx5OwoJZm9udC1zaXplOjEwLjBwdDt9 CkBwYWdlIFdvcmRTZWN0aW9uMQoJe3NpemU6OC41aW4gMTEuMGluOwoJbWFyZ2luOjEuMGluIDEu MGluIDEuMGluIDEuMGluO30KZGl2LldvcmRTZWN0aW9uMQoJe3BhZ2U6V29yZFNlY3Rpb24xO30K LS0+PC9zdHlsZT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KPG86c2hhcGVkZWZhdWx0cyB2OmV4 dD0iZWRpdCIgc3BpZG1heD0iMTAyNiIgLz4KPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUg bXNvIDldPjx4bWw+CjxvOnNoYXBlbGF5b3V0IHY6ZXh0PSJlZGl0Ij4KPG86aWRtYXAgdjpleHQ9 ImVkaXQiIGRhdGE9IjEiIC8+CjwvbzpzaGFwZWxheW91dD48L3htbD48IVtlbmRpZl0tLT4KPC9o ZWFkPgo8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz0iYmx1ZSIgdmxpbms9InB1cnBsZSIgc3R5bGU9 IndvcmQtd3JhcDpicmVhay13b3JkIj4KPHAgc3R5bGU9ImZvbnQtZmFtaWx5OkFyaWFsO2ZvbnQt c2l6ZToxMXB0O2NvbG9yOiMwMDc4RDc7bWFyZ2luOjVwdDsiIGFsaWduPSJMZWZ0Ij4KW0FNRCBP ZmZpY2lhbCBVc2UgT25seSAtIEludGVybmFsIERpc3RyaWJ1dGlvbiBPbmx5XTxicj4KPC9wPgo8 YnI+CjxkaXY+CjxkaXYgY2xhc3M9IldvcmRTZWN0aW9uMSI+CjxwIGNsYXNzPSJNc29Ob3JtYWwi PkhpIERhbmllbCwgVGhvbWFzLCBEYW4sPG86cD48L286cD48L3A+CjxwIGNsYXNzPSJNc29Ob3Jt YWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj5Eb2VzIGJlbG93 IG1lc3NhZ2UgbWVhbiB0aGUgY2FsbGluZyBpb3JlbWFwX2NhY2hlIGZhaWxlZCBpbnRlbCYjODIx NztzIGRyaXZlciBidWlsZD8gSSBjYW4gc2VlIGJvdGggaW9yZW1hcF9jYWNoZSBhbmQgaW9yZW1h cF93YyBhcmUgZGVmaW5lZCBpbiBhcmNoL3g4Ni9tbS9pb3JlbWFwLmMgJiM4MjExOyB3aHkgaW9y ZW1hcF93YyBkb2VzbiYjODIxNzt0IGJyZWFrIGludGVsIGRyaXZlciYjODIxNztzIGJ1aWxkPzxv OnA+PC9vOnA+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4K PHAgY2xhc3M9Ik1zb05vcm1hbCI+QXJlIHdlIHN1cHBvc2VkIHRvIHVzZSBtZW1yZW1hcCAob2Zm c2V0LCBzaXplLCBNRU1SRU1BUF9XQikgdG8gcmVwbGFjZSBpb3JlbWFwX2NhY2hlPyBXaGVuIEkg cmVhZCBoZXJlCjxhIGhyZWY9Imh0dHBzOi8vbHduLm5ldC9BcnRpY2xlcy82NTM1ODUvIj5odHRw czovL2x3bi5uZXQvQXJ0aWNsZXMvNjUzNTg1LzwvYT4gSSBmZWx0IHRoYXQgaW9yZW1hcF9jYWNo ZSByZXR1cm5zIGFuIGFkZHJlc3MgYW5ub3RhdGVkIHdpdGggX2lvbWVtIHdoaWxlIG1lbXJlbWFw IHJldHVybnMgYW4gYWRkcmVzcyB3aXRob3V0IF9faW9tZW0gYW5ub3RhdGlvbi4gSW4gb3VyIHVz ZSBjYXNlLCBHUFUgbWVtb3J5IGlzIHRyZWF0ZWQgYXMgVUVGSSBTUE0KIChzcGVjaWZpYyBwdXJw b3NlIG1lbW9yeSkuIEkgYW0gbm90IHZlcnkgc3VyZSB3aGV0aGVyIG1lbXJlbWFwICh0aHVzIG5v IF9faW9tZW0gYW5ub3RhdGlvbikgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLiBXaGF0IEkgYW0g c3VyZSBpcywgd2UgaGF2ZSB0ZXN0ZWQgaW9yZW1hcF9jYWNoZSBhbmQgaXQgd29ya3MgZmluZSBv biBBTUQgc3lzdGVtLjxvOnA+PC9vOnA+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZu YnNwOzwvbzpwPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+SSB3aWxsIHNlbmQgb3V0IGEgdGVz dCBwYXRjaCByZXBsYWNpbmcgaW9yZW1hcF9jYWNoZSB3aXRoIGlvcmVtYXBfd2MsIHRvIHRyaWdn ZXIgSW50ZWwgYnVpbGQgcm9ib3QgdG8gc2VlIHdoZXRoZXIgaXQgZmFpbHMgSW50ZWwgYnVpbGQu IEkgc3VwcG9zZSBpdCB3aWxsIG5vdCBmYWlsIEludGVsIGJ1aWxkLjxvOnA+PC9vOnA+PC9wPgo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4KPGRpdj4KPHAgY2xhc3M9 Ik1zb05vcm1hbCI+UmVnYXJkcyw8bzpwPjwvbzpwPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ T2FrPG86cD48L286cD48L3A+CjwvZGl2Pgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNw OzwvbzpwPjwvcD4KPGRpdiBzdHlsZT0iYm9yZGVyOm5vbmU7Ym9yZGVyLWxlZnQ6c29saWQgYmx1 ZSAxLjVwdDtwYWRkaW5nOjBpbiAwaW4gMGluIDQuMHB0Ij4KPGRpdj4KPGRpdiBzdHlsZT0iYm9y ZGVyOm5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAjRTFFMUUxIDEuMHB0O3BhZGRpbmc6My4wcHQgMGlu IDBpbiAwaW4iPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48Yj5Gcm9tOjwvYj4gQ2hyaXN0aWFuIEv2 bmlnICZsdDtja29lbmlnLmxlaWNodHp1bWVya2VuQGdtYWlsLmNvbSZndDsKPGJyPgo8Yj5TZW50 OjwvYj4gVHVlc2RheSwgTWFyY2ggMiwgMjAyMSA2OjMxIEFNPGJyPgo8Yj5Ubzo8L2I+IGFtZC1n ZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnOyBkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3Jn OyBEYW5pZWwgVmV0dGVyICZsdDtkYW5pZWxAZmZ3bGwuY2gmZ3Q7OyBEYXZlIEFpcmxpZSAmbHQ7 YWlybGllZEByZWRoYXQuY29tJmd0OzsgVGhvbWFzIEhlbGxzdHL2bSAoSW50ZWwpICZsdDt0aG9t YXNfb3NAc2hpcG1haWwub3JnJmd0Ozxicj4KPGI+Q2M6PC9iPiBaZW5nLCBPYWsgJmx0O09hay5a ZW5nQGFtZC5jb20mZ3Q7OyBrYnVpbGQtYWxsQGxpc3RzLjAxLm9yZzsgS3VlaGxpbmcsIEZlbGl4 ICZsdDtGZWxpeC5LdWVobGluZ0BhbWQuY29tJmd0OzsgS2FzaXZpc3dhbmF0aGFuLCBIYXJpc2gg Jmx0O0hhcmlzaC5LYXNpdmlzd2FuYXRoYW5AYW1kLmNvbSZndDs7IERldWNoZXIsIEFsZXhhbmRl ciAmbHQ7QWxleGFuZGVyLkRldWNoZXJAYW1kLmNvbSZndDs7IEh1YW5nLCBKaW5IdWlFcmljICZs dDtKaW5IdWlFcmljLkh1YW5nQGFtZC5jb20mZ3Q7OwogS29lbmlnLCBDaHJpc3RpYW4gJmx0O0No cmlzdGlhbi5Lb2VuaWdAYW1kLmNvbSZndDs8YnI+CjxiPlN1YmplY3Q6PC9iPiBSZTogW1BBVENI XSBkcm0vdHRtOiBpb3JlbWFwIGJ1ZmZlciBhY2NvcmRpbmcgdG8gVFRNIG1lbSBjYWNoaW5nIHNl dHRpbmc8bzpwPjwvbzpwPjwvcD4KPC9kaXY+CjwvZGl2Pgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48 bzpwPiZuYnNwOzwvbzpwPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1i b3R0b206MTIuMHB0Ij5IaSBndXlzLDxicj4KPGJyPgphZGRpbmcgdGhlIHVzdWFsIHN1c3BlY3Rz IGRpcmVjdC4gRG9lcyBhbnlib2R5IG9mIGhhbmQga25vdyBob3cgdG8gY2hlY2sgaWYgYW4gYXJj aGl0ZWN0dXJlIHN1cHBvcnRzIGlvcmVtYXBfY2FjaGUoKT88YnI+Cjxicj4KRm9yIG5vdyB3ZSBv bmx5IG5lZWQgdGhpcyBvbiBYODYsIGJ1dCBJIHdvdWxkIGZlZWwgYmV0dGVyIGlmIHdlIGRvbid0 IHVzZSBhbiAjaWZkZWYgaGVyZS48YnI+Cjxicj4KUmVnYXJkcyw8YnI+CkNocmlzdGlhbi48bzpw PjwvbzpwPjwvcD4KPGRpdj4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+QW0gMDIuMDMuMjEgdW0gMDU6 MTIgc2NocmllYiBrZXJuZWwgdGVzdCByb2JvdDo8bzpwPjwvbzpwPjwvcD4KPC9kaXY+CjxibG9j a3F1b3RlIHN0eWxlPSJtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQiPgo8cHJl PkhpIE9hayw8bzpwPjwvbzpwPjwvcHJlPgo8cHJlPjxvOnA+Jm5ic3A7PC9vOnA+PC9wcmU+Cjxw cmU+VGhhbmsgeW91IGZvciB0aGUgcGF0Y2ghIFlldCBzb21ldGhpbmcgdG8gaW1wcm92ZTo8bzpw PjwvbzpwPjwvcHJlPgo8cHJlPjxvOnA+Jm5ic3A7PC9vOnA+PC9wcmU+CjxwcmU+W2F1dG8gYnVp bGQgdGVzdCBFUlJPUiBvbiBkcm0taW50ZWwvZm9yLWxpbnV4LW5leHRdPG86cD48L286cD48L3By ZT4KPHByZT5bYWxzbyBidWlsZCB0ZXN0IEVSUk9SIG9uIGRybS10aXAvZHJtLXRpcCBsaW51cy9t YXN0ZXIgdjUuMTItcmMxIG5leHQtMjAyMTAzMDJdPG86cD48L286cD48L3ByZT4KPHByZT5bY2Fu bm90IGFwcGx5IHRvIHRlZ3JhLWRybS9kcm0vdGVncmEvZm9yLW5leHQgZHJtLWV4eW5vcy9leHlu b3MtZHJtLW5leHQgZHJtL2RybS1uZXh0XTxvOnA+PC9vOnA+PC9wcmU+CjxwcmU+W0lmIHlvdXIg cGF0Y2ggaXMgYXBwbGllZCB0byB0aGUgd3JvbmcgZ2l0IHRyZWUsIGtpbmRseSBkcm9wIHVzIGEg bm90ZS48bzpwPjwvbzpwPjwvcHJlPgo8cHJlPkFuZCB3aGVuIHN1Ym1pdHRpbmcgcGF0Y2gsIHdl IHN1Z2dlc3QgdG8gdXNlICctLWJhc2UnIGFzIGRvY3VtZW50ZWQgaW48bzpwPjwvbzpwPjwvcHJl Pgo8cHJlPjxhIGhyZWY9Imh0dHBzOi8vbmFtMTEuc2FmZWxpbmtzLnByb3RlY3Rpb24ub3V0bG9v ay5jb20vP3VybD1odHRwcyUzQSUyRiUyRmdpdC1zY20uY29tJTJGZG9jcyUyRmdpdC1mb3JtYXQt cGF0Y2gmYW1wO2RhdGE9MDQlN0MwMSU3Q09hay5aZW5nJTQwYW1kLmNvbSU3QzA4ZjUxZTg3ZTM2 YzRkZTg1OGJjMDhkOGRkNmViMTZiJTdDM2RkODk2MWZlNDg4NGU2MDhlMTFhODJkOTk0ZTE4M2Ql N0MwJTdDMCU3QzYzNzUwMjgxNDc5MzE2ODY5NiU3Q1Vua25vd24lN0NUV0ZwYkdac2IzZDhleUpX SWpvaU1DNHdMakF3TURBaUxDSlFJam9pVjJsdU16SWlMQ0pCVGlJNklrMWhhV3dpTENKWFZDSTZN bjAlM0QlN0MxMDAwJmFtcDtzZGF0YT1wNGl5bk1QdlpHa25mU0dTeVpuWFYza0x3U2NNTGJQREI4 elZzbXhodGswJTNEJmFtcDtyZXNlcnZlZD0wIj5odHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0 LWZvcm1hdC1wYXRjaDwvYT5dPG86cD48L286cD48L3ByZT4KPHByZT48bzpwPiZuYnNwOzwvbzpw PjwvcHJlPgo8cHJlPnVybDombmJzcDsmbmJzcDsmbmJzcDsgPGEgaHJlZj0iaHR0cHM6Ly9uYW0x MS5zYWZlbGlua3MucHJvdGVjdGlvbi5vdXRsb29rLmNvbS8/dXJsPWh0dHBzJTNBJTJGJTJGZ2l0 aHViLmNvbSUyRjBkYXktY2klMkZsaW51eCUyRmNvbW1pdHMlMkZPYWstWmVuZyUyRmRybS10dG0t aW9yZW1hcC1idWZmZXItYWNjb3JkaW5nLXRvLVRUTS1tZW0tY2FjaGluZy1zZXR0aW5nJTJGMjAy MTAzMDItMDY0NTAwJmFtcDtkYXRhPTA0JTdDMDElN0NPYWsuWmVuZyU0MGFtZC5jb20lN0MwOGY1 MWU4N2UzNmM0ZGU4NThiYzA4ZDhkZDZlYjE2YiU3QzNkZDg5NjFmZTQ4ODRlNjA4ZTExYTgyZDk5 NGUxODNkJTdDMCU3QzAlN0M2Mzc1MDI4MTQ3OTMxNzg2ODklN0NVbmtub3duJTdDVFdGcGJHWnNi M2Q4ZXlKV0lqb2lNQzR3TGpBd01EQWlMQ0pRSWpvaVYybHVNeklpTENKQlRpSTZJazFoYVd3aUxD SlhWQ0k2TW4wJTNEJTdDMTAwMCZhbXA7c2RhdGE9MnNjNGpaUjNiVlJGMHhERHFOT3RVY05SOXFp Sk1GMkFUbUNEQVglMkJTV3JRJTNEJmFtcDtyZXNlcnZlZD0wIj5odHRwczovL2dpdGh1Yi5jb20v MGRheS1jaS9saW51eC9jb21taXRzL09hay1aZW5nL2RybS10dG0taW9yZW1hcC1idWZmZXItYWNj b3JkaW5nLXRvLVRUTS1tZW0tY2FjaGluZy1zZXR0aW5nLzIwMjEwMzAyLTA2NDUwMDwvYT48bzpw PjwvbzpwPjwvcHJlPgo8cHJlPmJhc2U6Jm5ic3A7Jm5ic3A7IGdpdDovL2Fub25naXQuZnJlZWRl c2t0b3Aub3JnL2RybS1pbnRlbCBmb3ItbGludXgtbmV4dDxvOnA+PC9vOnA+PC9wcmU+CjxwcmU+ Y29uZmlnOiBwYXJpc2MtcmFuZGNvbmZpZy1yMDEyLTIwMjEwMzAyIChhdHRhY2hlZCBhcyAuY29u ZmlnKTxvOnA+PC9vOnA+PC9wcmU+CjxwcmU+Y29tcGlsZXI6IGhwcGEtbGludXgtZ2NjIChHQ0Mp IDkuMy4wPG86cD48L286cD48L3ByZT4KPHByZT5yZXByb2R1Y2UgKHRoaXMgaXMgYSBXPTEgYnVp bGQpOjxvOnA+PC9vOnA+PC9wcmU+CjxwcmU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7IHdnZXQgPGEgaHJlZj0iaHR0cHM6Ly9uYW0xMS5zYWZlbGlua3MucHJvdGVj dGlvbi5vdXRsb29rLmNvbS8/dXJsPWh0dHBzJTNBJTJGJTJGcmF3LmdpdGh1YnVzZXJjb250ZW50 LmNvbSUyRmludGVsJTJGbGtwLXRlc3RzJTJGbWFzdGVyJTJGc2JpbiUyRm1ha2UuY3Jvc3MmYW1w O2RhdGE9MDQlN0MwMSU3Q09hay5aZW5nJTQwYW1kLmNvbSU3QzA4ZjUxZTg3ZTM2YzRkZTg1OGJj MDhkOGRkNmViMTZiJTdDM2RkODk2MWZlNDg4NGU2MDhlMTFhODJkOTk0ZTE4M2QlN0MwJTdDMCU3 QzYzNzUwMjgxNDc5MzE3ODY4OSU3Q1Vua25vd24lN0NUV0ZwYkdac2IzZDhleUpXSWpvaU1DNHdM akF3TURBaUxDSlFJam9pVjJsdU16SWlMQ0pCVGlJNklrMWhhV3dpTENKWFZDSTZNbjAlM0QlN0Mx MDAwJmFtcDtzZGF0YT11SUxjTEUlMkYyNGJoU1UlMkJvNUdtV0dBSzZzNnhERml2UDZscm02Smd0 TTUwWSUzRCZhbXA7cmVzZXJ2ZWQ9MCI+aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29t L2ludGVsL2xrcC10ZXN0cy9tYXN0ZXIvc2Jpbi9tYWtlLmNyb3NzPC9hPiAtTyB+L2Jpbi9tYWtl LmNyb3NzPG86cD48L286cD48L3ByZT4KPHByZT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsgY2htb2QgK3ggfi9iaW4vbWFrZS5jcm9zczxvOnA+PC9vOnA+PC9wcmU+ CjxwcmU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICMgPGEgaHJl Zj0iaHR0cHM6Ly9uYW0xMS5zYWZlbGlua3MucHJvdGVjdGlvbi5vdXRsb29rLmNvbS8/dXJsPWh0 dHBzJTNBJTJGJTJGZ2l0aHViLmNvbSUyRjBkYXktY2klMkZsaW51eCUyRmNvbW1pdCUyRjIyNWJi MzcxMTQzOWVjNTU5ZGQ3MmFlNWFmOGU2MmQzNGVhNjBhNjQmYW1wO2RhdGE9MDQlN0MwMSU3Q09h ay5aZW5nJTQwYW1kLmNvbSU3QzA4ZjUxZTg3ZTM2YzRkZTg1OGJjMDhkOGRkNmViMTZiJTdDM2Rk ODk2MWZlNDg4NGU2MDhlMTFhODJkOTk0ZTE4M2QlN0MwJTdDMCU3QzYzNzUwMjgxNDc5MzE4ODY4 NSU3Q1Vua25vd24lN0NUV0ZwYkdac2IzZDhleUpXSWpvaU1DNHdMakF3TURBaUxDSlFJam9pVjJs dU16SWlMQ0pCVGlJNklrMWhhV3dpTENKWFZDSTZNbjAlM0QlN0MxMDAwJmFtcDtzZGF0YT0yVE9T UHVLRU1SY1pqTWZ4TzlseGd3RnhnWHdIcUVSQ09nUmVkbkk3T0U4JTNEJmFtcDtyZXNlcnZlZD0w Ij5odHRwczovL2dpdGh1Yi5jb20vMGRheS1jaS9saW51eC9jb21taXQvMjI1YmIzNzExNDM5ZWM1 NTlkZDcyYWU1YWY4ZTYyZDM0ZWE2MGE2NDwvYT48bzpwPjwvbzpwPjwvcHJlPgo8cHJlPiZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBnaXQgcmVtb3RlIGFkZCBsaW51 eC1yZXZpZXcgPGEgaHJlZj0iaHR0cHM6Ly9uYW0xMS5zYWZlbGlua3MucHJvdGVjdGlvbi5vdXRs b29rLmNvbS8/dXJsPWh0dHBzJTNBJTJGJTJGZ2l0aHViLmNvbSUyRjBkYXktY2klMkZsaW51eCZh bXA7ZGF0YT0wNCU3QzAxJTdDT2FrLlplbmclNDBhbWQuY29tJTdDMDhmNTFlODdlMzZjNGRlODU4 YmMwOGQ4ZGQ2ZWIxNmIlN0MzZGQ4OTYxZmU0ODg0ZTYwOGUxMWE4MmQ5OTRlMTgzZCU3QzAlN0Mw JTdDNjM3NTAyODE0NzkzMTg4Njg1JTdDVW5rbm93biU3Q1RXRnBiR1pzYjNkOGV5SldJam9pTUM0 d0xqQXdNREFpTENKUUlqb2lWMmx1TXpJaUxDSkJUaUk2SWsxaGFXd2lMQ0pYVkNJNk1uMCUzRCU3 QzEwMDAmYW1wO3NkYXRhPVRsWHZzNW14SDBSVjlxUUZhVUYyQjFMWmlzVFdibnQ0aGZGZDJPQzdn R3clM0QmYW1wO3Jlc2VydmVkPTAiPmh0dHBzOi8vZ2l0aHViLmNvbS8wZGF5LWNpL2xpbnV4PC9h PjxvOnA+PC9vOnA+PC9wcmU+CjxwcmU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7IGdpdCBmZXRjaCAtLW5vLXRhZ3MgbGludXgtcmV2aWV3IE9hay1aZW5nL2RybS10 dG0taW9yZW1hcC1idWZmZXItYWNjb3JkaW5nLXRvLVRUTS1tZW0tY2FjaGluZy1zZXR0aW5nLzIw MjEwMzAyLTA2NDUwMDxvOnA+PC9vOnA+PC9wcmU+CjxwcmU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGdpdCBjaGVja291dCAyMjViYjM3MTE0MzllYzU1OWRkNzJh ZTVhZjhlNjJkMzRlYTYwYTY0PG86cD48L286cD48L3ByZT4KPHByZT4mbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgIyBzYXZlIHRoZSBhdHRhY2hlZCAuY29uZmlnIHRv IGxpbnV4IGJ1aWxkIHRyZWU8bzpwPjwvbzpwPjwvcHJlPgo8cHJlPiZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBDT01QSUxFUl9JTlNUQUxMX1BBVEg9JEhPTUUvMGRh eSBDT01QSUxFUj1nY2MtOS4zLjAgbWFrZS5jcm9zcyBBUkNIPXBhcmlzYyA8bzpwPjwvbzpwPjwv cHJlPgo8cHJlPjxvOnA+Jm5ic3A7PC9vOnA+PC9wcmU+CjxwcmU+SWYgeW91IGZpeCB0aGUgaXNz dWUsIGtpbmRseSBhZGQgZm9sbG93aW5nIHRhZyBhcyBhcHByb3ByaWF0ZTxvOnA+PC9vOnA+PC9w cmU+CjxwcmU+UmVwb3J0ZWQtYnk6IGtlcm5lbCB0ZXN0IHJvYm90IDxhIGhyZWY9Im1haWx0bzps a3BAaW50ZWwuY29tIj4mbHQ7bGtwQGludGVsLmNvbSZndDs8L2E+PG86cD48L286cD48L3ByZT4K PHByZT48bzpwPiZuYnNwOzwvbzpwPjwvcHJlPgo8cHJlPkFsbCBlcnJvcnMgKG5ldyBvbmVzIHBy ZWZpeGVkIGJ5ICZndDsmZ3Q7KTo8bzpwPjwvbzpwPjwvcHJlPgo8cHJlPjxvOnA+Jm5ic3A7PC9v OnA+PC9wcmU+CjxwcmU+Jm5ic3A7Jm5ic3A7IGRyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvX3V0 aWwuYzogSW4gZnVuY3Rpb24gJ3R0bV9yZXNvdXJjZV9pb3JlbWFwJzo8bzpwPjwvbzpwPjwvcHJl Pgo8YmxvY2txdW90ZSBzdHlsZT0ibWFyZ2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0 Ij4KPGJsb2NrcXVvdGUgc3R5bGU9Im1hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBw dCI+CjxwcmU+ZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdXRpbC5jOjk1OjExOiBlcnJvcjog aW1wbGljaXQgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb24gJ2lvcmVtYXBfY2FjaGUnOyBkaWQgeW91 IG1lYW4gJ2lvcmVtYXBfdWMnPyBbLVdlcnJvcj1pbXBsaWNpdC1mdW5jdGlvbi1kZWNsYXJhdGlv bl08bzpwPjwvbzpwPjwvcHJlPgo8L2Jsb2NrcXVvdGU+CjwvYmxvY2txdW90ZT4KPHByZT4mbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgOTUgfCZuYnNwOyZuYnNwOyZuYnNwOyBhZGRyID0g aW9yZW1hcF9jYWNoZShtZW0tJmd0O2J1cy5vZmZzZXQsIGJ1c19zaXplKTs8bzpwPjwvbzpwPjwv cHJlPgo8cHJlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyB8Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7IF5+fn5+fn5+fn5+fn48bzpwPjwvbzpwPjwvcHJlPgo8cHJlPiZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB8Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlvcmVtYXBfdWM8bzpwPjwv bzpwPjwvcHJlPgo8cHJlPiZuYnNwOyZuYnNwOyBkcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9ib191 dGlsLmM6OTU6OTogd2FybmluZzogYXNzaWdubWVudCB0byAndm9pZCAqJyBmcm9tICdpbnQnIG1h a2VzIHBvaW50ZXIgZnJvbSBpbnRlZ2VyIHdpdGhvdXQgYSBjYXN0IFstV2ludC1jb252ZXJzaW9u XTxvOnA+PC9vOnA+PC9wcmU+CjxwcmU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDk1 IHwmbmJzcDsmbmJzcDsmbmJzcDsgYWRkciA9IGlvcmVtYXBfY2FjaGUobWVtLSZndDtidXMub2Zm c2V0LCBidXNfc2l6ZSk7PG86cD48L286cD48L3ByZT4KPHByZT4mbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBePG86cD48L286cD48L3ByZT4KPHByZT4mbmJzcDsmbmJz cDsgZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdXRpbC5jOiBJbiBmdW5jdGlvbiAndHRtX2Jv X2lvcmVtYXAnOjxvOnA+PC9vOnA+PC9wcmU+CjxwcmU+Jm5ic3A7Jm5ic3A7IGRyaXZlcnMvZ3B1 L2RybS90dG0vdHRtX2JvX3V0aWwuYzozNzk6MTc6IHdhcm5pbmc6IGFzc2lnbm1lbnQgdG8gJ3Zv aWQgKicgZnJvbSAnaW50JyBtYWtlcyBwb2ludGVyIGZyb20gaW50ZWdlciB3aXRob3V0IGEgY2Fz dCBbLVdpbnQtY29udmVyc2lvbl08bzpwPjwvbzpwPjwvcHJlPgo8cHJlPiZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyAzNzkgfCZuYnNwOyZuYnNwOyZuYnNwOyBtYXAtJmd0O3ZpcnR1YWwgPSBpb3Jl bWFwX2NhY2hlKGJvLSZndDttZW0uYnVzLm9mZnNldCArIG9mZnNldCw8bzpwPjwvbzpwPjwvcHJl Pgo8cHJlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB8 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IF48bzpwPjwvbzpwPjwvcHJl Pgo8cHJlPiZuYnNwOyZuYnNwOyBkcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9ib191dGlsLmM6IElu IGZ1bmN0aW9uICd0dG1fYm9fdm1hcCc6PG86cD48L286cD48L3ByZT4KPHByZT4mbmJzcDsmbmJz cDsgZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdXRpbC5jOjUwMDoxNjogd2FybmluZzogYXNz aWdubWVudCB0byAndm9pZCAqJyBmcm9tICdpbnQnIG1ha2VzIHBvaW50ZXIgZnJvbSBpbnRlZ2Vy IHdpdGhvdXQgYSBjYXN0IFstV2ludC1jb252ZXJzaW9uXTxvOnA+PC9vOnA+PC9wcmU+CjxwcmU+ Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDUwMCB8Jm5ic3A7Jm5ic3A7Jm5ic3A7IHZhZGRyX2lv bWVtID0gaW9yZW1hcF9jYWNoZShtZW0tJmd0O2J1cy5vZmZzZXQsPG86cD48L286cD48L3ByZT4K PHByZT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfCZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBePG86cD48L286cD48L3ByZT4KPHByZT4m bmJzcDsmbmJzcDsgY2MxOiBzb21lIHdhcm5pbmdzIGJlaW5nIHRyZWF0ZWQgYXMgZXJyb3JzPG86 cD48L286cD48L3ByZT4KPHByZT48bzpwPiZuYnNwOzwvbzpwPjwvcHJlPgo8cHJlPjxvOnA+Jm5i c3A7PC9vOnA+PC9wcmU+CjxwcmU+dmltICs5NSBkcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9ib191 dGlsLmM8bzpwPjwvbzpwPjwvcHJlPgo8cHJlPjxvOnA+Jm5ic3A7PC9vOnA+PC9wcmU+CjxwcmU+ Jm5ic3A7Jm5ic3A7Jm5ic3A7IDc0Jm5ic3A7IDxvOnA+PC9vOnA+PC9wcmU+CjxwcmU+Jm5ic3A7 Jm5ic3A7Jm5ic3A7IDc1Jm5ic3A7IHN0YXRpYyBpbnQgdHRtX3Jlc291cmNlX2lvcmVtYXAoc3Ry dWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsPG86cD48L286cD48L3ByZT4KPHByZT4mbmJzcDsmbmJz cDsmbmJzcDsgNzYmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHN0cnVjdCB0dG1fcmVzb3VyY2UgKm1lbSw8bzpwPjwvbzpw PjwvcHJlPgo8cHJlPiZuYnNwOyZuYnNwOyZuYnNwOyA3NyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgdm9pZCAqKnZpcnR1 YWwpPG86cD48L286cD48L3ByZT4KPHByZT4mbmJzcDsmbmJzcDsmbmJzcDsgNzgmbmJzcDsgezxv OnA+PC9vOnA+PC9wcmU+CjxwcmU+Jm5ic3A7Jm5ic3A7Jm5ic3A7IDc5Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCByZXQ7PG86cD48L286 cD48L3ByZT4KPHByZT4mbmJzcDsmbmJzcDsmbmJzcDsgODAmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgdm9pZCAqYWRkcjs8bzpwPjwvbzpwPjwv cHJlPgo8cHJlPiZuYnNwOyZuYnNwOyZuYnNwOyA4MSZuYnNwOyA8bzpwPjwvbzpwPjwvcHJlPgo8 cHJlPiZuYnNwOyZuYnNwOyZuYnNwOyA4MiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAqdmlydHVhbCA9IE5VTEw7PG86cD48L286cD48L3ByZT4K PHByZT4mbmJzcDsmbmJzcDsmbmJzcDsgODMmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcmV0ID0gdHRtX21lbV9pb19yZXNlcnZlKGJkZXYsIG1l bSk7PG86cD48L286cD48L3ByZT4KPHByZT4mbmJzcDsmbmJzcDsmbmJzcDsgODQmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaWYgKHJldCB8fCAh bWVtLSZndDtidXMuaXNfaW9tZW0pPG86cD48L286cD48L3ByZT4KPHByZT4mbmJzcDsmbmJzcDsm bmJzcDsgODUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcmV0 dXJuIHJldDs8bzpwPjwvbzpwPjwvcHJlPgo8cHJlPiZuYnNwOyZuYnNwOyZuYnNwOyA4NiZuYnNw OyA8bzpwPjwvbzpwPjwvcHJlPgo8cHJlPiZuYnNwOyZuYnNwOyZuYnNwOyA4NyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpZiAobWVtLSZndDti dXMuYWRkcikgezxvOnA+PC9vOnA+PC9wcmU+CjxwcmU+Jm5ic3A7Jm5ic3A7Jm5ic3A7IDg4Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGFkZHIgPSBtZW0tJmd0 O2J1cy5hZGRyOzxvOnA+PC9vOnA+PC9wcmU+CjxwcmU+Jm5ic3A7Jm5ic3A7Jm5ic3A7IDg5Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH0gZWxz ZSB7PG86cD48L286cD48L3ByZT4KPHByZT4mbmJzcDsmbmJzcDsmbmJzcDsgOTAmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgc2l6ZV90IGJ1c19zaXplID0gKHNp emVfdCltZW0tJmd0O251bV9wYWdlcyAmbHQ7Jmx0OyBQQUdFX1NISUZUOzxvOnA+PC9vOnA+PC9w cmU+CjxwcmU+Jm5ic3A7Jm5ic3A7Jm5ic3A7IDkxJm5ic3A7IDxvOnA+PC9vOnA+PC9wcmU+Cjxw cmU+Jm5ic3A7Jm5ic3A7Jm5ic3A7IDkyJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7IGlmIChtZW0tJmd0O2J1cy5jYWNoaW5nID09IHR0bV93cml0ZV9jb21iaW5l ZCk8bzpwPjwvbzpwPjwvcHJlPgo8cHJlPiZuYnNwOyZuYnNwOyZuYnNwOyA5MyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyBhZGRyID0gaW9yZW1hcF93YyhtZW0tJmd0O2J1cy5vZmZzZXQs IGJ1c19zaXplKTs8bzpwPjwvbzpwPjwvcHJlPgo8cHJlPiZuYnNwOyZuYnNwOyZuYnNwOyA5NCZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBlbHNlIGlmIChtZW0t Jmd0O2J1cy5jYWNoaW5nID09IHR0bV9jYWNoZWQpPG86cD48L286cD48L3ByZT4KPHByZT4mbmJz cDsgJmd0OyA5NSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBhZGRyID0gaW9yZW1hcF9j YWNoZShtZW0tJmd0O2J1cy5vZmZzZXQsIGJ1c19zaXplKTs8bzpwPjwvbzpwPjwvcHJlPgo8cHJl PiZuYnNwOyZuYnNwOyZuYnNwOyA5NiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyBlbHNlPG86cD48L286cD48L3ByZT4KPHByZT4mbmJzcDsmbmJzcDsmbmJzcDsg OTcmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgYWRkciA9IGlvcmVtYXAobWVtLSZndDti dXMub2Zmc2V0LCBidXNfc2l6ZSk7PG86cD48L286cD48L3ByZT4KPHByZT4mbmJzcDsmbmJzcDsm bmJzcDsgOTgmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaWYg KCFhZGRyKSB7PG86cD48L286cD48L3ByZT4KPHByZT4mbmJzcDsmbmJzcDsmbmJzcDsgOTkmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgdHRtX21lbV9pb19mcmVlKGJkZXYsIG1lbSk7PG86 cD48L286cD48L3ByZT4KPHByZT4mbmJzcDsmbmJzcDsgMTAwJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7IHJldHVybiAtRU5PTUVNOzxvOnA+PC9vOnA+PC9wcmU+CjxwcmU+Jm5ic3A7Jm5i c3A7IDEwMSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB9PG86 cD48L286cD48L3ByZT4KPHByZT4mbmJzcDsmbmJzcDsgMTAyJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08bzpwPjwvbzpwPjwvcHJlPgo8cHJl PiZuYnNwOyZuYnNwOyAxMDMmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsgKnZpcnR1YWwgPSBhZGRyOzxvOnA+PC9vOnA+PC9wcmU+CjxwcmU+Jm5i c3A7Jm5ic3A7IDEwNCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyByZXR1cm4gMDs8bzpwPjwvbzpwPjwvcHJlPgo8cHJlPiZuYnNwOyZuYnNwOyAx MDUmbmJzcDsgfTxvOnA+PC9vOnA+PC9wcmU+CjxwcmU+Jm5ic3A7Jm5ic3A7IDEwNiZuYnNwOyA8 bzpwPjwvbzpwPjwvcHJlPgo8cHJlPjxvOnA+Jm5ic3A7PC9vOnA+PC9wcmU+CjxwcmU+LS0tPG86 cD48L286cD48L3ByZT4KPHByZT4wLURBWSBDSSBLZXJuZWwgVGVzdCBTZXJ2aWNlLCBJbnRlbCBD b3Jwb3JhdGlvbjxvOnA+PC9vOnA+PC9wcmU+CjxwcmU+PGEgaHJlZj0iaHR0cHM6Ly9uYW0xMS5z YWZlbGlua3MucHJvdGVjdGlvbi5vdXRsb29rLmNvbS8/dXJsPWh0dHBzJTNBJTJGJTJGbGlzdHMu MDEub3JnJTJGaHlwZXJraXR0eSUyRmxpc3QlMkZrYnVpbGQtYWxsJTQwbGlzdHMuMDEub3JnJmFt cDtkYXRhPTA0JTdDMDElN0NPYWsuWmVuZyU0MGFtZC5jb20lN0MwOGY1MWU4N2UzNmM0ZGU4NThi YzA4ZDhkZDZlYjE2YiU3QzNkZDg5NjFmZTQ4ODRlNjA4ZTExYTgyZDk5NGUxODNkJTdDMCU3QzAl N0M2Mzc1MDI4MTQ3OTMxOTg2ODAlN0NVbmtub3duJTdDVFdGcGJHWnNiM2Q4ZXlKV0lqb2lNQzR3 TGpBd01EQWlMQ0pRSWpvaVYybHVNeklpTENKQlRpSTZJazFoYVd3aUxDSlhWQ0k2TW4wJTNEJTdD MTAwMCZhbXA7c2RhdGE9OHZheEJNaVJQdjVtZ1p5S2pEbnNOdHpBeiUyQkRsdG56bGtVTURNZzQ1 JTJCckklM0QmYW1wO3Jlc2VydmVkPTAiPmh0dHBzOi8vbGlzdHMuMDEub3JnL2h5cGVya2l0dHkv bGlzdC9rYnVpbGQtYWxsQGxpc3RzLjAxLm9yZzwvYT48bzpwPjwvbzpwPjwvcHJlPgo8cCBjbGFz cz0iTXNvTm9ybWFsIj48YnI+Cjxicj4KPG86cD48L286cD48L3A+CjxwcmU+X19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX188bzpwPjwvbzpwPjwvcHJlPgo8cHJl PmFtZC1nZnggbWFpbGluZyBsaXN0PG86cD48L286cD48L3ByZT4KPHByZT48YSBocmVmPSJtYWls dG86YW1kLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmciPmFtZC1nZnhAbGlzdHMuZnJlZWRlc2t0 b3Aub3JnPC9hPjxvOnA+PC9vOnA+PC9wcmU+CjxwcmU+PGEgaHJlZj0iaHR0cHM6Ly9uYW0xMS5z YWZlbGlua3MucHJvdGVjdGlvbi5vdXRsb29rLmNvbS8/dXJsPWh0dHBzJTNBJTJGJTJGbGlzdHMu ZnJlZWRlc2t0b3Aub3JnJTJGbWFpbG1hbiUyRmxpc3RpbmZvJTJGYW1kLWdmeCZhbXA7ZGF0YT0w NCU3QzAxJTdDT2FrLlplbmclNDBhbWQuY29tJTdDMDhmNTFlODdlMzZjNGRlODU4YmMwOGQ4ZGQ2 ZWIxNmIlN0MzZGQ4OTYxZmU0ODg0ZTYwOGUxMWE4MmQ5OTRlMTgzZCU3QzAlN0MwJTdDNjM3NTAy ODE0NzkzMTk4NjgwJTdDVW5rbm93biU3Q1RXRnBiR1pzYjNkOGV5SldJam9pTUM0d0xqQXdNREFp TENKUUlqb2lWMmx1TXpJaUxDSkJUaUk2SWsxaGFXd2lMQ0pYVkNJNk1uMCUzRCU3QzEwMDAmYW1w O3NkYXRhPWVScHdNN1YzM2JyQlF0T3hua0FmUFRscDM4M3RjQTF4NTV6UFB3MVcwZ0ElM0QmYW1w O3Jlc2VydmVkPTAiPmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGlu Zm8vYW1kLWdmeDwvYT48bzpwPjwvbzpwPjwvcHJlPgo8L2Jsb2NrcXVvdGU+CjxwIGNsYXNzPSJN c29Ob3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPgo8L2Rpdj4KPC9kaXY+CjwvZGl2Pgo8L2Jv ZHk+CjwvaHRtbD4K --===============0665337113144541402==--