From 79caedc84774450bc05042b28bc90a644b79bfa5 Mon Sep 17 00:00:00 2001 From: SmallMain Date: Wed, 15 Jun 2022 18:56:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 + demo/README.md | 4 +- demo/assets/left-area.ts | 67 ++ demo/assets/left-area.ts.meta | 9 + demo/assets/main.fire | 376 ++++--- demo/assets/multi-render/multi-batcher.meta | 12 + .../multi-batcher/multi-batcher.prefab | 958 ++++++++++++++++++ .../multi-batcher/multi-batcher.prefab.meta | 8 + .../multi-batcher/multi-batcher.ts | 13 + .../multi-batcher/multi-batcher.ts.meta | 9 + .../multi-material/multi-material.prefab | 128 +-- docs/docs/intro.md | 6 + .../docs/start-guide/advance-batcher-guide.md | 4 + docs/docs/start-guide/batcher-guide.md | 88 +- docs/docs/update-log.md | 1 + .../assets/autoswitch-settings.png | Bin 0 -> 87299 bytes .../user-guide/multi-render/multi-batcher.md | 118 ++- .../user-guide/multi-render/multi-material.md | 12 +- 18 files changed, 1555 insertions(+), 264 deletions(-) create mode 100644 demo/assets/left-area.ts create mode 100644 demo/assets/left-area.ts.meta create mode 100644 demo/assets/multi-render/multi-batcher.meta create mode 100644 demo/assets/multi-render/multi-batcher/multi-batcher.prefab create mode 100644 demo/assets/multi-render/multi-batcher/multi-batcher.prefab.meta create mode 100644 demo/assets/multi-render/multi-batcher/multi-batcher.ts create mode 100644 demo/assets/multi-render/multi-batcher/multi-batcher.ts.meta create mode 100644 docs/docs/user-guide/multi-render/assets/autoswitch-settings.png diff --git a/README.md b/README.md index 12158737..ec3f072e 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,7 @@ TODO - [新特性] cc.Label、cc.RichText、cc.Sprite、cc.MotionStreak、Spine 组件支持使用多纹理材质,并支持自动切换材质机制 - [新特性] cc.RichText 支持使用自定义材质 - [修复] 直接修改 Effect 的属性不回导致其变体的 hash 值刷新 +- [修复] CHAR 缓存模式 hash 计算可能会有重复的问题 - [调整] 默认禁用 Label 原生 TTF 渲染器 所有更新日志请移步 [此处](https://smallmain.github.io/cocos-service-pack/docs/update-log)。 @@ -111,4 +112,9 @@ TODO 对于已经修改过引擎的人,由于服务包提供的是 Git Patch,所以可以让你在已有修改的基础上轻松应用上服务包的改动,甚至你可以只应用你想要的特性。 +### Cocos Creator 报 Error: Can not parse this input:undefined 错误 + +没有找到服务包的内置资源,请记得安装配套的引擎扩展。 + +--- **最后的最后,希望这个项目能帮助到你的学习或工作,enjoy!** diff --git a/demo/README.md b/demo/README.md index 4df3bdaf..ecc97e8b 100755 --- a/demo/README.md +++ b/demo/README.md @@ -21,9 +21,9 @@ // 扩展 Label:BITMAP 模式会复用同样式同文本的纹理,CHAR 模式改为使用多个图集,但是支持自动加入多纹理合批,这样就能与动态图集一起合批(增加配置,默认情况下动态图集最高8-1张,Char 图集为 1 张(无论如何设置,在装不完的情况下,因为需要正常渲染,都会最高使用 8 张图集,但是只有设置的数量才会加入多纹理合批,并且会创建一个专属材质,如果该材质无法完成渲染,会使用专属材质,或者可以仿照 spine flush buffer) // 扩展 Spine:支持自动切换材质与动态图集 -// 提醒 Spine 的材质自动切换会有缓存,修改关联的材质后,生效可以手动清除 comp._materialCache = {};,其它组件的材质生效需要 setVertsDirty +// 在编辑器中,Char 的显示有时候会出现异常 +// 提醒调整是否参与动态图集,需要 setVertsDirty // 提醒 cc.SkeletonData.createSpriteFrame ,如果 region 的旋转角度不是 270 或 0 不能完美转换,但不影响自动合图 -// 提醒 SpineData 如果同时使用多个 texture,只会使用第一个 texture 的 multiMaterial 进行自动切换 // Spine 需要更多测试!!!SkeletonData 克隆会有 ref 问题吗? // 注意:因 MotionSteak 直接使用 texture 而不是 spriteFrame,所以不支持动态图集 diff --git a/demo/assets/left-area.ts b/demo/assets/left-area.ts new file mode 100644 index 00000000..38cf5d3a --- /dev/null +++ b/demo/assets/left-area.ts @@ -0,0 +1,67 @@ +const { ccclass, property } = cc._decorator; + +@ccclass +export default class LeftArea extends cc.Component { + + @property(cc.Node) + home: cc.Node = null; + + @property(cc.Node) + multiMaterial: cc.Node = null; + + @property(cc.Node) + multiBatcher: cc.Node = null; + + @property(cc.Node) + mainArea: cc.Node = null; + + + start() { + this.home.on('toggle', (toggle: cc.Toggle) => { + if (toggle.isChecked) { + this.changePage(toggle.node); + } + }); + + this.multiMaterial.on('toggle', (toggle: cc.Toggle) => { + if (toggle.isChecked) { + this.changePage(toggle.node); + } + }); + + this.multiBatcher.on('toggle', (toggle: cc.Toggle) => { + if (toggle.isChecked) { + this.changePage(toggle.node); + } + }); + } + + tick = 0; + + changePage(node: cc.Node) { + const cur = ++this.tick; + const map = new Map([ + + [this.multiMaterial, { bundle: "multi-render", path: "multi-material/multi-material" }], + + [this.multiBatcher, { bundle: "multi-render", path: "multi-batcher/multi-batcher" }], + + ]); + + this.mainArea.destroyAllChildren(); + + const route = map.get(node); + if (route) { + cc.assetManager.loadBundle(route.bundle, (err, bundle) => { + if (!err) { + bundle.load(route.path, cc.Prefab, (err, prefab: cc.Prefab) => { + if (!err && cur === this.tick) { + this.mainArea.addChild(cc.instantiate(prefab)); + } + }); + } + }); + } + } + +} diff --git a/demo/assets/left-area.ts.meta b/demo/assets/left-area.ts.meta new file mode 100644 index 00000000..71707686 --- /dev/null +++ b/demo/assets/left-area.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.0.8", + "uuid": "853f5bb2-1b9a-451e-911a-5de5ed6b530b", + "isPlugin": false, + "loadPluginInWeb": true, + "loadPluginInNative": true, + "loadPluginInEditor": false, + "subMetas": {} +} \ No newline at end of file diff --git a/demo/assets/main.fire b/demo/assets/main.fire index 97b65918..e284bfd8 100644 --- a/demo/assets/main.fire +++ b/demo/assets/main.fire @@ -75,19 +75,19 @@ "__id__": 5 }, { - "__id__": 66 + "__id__": 69 } ], "_active": true, "_components": [ - { - "__id__": 70 - }, { "__id__": 71 }, { "__id__": 72 + }, + { + "__id__": 73 } ], "_prefab": null, @@ -102,7 +102,7 @@ "_contentSize": { "__type__": "cc.Size", "width": 960, - "height": 640 + "height": 600 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -114,7 +114,7 @@ "ctor": "Float64Array", "array": [ 480, - 320, + 300, 0, 0, 0, @@ -248,19 +248,22 @@ "__id__": 6 }, { - "__id__": 57 + "__id__": 59 } ], "_active": true, "_components": [ { - "__id__": 61 + "__id__": 63 }, { - "__id__": 64 + "__id__": 66 }, { - "__id__": 65 + "__id__": 67 + }, + { + "__id__": 68 } ], "_prefab": null, @@ -275,7 +278,7 @@ "_contentSize": { "__type__": "cc.Size", "width": 240, - "height": 640 + "height": 600 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -326,7 +329,7 @@ "_active": true, "_components": [ { - "__id__": 56 + "__id__": 58 } ], "_prefab": null, @@ -341,7 +344,7 @@ "_contentSize": { "__type__": "cc.Size", "width": 240, - "height": 640 + "height": 600 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -402,18 +405,21 @@ }, { "__id__": 41 + }, + { + "__id__": 43 } ], "_active": true, "_components": [ - { - "__id__": 53 - }, - { - "__id__": 54 - }, { "__id__": 55 + }, + { + "__id__": 56 + }, + { + "__id__": 57 } ], "_prefab": null, @@ -428,7 +434,7 @@ "_contentSize": { "__type__": "cc.Size", "width": 240, - "height": 262 + "height": 263 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -440,7 +446,7 @@ "ctor": "Float64Array", "array": [ 0, - 320, + 300, 0, 0, 0, @@ -553,13 +559,13 @@ "_batchAsBitmap": false, "_styleFlags": 0, "_underlineHeight": 0, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, "_N$horizontalAlign": 1, "_N$verticalAlign": 1, "_N$fontFamily": "Arial", "_N$overflow": 0, "_N$cacheMode": 2, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_N$enableRetina": 0, "_id": "b9rtT8HFhB+aRlMVUwgWwY" }, @@ -679,13 +685,13 @@ "_batchAsBitmap": false, "_styleFlags": 0, "_underlineHeight": 0, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, "_N$horizontalAlign": 1, "_N$verticalAlign": 1, "_N$fontFamily": "Arial", "_N$overflow": 3, "_N$cacheMode": 2, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_N$enableRetina": 0, "_id": "bbcML2sgVD/YS8wLMkuo84" }, @@ -886,8 +892,8 @@ "_fillRange": 0, "_isTrimmedMode": true, "_atlas": null, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_id": "d1eHsjYk9EWr2gwaBHGR8s" }, { @@ -925,7 +931,7 @@ "__id__": 14 }, "_children": [], - "_active": false, + "_active": true, "_components": [ { "__id__": 19 @@ -1012,8 +1018,8 @@ "_fillRange": 0, "_isTrimmedMode": true, "_atlas": null, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_id": "769i+ShNFDY7d+bfuiGFh/" }, { @@ -1132,13 +1138,13 @@ "_batchAsBitmap": false, "_styleFlags": 0, "_underlineHeight": 0, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, "_N$horizontalAlign": 1, "_N$verticalAlign": 1, "_N$fontFamily": "Arial", "_N$overflow": 0, "_N$cacheMode": 2, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_N$enableRetina": 0, "_id": "87mFyGpZpOMYGs0HmWLjQ9" }, @@ -1237,7 +1243,7 @@ "_N$target": { "__id__": 14 }, - "_N$isChecked": false, + "_N$isChecked": true, "toggleGroup": null, "checkMark": { "__id__": 19 @@ -1361,13 +1367,13 @@ "_batchAsBitmap": false, "_styleFlags": 0, "_underlineHeight": 0, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, "_N$horizontalAlign": 1, "_N$verticalAlign": 1, "_N$fontFamily": "Arial", "_N$overflow": 0, "_N$cacheMode": 2, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_N$enableRetina": 0, "_id": "46oKx6E7JC/aSnbXeUrraO" }, @@ -1568,8 +1574,8 @@ "_fillRange": 0, "_isTrimmedMode": true, "_atlas": null, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_id": "dasBuXH4lJbZaV0blB4989" }, { @@ -1607,7 +1613,7 @@ "__id__": 29 }, "_children": [], - "_active": true, + "_active": false, "_components": [ { "__id__": 34 @@ -1694,8 +1700,8 @@ "_fillRange": 0, "_isTrimmedMode": true, "_atlas": null, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_id": "cfO0DHZfFP+pO/CmbuMLc1" }, { @@ -1814,13 +1820,13 @@ "_batchAsBitmap": false, "_styleFlags": 0, "_underlineHeight": 0, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, "_N$horizontalAlign": 1, "_N$verticalAlign": 1, "_N$fontFamily": "Arial", "_N$overflow": 0, "_N$cacheMode": 2, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_N$enableRetina": 0, "_id": "b5LPG0j+lP4J3NQeiyoIU0" }, @@ -1919,7 +1925,7 @@ "_N$target": { "__id__": 29 }, - "_N$isChecked": true, + "_N$isChecked": false, "toggleGroup": null, "checkMark": { "__id__": 34 @@ -1954,6 +1960,102 @@ "_originalHeight": 0, "_id": "ea4HVs3PZPMooZxVgDb4oF" }, + { + "__type__": "cc.Node", + "_name": "line", + "_objFlags": 0, + "_parent": { + "__id__": 7 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 42 + } + ], + "_prefab": null, + "_opacity": 150, + "_color": { + "__type__": "cc.Color", + "r": 0, + "g": 0, + "b": 0, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 240, + "height": 1 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -212.5, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "fdLjmHzURHBoTovn46gkO+" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 41 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "a23235d1-15db-4b95-8439-a2e005bfff91" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, + "_id": "c9/hc9CapODpisEzYuFwpJ" + }, { "__type__": "cc.Node", "_name": "multi-render-batcher", @@ -1963,22 +2065,22 @@ }, "_children": [ { - "__id__": 42 + "__id__": 44 }, { - "__id__": 45 + "__id__": 47 }, { - "__id__": 48 + "__id__": 50 } ], "_active": true, "_components": [ { - "__id__": 51 + "__id__": 53 }, { - "__id__": 52 + "__id__": 54 } ], "_prefab": null, @@ -2005,7 +2107,7 @@ "ctor": "Float64Array", "array": [ 0, - -237, + -238, 0, 0, 0, @@ -2034,16 +2136,16 @@ "_name": "bg", "_objFlags": 0, "_parent": { - "__id__": 41 + "__id__": 43 }, "_children": [], "_active": true, "_components": [ { - "__id__": 43 + "__id__": 45 }, { - "__id__": 44 + "__id__": 46 } ], "_prefab": null, @@ -2099,7 +2201,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 42 + "__id__": 44 }, "_enabled": true, "_materials": [ @@ -2124,8 +2226,8 @@ "_fillRange": 0, "_isTrimmedMode": true, "_atlas": null, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_id": "5eCAXTLddC2YYw0qj1Ydlo" }, { @@ -2133,7 +2235,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 42 + "__id__": 44 }, "_enabled": true, "alignMode": 1, @@ -2160,16 +2262,16 @@ "_name": "check", "_objFlags": 0, "_parent": { - "__id__": 41 + "__id__": 43 }, "_children": [], "_active": false, "_components": [ { - "__id__": 46 + "__id__": 48 }, { - "__id__": 47 + "__id__": 49 } ], "_prefab": null, @@ -2225,7 +2327,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 45 + "__id__": 47 }, "_enabled": true, "_materials": [ @@ -2250,8 +2352,8 @@ "_fillRange": 0, "_isTrimmedMode": true, "_atlas": null, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_id": "c5Ph4qQRRGKLk4UsU2CuP1" }, { @@ -2259,7 +2361,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 45 + "__id__": 47 }, "_enabled": true, "alignMode": 1, @@ -2286,16 +2388,16 @@ "_name": "text", "_objFlags": 0, "_parent": { - "__id__": 41 + "__id__": 43 }, "_children": [], "_active": true, "_components": [ { - "__id__": 49 + "__id__": 51 }, { - "__id__": 50 + "__id__": 52 } ], "_prefab": null, @@ -2351,7 +2453,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 48 + "__id__": 50 }, "_enabled": true, "_materials": [ @@ -2370,13 +2472,13 @@ "_batchAsBitmap": false, "_styleFlags": 0, "_underlineHeight": 0, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, "_N$horizontalAlign": 1, "_N$verticalAlign": 1, "_N$fontFamily": "Arial", "_N$overflow": 0, "_N$cacheMode": 2, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_N$enableRetina": 0, "_id": "20fk8U3rpIGarOxB/zN7Js" }, @@ -2385,7 +2487,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 48 + "__id__": 50 }, "_enabled": true, "alignMode": 1, @@ -2412,7 +2514,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 41 + "__id__": 43 }, "_enabled": true, "_normalMaterial": null, @@ -2473,12 +2575,12 @@ "hoverSprite": null, "_N$disabledSprite": null, "_N$target": { - "__id__": 41 + "__id__": 43 }, "_N$isChecked": false, "toggleGroup": null, "checkMark": { - "__id__": 46 + "__id__": 48 }, "checkEvents": [], "_id": "e7i26YZV1FqKklg91bgGv0" @@ -2488,7 +2590,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 41 + "__id__": 43 }, "_enabled": true, "alignMode": 1, @@ -2533,7 +2635,7 @@ "_layoutSize": { "__type__": "cc.Size", "width": 240, - "height": 262 + "height": 263 }, "_resize": 1, "_N$layoutType": 2, @@ -2617,19 +2719,19 @@ }, "_children": [ { - "__id__": 58 + "__id__": 60 } ], "_active": true, "_components": [ - { - "__id__": 60 - }, { "__id__": 62 }, { - "__id__": 63 + "__id__": 64 + }, + { + "__id__": 65 } ], "_prefab": null, @@ -2644,7 +2746,7 @@ "_contentSize": { "__type__": "cc.Size", "width": 8, - "height": 640 + "height": 600 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -2685,13 +2787,13 @@ "_name": "bar", "_objFlags": 0, "_parent": { - "__id__": 57 + "__id__": 59 }, "_children": [], "_active": true, "_components": [ { - "__id__": 59 + "__id__": 61 } ], "_prefab": null, @@ -2747,7 +2849,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 58 + "__id__": 60 }, "_enabled": true, "_materials": [ @@ -2772,8 +2874,8 @@ "_fillRange": 0, "_isTrimmedMode": true, "_atlas": null, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_id": "9c2SrYmphDVquAHlr87fA/" }, { @@ -2781,18 +2883,18 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 57 + "__id__": 59 }, "_enabled": true, "_scrollView": { - "__id__": 61 + "__id__": 63 }, "_touching": false, "_opacity": 255, "enableAutoHide": true, "autoHideTime": 1, "_N$handle": { - "__id__": 59 + "__id__": 61 }, "_N$direction": 1, "_id": "45lAX/jYFK8bn5il0V2PGf" @@ -2821,7 +2923,7 @@ }, "_N$horizontalScrollBar": null, "_N$verticalScrollBar": { - "__id__": 60 + "__id__": 62 }, "_id": "f1ZKPgwatHKqxBlPMr/vU6" }, @@ -2830,7 +2932,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 57 + "__id__": 59 }, "_enabled": true, "alignMode": 0, @@ -2857,7 +2959,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 57 + "__id__": 59 }, "_enabled": true, "_materials": [ @@ -2882,8 +2984,8 @@ "_fillRange": 0, "_isTrimmedMode": true, "_atlas": null, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_id": "ffwZ4WTWJLeoK7epp1s1o3" }, { @@ -2943,10 +3045,32 @@ "_fillRange": 0, "_isTrimmedMode": false, "_atlas": null, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_id": "08P8DmnE9J748Jelsz9lrw" }, + { + "__type__": "853f5uyG5pFHpEaXeXta1ML", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 5 + }, + "_enabled": true, + "home": { + "__id__": 14 + }, + "multiMaterial": { + "__id__": 29 + }, + "multiBatcher": { + "__id__": 43 + }, + "mainArea": { + "__id__": 69 + }, + "_id": "62KSyy38xD/LU3CscZK3qC" + }, { "__type__": "cc.Node", "_name": "main-area", @@ -2954,15 +3078,11 @@ "_parent": { "__id__": 2 }, - "_children": [ - { - "__id__": 67 - } - ], + "_children": [], "_active": true, "_components": [ { - "__id__": 69 + "__id__": 70 } ], "_prefab": null, @@ -2977,7 +3097,7 @@ "_contentSize": { "__type__": "cc.Size", "width": 720, - "height": 640 + "height": 600 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -3013,58 +3133,12 @@ "groupIndex": 0, "_id": "54WBhHVtBF4JdadFee+PuD" }, - { - "__type__": "cc.Node", - "_objFlags": 0, - "_parent": { - "__id__": 66 - }, - "_prefab": { - "__id__": 68 - }, - "_name": "multi-material", - "_active": true, - "_trs": { - "__type__": "TypedArray", - "ctor": "Float64Array", - "array": [ - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1 - ] - }, - "_eulerAngles": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "_id": "e961JkgDFHhpfE4jDsQXGc" - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 67 - }, - "asset": { - "__uuid__": "c5f3051e-1b4f-4384-939c-b838bcb8f5bf" - }, - "fileId": "", - "sync": true - }, { "__type__": "cc.Widget", "_name": "", "_objFlags": 0, "node": { - "__id__": 66 + "__id__": 69 }, "_enabled": true, "alignMode": 1, @@ -3097,7 +3171,7 @@ "_designResolution": { "__type__": "cc.Size", "width": 960, - "height": 640 + "height": 600 }, "_fitWidth": false, "_fitHeight": true, diff --git a/demo/assets/multi-render/multi-batcher.meta b/demo/assets/multi-render/multi-batcher.meta new file mode 100644 index 00000000..85ab9e3a --- /dev/null +++ b/demo/assets/multi-render/multi-batcher.meta @@ -0,0 +1,12 @@ +{ + "ver": "1.1.2", + "uuid": "6aa6d587-b168-40f9-b961-78e28fc4e9a7", + "isBundle": false, + "bundleName": "", + "priority": 1, + "compressionType": {}, + "optimizeHotUpdate": {}, + "inlineSpriteFrames": {}, + "isRemoteBundle": {}, + "subMetas": {} +} \ No newline at end of file diff --git a/demo/assets/multi-render/multi-batcher/multi-batcher.prefab b/demo/assets/multi-render/multi-batcher/multi-batcher.prefab new file mode 100644 index 00000000..306959bd --- /dev/null +++ b/demo/assets/multi-render/multi-batcher/multi-batcher.prefab @@ -0,0 +1,958 @@ +[ + { + "__type__": "cc.Prefab", + "_name": "", + "_objFlags": 0, + "_native": "", + "data": { + "__id__": 1 + }, + "optimizationPolicy": 0, + "asyncLoadAssets": false, + "readonly": false + }, + { + "__type__": "cc.Node", + "_name": "multi-batcher", + "_objFlags": 0, + "_parent": null, + "_children": [ + { + "__id__": 2 + } + ], + "_active": true, + "_components": [ + { + "__id__": 26 + }, + { + "__id__": 27 + } + ], + "_prefab": { + "__id__": 28 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 960, + "height": 600 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 480, + 300, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "sv", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [ + { + "__id__": 3 + }, + { + "__id__": 14 + } + ], + "_active": true, + "_components": [ + { + "__id__": 19 + }, + { + "__id__": 23 + }, + { + "__id__": 24 + } + ], + "_prefab": { + "__id__": 25 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 25, + "g": 25, + "b": 25, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 960, + "height": 600 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "view", + "_objFlags": 0, + "_parent": { + "__id__": 2 + }, + "_children": [ + { + "__id__": 4 + } + ], + "_active": true, + "_components": [ + { + "__id__": 12 + } + ], + "_prefab": { + "__id__": 13 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 960, + "height": 600 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "content", + "_objFlags": 0, + "_parent": { + "__id__": 3 + }, + "_children": [ + { + "__id__": 5 + } + ], + "_active": true, + "_components": [ + { + "__id__": 8 + }, + { + "__id__": 9 + }, + { + "__id__": 10 + } + ], + "_prefab": { + "__id__": 11 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 785.815, + "height": 110 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 1 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 300, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "tips", + "_objFlags": 0, + "_parent": { + "__id__": 4 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 6 + } + ], + "_prefab": { + "__id__": 7 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 664.92, + "height": 80 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -70, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 5 + }, + "_enabled": true, + "_materials": [ + null + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "点击按钮设置这些渲染组件纹理的关联材质,能看到 drawcall 的降低\n(切换左边的选项卡重置)", + "_N$string": "点击按钮设置这些渲染组件纹理的关联材质,能看到 drawcall 的降低\n(切换左边的选项卡重置)", + "_fontSize": 22, + "_lineHeight": 40, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 0, + "_N$cacheMode": 2, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, + "_N$enableRetina": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__uuid__": "145bba41-1962-49ee-aec9-08fb154e8bf2" + }, + "fileId": "fbSLTYNutL174TDvzvU3nT", + "sync": false + }, + { + "__type__": "cc.ToggleContainer", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 4 + }, + "_enabled": true, + "allowSwitchOff": false, + "checkEvents": [], + "_id": "" + }, + { + "__type__": "cc.Layout", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 4 + }, + "_enabled": true, + "_layoutSize": { + "__type__": "cc.Size", + "width": 785.815, + "height": 110 + }, + "_resize": 1, + "_N$layoutType": 2, + "_N$cellSize": { + "__type__": "cc.Size", + "width": 40, + "height": 40 + }, + "_N$startAxis": 1, + "_N$paddingLeft": 0, + "_N$paddingRight": 0, + "_N$paddingTop": 30, + "_N$paddingBottom": 0, + "_N$spacingX": 0, + "_N$spacingY": 0, + "_N$verticalDirection": 1, + "_N$horizontalDirection": 0, + "_N$affectedByScale": false, + "_id": "" + }, + { + "__type__": "cc.Widget", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 4 + }, + "_enabled": true, + "alignMode": 1, + "_target": null, + "_alignFlags": 41, + "_left": 87.09249999999997, + "_right": 87.09249999999997, + "_top": 0, + "_bottom": 0, + "_verticalCenter": 0, + "_horizontalCenter": 0, + "_isAbsLeft": true, + "_isAbsRight": true, + "_isAbsTop": true, + "_isAbsBottom": true, + "_isAbsHorizontalCenter": true, + "_isAbsVerticalCenter": true, + "_originalWidth": 220, + "_originalHeight": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__uuid__": "145bba41-1962-49ee-aec9-08fb154e8bf2" + }, + "fileId": "98B5382ANHgKQw5BkMsWAq", + "sync": false + }, + { + "__type__": "cc.Widget", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 3 + }, + "_enabled": true, + "alignMode": 1, + "_target": null, + "_alignFlags": 45, + "_left": 0, + "_right": 0, + "_top": 0, + "_bottom": 0, + "_verticalCenter": 0, + "_horizontalCenter": 0, + "_isAbsLeft": true, + "_isAbsRight": true, + "_isAbsTop": true, + "_isAbsBottom": true, + "_isAbsHorizontalCenter": true, + "_isAbsVerticalCenter": true, + "_originalWidth": 240, + "_originalHeight": 250, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__uuid__": "145bba41-1962-49ee-aec9-08fb154e8bf2" + }, + "fileId": "645yltQ0dFpbIcIgDazPDc", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "scrollBar", + "_objFlags": 0, + "_parent": { + "__id__": 2 + }, + "_children": [ + { + "__id__": 15 + } + ], + "_active": true, + "_components": [ + { + "__id__": 18 + }, + { + "__id__": 20 + }, + { + "__id__": 21 + } + ], + "_prefab": { + "__id__": 22 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 8, + "height": 600 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 1, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 480, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "bar", + "_objFlags": 0, + "_parent": { + "__id__": 14 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 16 + } + ], + "_prefab": { + "__id__": 17 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 8, + "height": 30 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 1, + "y": 0 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 15 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "5c3bb932-6c3c-468f-88a9-c8c61d458641" + }, + "_type": 1, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__uuid__": "145bba41-1962-49ee-aec9-08fb154e8bf2" + }, + "fileId": "29pI3SelxAU6ODrNe5LS2g", + "sync": false + }, + { + "__type__": "cc.Scrollbar", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 14 + }, + "_enabled": true, + "_scrollView": { + "__id__": 19 + }, + "_touching": false, + "_opacity": 255, + "enableAutoHide": false, + "autoHideTime": 1, + "_N$handle": { + "__id__": 16 + }, + "_N$direction": 1, + "_id": "" + }, + { + "__type__": "cc.ScrollView", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 2 + }, + "_enabled": true, + "horizontal": false, + "vertical": true, + "inertia": true, + "brake": 0.75, + "elastic": true, + "bounceDuration": 0.23, + "scrollEvents": [], + "cancelInnerEvents": true, + "_N$content": { + "__id__": 4 + }, + "content": { + "__id__": 4 + }, + "_N$horizontalScrollBar": null, + "_N$verticalScrollBar": { + "__id__": 18 + }, + "_id": "" + }, + { + "__type__": "cc.Widget", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 14 + }, + "_enabled": true, + "alignMode": 0, + "_target": null, + "_alignFlags": 37, + "_left": 350.07654921020657, + "_right": 0, + "_top": 0, + "_bottom": 0, + "_verticalCenter": 0, + "_horizontalCenter": 0, + "_isAbsLeft": true, + "_isAbsRight": true, + "_isAbsTop": true, + "_isAbsBottom": true, + "_isAbsHorizontalCenter": true, + "_isAbsVerticalCenter": true, + "_originalWidth": 0, + "_originalHeight": 237, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 14 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "5fe5dcaa-b513-4dc5-a166-573627b3a159" + }, + "_type": 1, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__uuid__": "145bba41-1962-49ee-aec9-08fb154e8bf2" + }, + "fileId": "c2cC2kA1NNeozY+5ZzkcSY", + "sync": false + }, + { + "__type__": "cc.Widget", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 2 + }, + "_enabled": true, + "alignMode": 1, + "_target": null, + "_alignFlags": 45, + "_left": 0, + "_right": 0, + "_top": 0, + "_bottom": 0, + "_verticalCenter": 0, + "_horizontalCenter": 0, + "_isAbsLeft": true, + "_isAbsRight": true, + "_isAbsTop": true, + "_isAbsBottom": true, + "_isAbsHorizontalCenter": true, + "_isAbsVerticalCenter": true, + "_originalWidth": 240, + "_originalHeight": 250, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 2 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "a23235d1-15db-4b95-8439-a2e005bfff91" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__uuid__": "145bba41-1962-49ee-aec9-08fb154e8bf2" + }, + "fileId": "b5RxDsAgFOW6xOyBdbz2rI", + "sync": false + }, + { + "__type__": "cc.Widget", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 1 + }, + "_enabled": true, + "alignMode": 1, + "_target": null, + "_alignFlags": 45, + "_left": 0, + "_right": 0, + "_top": 0, + "_bottom": 0, + "_verticalCenter": 0, + "_horizontalCenter": 0, + "_isAbsLeft": true, + "_isAbsRight": true, + "_isAbsTop": true, + "_isAbsBottom": true, + "_isAbsHorizontalCenter": true, + "_isAbsVerticalCenter": true, + "_originalWidth": 0, + "_originalHeight": 0, + "_id": "" + }, + { + "__type__": "3e9188DEK9FCYlYeL+jvmrQ", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 1 + }, + "_enabled": true, + "label": { + "__id__": 6 + }, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__uuid__": "145bba41-1962-49ee-aec9-08fb154e8bf2" + }, + "fileId": "", + "sync": false + } +] \ No newline at end of file diff --git a/demo/assets/multi-render/multi-batcher/multi-batcher.prefab.meta b/demo/assets/multi-render/multi-batcher/multi-batcher.prefab.meta new file mode 100644 index 00000000..d5d77761 --- /dev/null +++ b/demo/assets/multi-render/multi-batcher/multi-batcher.prefab.meta @@ -0,0 +1,8 @@ +{ + "ver": "1.2.9", + "uuid": "145bba41-1962-49ee-aec9-08fb154e8bf2", + "optimizationPolicy": "AUTO", + "asyncLoadAssets": false, + "readonly": false, + "subMetas": {} +} \ No newline at end of file diff --git a/demo/assets/multi-render/multi-batcher/multi-batcher.ts b/demo/assets/multi-render/multi-batcher/multi-batcher.ts new file mode 100644 index 00000000..f703aa28 --- /dev/null +++ b/demo/assets/multi-render/multi-batcher/multi-batcher.ts @@ -0,0 +1,13 @@ + +const { ccclass, property } = cc._decorator; + +@ccclass +export default class MultiBatcher extends cc.Component { + + @property(cc.Label) + label: cc.Label = null; + + protected onLoad(): void { + + } +} diff --git a/demo/assets/multi-render/multi-batcher/multi-batcher.ts.meta b/demo/assets/multi-render/multi-batcher/multi-batcher.ts.meta new file mode 100644 index 00000000..0218fc77 --- /dev/null +++ b/demo/assets/multi-render/multi-batcher/multi-batcher.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.0.8", + "uuid": "3e918f03-10af-4509-8958-78bfa3be6ad0", + "isPlugin": false, + "loadPluginInWeb": true, + "loadPluginInNative": true, + "loadPluginInEditor": false, + "subMetas": {} +} \ No newline at end of file diff --git a/demo/assets/multi-render/multi-material/multi-material.prefab b/demo/assets/multi-render/multi-material/multi-material.prefab index 8094ce1f..34ba90a9 100644 --- a/demo/assets/multi-render/multi-material/multi-material.prefab +++ b/demo/assets/multi-render/multi-material/multi-material.prefab @@ -290,7 +290,7 @@ "_contentSize": { "__type__": "cc.Size", "width": 960, - "height": 843 + "height": 803 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -485,13 +485,13 @@ "_batchAsBitmap": false, "_styleFlags": 0, "_underlineHeight": 0, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, "_N$horizontalAlign": 1, "_N$verticalAlign": 1, "_N$fontFamily": "Arial", "_N$overflow": 0, "_N$cacheMode": 2, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_N$enableRetina": 0, "_id": "" }, @@ -600,8 +600,8 @@ "_fillRange": 0, "_isTrimmedMode": false, "_atlas": null, - "autoSwitchMaterial": 2, - "allowDynamicAtlas": 2, + "_N$autoSwitchMaterial": 2, + "_N$allowDynamicAtlas": 2, "_id": "" }, { @@ -693,7 +693,7 @@ "_contentSize": { "__type__": "cc.Size", "width": 200, - "height": 390 + "height": 310 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -705,7 +705,7 @@ "ctor": "Float64Array", "array": [ -180, - -195, + -155, 0, 0, 0, @@ -769,7 +769,7 @@ "ctor": "Float64Array", "array": [ 0, - 130, + 90, 0, 0, 0, @@ -817,13 +817,13 @@ "_batchAsBitmap": false, "_styleFlags": 0, "_underlineHeight": 0, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, "_N$horizontalAlign": 1, "_N$verticalAlign": 1, "_N$fontFamily": "Arial", "_N$overflow": 0, "_N$cacheMode": 2, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_N$enableRetina": 0, "_id": "" }, @@ -865,8 +865,8 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 900, - "height": 1200 + "width": 700, + "height": 800 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -932,8 +932,8 @@ "_fillRange": 0, "_isTrimmedMode": false, "_atlas": null, - "autoSwitchMaterial": 2, - "allowDynamicAtlas": 2, + "_N$autoSwitchMaterial": 2, + "_N$allowDynamicAtlas": 2, "_id": "" }, { @@ -958,7 +958,7 @@ "_layoutSize": { "__type__": "cc.Size", "width": 200, - "height": 390 + "height": 310 }, "_resize": 1, "_N$layoutType": 2, @@ -1149,13 +1149,13 @@ "_batchAsBitmap": false, "_styleFlags": 0, "_underlineHeight": 0, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, "_N$horizontalAlign": 1, "_N$verticalAlign": 1, "_N$fontFamily": "Arial", "_N$overflow": 0, "_N$cacheMode": 2, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_N$enableRetina": 0, "_id": "" }, @@ -1264,8 +1264,8 @@ "_fillRange": 0, "_isTrimmedMode": false, "_atlas": null, - "autoSwitchMaterial": 2, - "allowDynamicAtlas": 2, + "_N$autoSwitchMaterial": 2, + "_N$allowDynamicAtlas": 2, "_id": "" }, { @@ -1481,13 +1481,13 @@ "_batchAsBitmap": false, "_styleFlags": 0, "_underlineHeight": 0, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, "_N$horizontalAlign": 1, "_N$verticalAlign": 1, "_N$fontFamily": "Arial", "_N$overflow": 0, "_N$cacheMode": 2, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_N$enableRetina": 0, "_id": "" }, @@ -1596,8 +1596,8 @@ "_fillRange": 0.7, "_isTrimmedMode": false, "_atlas": null, - "autoSwitchMaterial": 2, - "allowDynamicAtlas": 2, + "_N$autoSwitchMaterial": 2, + "_N$allowDynamicAtlas": 2, "_id": "" }, { @@ -1701,7 +1701,7 @@ "ctor": "Float64Array", "array": [ -380, - -520.5, + -480.5, 0, 0, 0, @@ -1813,13 +1813,13 @@ "_batchAsBitmap": false, "_styleFlags": 0, "_underlineHeight": 0, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, "_N$horizontalAlign": 1, "_N$verticalAlign": 1, "_N$fontFamily": "Arial", "_N$overflow": 0, "_N$cacheMode": 2, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_N$enableRetina": 0, "_id": "" }, @@ -1928,8 +1928,8 @@ "_fillRange": 0.7, "_isTrimmedMode": false, "_atlas": null, - "autoSwitchMaterial": 2, - "allowDynamicAtlas": 2, + "_N$autoSwitchMaterial": 2, + "_N$allowDynamicAtlas": 2, "_id": "" }, { @@ -2033,7 +2033,7 @@ "ctor": "Float64Array", "array": [ -180, - -480, + -440, 0, 0, 0, @@ -2145,13 +2145,13 @@ "_batchAsBitmap": false, "_styleFlags": 0, "_underlineHeight": 0, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, "_N$horizontalAlign": 1, "_N$verticalAlign": 1, "_N$fontFamily": "Arial", "_N$overflow": 0, "_N$cacheMode": 2, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_N$enableRetina": 0, "_id": "" }, @@ -2254,13 +2254,13 @@ "_batchAsBitmap": false, "_styleFlags": 0, "_underlineHeight": 0, - "autoSwitchMaterial": 2, - "allowDynamicAtlas": 2, "_N$horizontalAlign": 1, "_N$verticalAlign": 1, "_N$fontFamily": "Arial", "_N$overflow": 0, "_N$cacheMode": 2, + "_N$autoSwitchMaterial": 2, + "_N$allowDynamicAtlas": 2, "_N$enableRetina": 0, "_id": "" }, @@ -2365,7 +2365,7 @@ "ctor": "Float64Array", "array": [ 20, - -480, + -440, 0, 0, 0, @@ -2477,13 +2477,13 @@ "_batchAsBitmap": false, "_styleFlags": 0, "_underlineHeight": 0, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, "_N$horizontalAlign": 1, "_N$verticalAlign": 1, "_N$fontFamily": "Arial", "_N$overflow": 0, "_N$cacheMode": 2, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_N$enableRetina": 0, "_id": "" }, @@ -2590,13 +2590,13 @@ "_batchAsBitmap": false, "_styleFlags": 0, "_underlineHeight": 0, - "autoSwitchMaterial": 2, - "allowDynamicAtlas": 2, "_N$horizontalAlign": 1, "_N$verticalAlign": 1, "_N$fontFamily": "Arial", "_N$overflow": 0, "_N$cacheMode": 0, + "_N$autoSwitchMaterial": 2, + "_N$allowDynamicAtlas": 2, "_N$enableRetina": 0, "_id": "" }, @@ -2701,7 +2701,7 @@ "ctor": "Float64Array", "array": [ 220, - -475, + -435, 0, 0, 0, @@ -2813,13 +2813,13 @@ "_batchAsBitmap": false, "_styleFlags": 0, "_underlineHeight": 0, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, "_N$horizontalAlign": 1, "_N$verticalAlign": 1, "_N$fontFamily": "Arial", "_N$overflow": 0, "_N$cacheMode": 2, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_N$enableRetina": 0, "_id": "" }, @@ -2927,8 +2927,8 @@ "a": 255 }, "_fastMode": false, - "autoSwitchMaterial": 2, "_N$preview": true, + "_N$autoSwitchMaterial": 2, "_id": "" }, { @@ -3032,7 +3032,7 @@ "ctor": "Float64Array", "array": [ -380, - -747, + -707, 0, 0, 0, @@ -3144,13 +3144,13 @@ "_batchAsBitmap": false, "_styleFlags": 0, "_underlineHeight": 0, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, "_N$horizontalAlign": 1, "_N$verticalAlign": 1, "_N$fontFamily": "Arial", "_N$overflow": 0, "_N$cacheMode": 2, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_N$enableRetina": 0, "_id": "" }, @@ -3260,8 +3260,6 @@ "_headAniInfo": null, "_playTimes": 0, "_isAniComplete": true, - "autoSwitchMaterial": 2, - "allowDynamicAtlas": 2, "_N$skeletonData": { "__uuid__": "bcd99389-a393-426e-b234-157c62b44bc4" }, @@ -3271,6 +3269,8 @@ "_N$debugMesh": false, "_N$useTint": false, "_N$enableBatch": true, + "_N$autoSwitchMaterial": 2, + "_N$allowDynamicAtlas": 2, "_id": "" }, { @@ -3374,7 +3374,7 @@ "ctor": "Float64Array", "array": [ -180, - -747, + -707, 0, 0, 0, @@ -3486,13 +3486,13 @@ "_batchAsBitmap": false, "_styleFlags": 0, "_underlineHeight": 0, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, "_N$horizontalAlign": 1, "_N$verticalAlign": 1, "_N$fontFamily": "Arial", "_N$overflow": 0, "_N$cacheMode": 2, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_N$enableRetina": 0, "_id": "" }, @@ -3602,8 +3602,6 @@ "_headAniInfo": null, "_playTimes": 0, "_isAniComplete": true, - "autoSwitchMaterial": 2, - "allowDynamicAtlas": 2, "_N$skeletonData": { "__uuid__": "bcd99389-a393-426e-b234-157c62b44bc4" }, @@ -3613,6 +3611,8 @@ "_N$debugMesh": false, "_N$useTint": false, "_N$enableBatch": true, + "_N$autoSwitchMaterial": 2, + "_N$allowDynamicAtlas": 2, "_id": "" }, { @@ -3716,7 +3716,7 @@ "ctor": "Float64Array", "array": [ 20, - -746, + -706, 0, 0, 0, @@ -3828,13 +3828,13 @@ "_batchAsBitmap": false, "_styleFlags": 0, "_underlineHeight": 0, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, "_N$horizontalAlign": 1, "_N$verticalAlign": 1, "_N$fontFamily": "Arial", "_N$overflow": 0, "_N$cacheMode": 2, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_N$enableRetina": 0, "_id": "" }, @@ -3943,8 +3943,8 @@ "_fillRange": 0, "_isTrimmedMode": false, "_atlas": null, - "autoSwitchMaterial": 2, - "allowDynamicAtlas": 2, + "_N$autoSwitchMaterial": 2, + "_N$allowDynamicAtlas": 2, "_id": "" }, { @@ -4024,7 +4024,7 @@ "_layoutSize": { "__type__": "cc.Size", "width": 960, - "height": 843 + "height": 803 }, "_resize": 1, "_N$layoutType": 3, @@ -4289,8 +4289,8 @@ "_fillRange": 0, "_isTrimmedMode": true, "_atlas": null, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_id": "" }, { @@ -4410,8 +4410,8 @@ "_fillRange": 0, "_isTrimmedMode": true, "_atlas": null, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_id": "" }, { @@ -4482,8 +4482,8 @@ "_fillRange": 0, "_isTrimmedMode": false, "_atlas": null, - "autoSwitchMaterial": 0, - "allowDynamicAtlas": 0, + "_N$autoSwitchMaterial": 0, + "_N$allowDynamicAtlas": 0, "_id": "" }, { diff --git a/docs/docs/intro.md b/docs/docs/intro.md index 93fa4881..252234c9 100644 --- a/docs/docs/intro.md +++ b/docs/docs/intro.md @@ -63,6 +63,7 @@ TODO - [新特性] cc.Label、cc.RichText、cc.Sprite、cc.MotionStreak、Spine 组件支持使用多纹理材质,并支持自动切换材质机制 - [新特性] cc.RichText 支持使用自定义材质 - [修复] 直接修改 Effect 的属性不回导致其变体的 hash 值刷新 +- [修复] CHAR 缓存模式 hash 计算可能会有重复的问题 - [调整] 默认禁用 Label 原生 TTF 渲染器 所有更新日志请移步 [此处](./update-log)。 @@ -96,4 +97,9 @@ TODO 对于已经修改过引擎的人,由于服务包提供的是 Git Patch,所以可以让你在已有修改的基础上轻松应用上服务包的改动,甚至你可以只应用你想要的特性。 +### Cocos Creator 报 Error: Can not parse this input:undefined 错误 + +没有找到服务包的内置资源,请记得安装配套的引擎扩展。 + +--- **最后的最后,希望这个项目能帮助到你的学习或工作,enjoy!** diff --git a/docs/docs/start-guide/advance-batcher-guide.md b/docs/docs/start-guide/advance-batcher-guide.md index 2c722805..515a7879 100644 --- a/docs/docs/start-guide/advance-batcher-guide.md +++ b/docs/docs/start-guide/advance-batcher-guide.md @@ -6,3 +6,7 @@ description: "极致地减少游戏 Draw Call。" # 进阶合批指南 TODO + +动态图集与字符图集使用这个管理器来实现多纹理合批,使用的全局实例可以通过 `cc.sp.multiBatcher` 访问。 + +如果你的资源规划地非常细致,项目本身有已经打好的大图集,那么你就可以考虑 diff --git a/docs/docs/start-guide/batcher-guide.md b/docs/docs/start-guide/batcher-guide.md index 26c25d5a..ad3332a7 100644 --- a/docs/docs/start-guide/batcher-guide.md +++ b/docs/docs/start-guide/batcher-guide.md @@ -67,66 +67,66 @@ description: "在游戏开发中享受不用关注 Draw Call 的快乐。" --- ## 充分利用动态合图 -启用动态合图后,我们有几个小提示能让你发挥出动态合图的潜力: +下面几个建议能让你发挥出动态合图的潜力: ### 放宽能参与合图的纹理尺寸限制 -你可以适当地放宽能参与合图的纹理尺寸的限制(`cc.dynamicAtlasManager.maxFrameSize`)。 +**动态图集会自动进行多纹理合批,你可以放心地使用多达 8 张图集而不用担心交叉渲染导致的打断批次!** -推荐设置为 `512`、 `1024` 甚至 `2048`。 +有了这个新特性,你可以根据项目的具体情况来放宽能参与合图的纹理尺寸限制。 -因为**动态图集会自动进行多纹理合批,你可以放心地使用多达 8 张图集而不用担心交叉渲染导致的打断批次!** +```js +cc.dynamicAtlasManager.maxFrameSize = 1024; // 推荐 512、1024 甚至 2048 +``` :::tip -服务包会自动将图集最大数量调整至(设备能同时采样纹理数 - Char 缓存模式自动合批图集数),这个值默认为 `7`。 +服务包会自动将图集的最大数量调整至(设备能同时采样纹理数 - Char 缓存模式自动合批图集数),这个值默认为 `7`。 ::: ### 无需管理动态图集,只需要释放资源 -**动态合图支持复用废弃空间,释放纹理的同时会释放其在动态图集使用的空间。** +**动态合图会在纹理被释放的同时释放其在动态图集使用的空间。** -所以一般不需要去关心动态图集,只需要做好资源释放,就不会发生动态图集被用完的情况。 +有了这个新特性,你不需要关心动态图集,只需要做好应有的资源释放,就能保持动态图集的长期有效。 ### 更加细致地优化图集的使用效率 -除了引擎自带的 `packable` 属性可以控制纹理是否会参与动态合图之外。 +除了通过调整纹理的 `packable` 属性可以控制纹理是否会参与动态合图之外。 -服务包还额外支持了**控制组件是否默认参与动态合图,也可以控制单个组件是否参与动态合图。** +**还可以控制组件是否默认参与动态合图,也可以控制单个组件是否参与动态合图。** -有关动态合图的设置可前往 [动态合图](TODO) 的文档了解详情。 +可前往 [动态合图](TODO) 的文档了解详情。 -在上面我们推荐可以将纹理尺寸限制放宽到 `2048`,这听起来貌似有点离谱,但只要规划好项目的资源确实可行,比如: +在上面我们推荐可以将纹理尺寸限制放宽到 `2048`,这听起来貌似有点离谱,但只要规划得当确实可行,比如: -- 将优化程度有限但尺寸具大的纹理禁止参与动态合图 -- 分模块存放资源,将冷门界面(如活动)的纹理禁止参与动态合图,或尽早释放掉 -- 在资源已经一团糟的项目中,可以直接禁止渲染组件参与动态合图 +- 禁止优化程度有限但尺寸巨大的纹理参与动态合图 +- 分模块存放资源,禁止冷门(如活动界面)的纹理参与动态合图或尽早地释放掉 +- 在资源已经一团糟的项目中,可通过代码禁止某个界面下所有的渲染组件参与动态合图 + +完成上面几点这可能需要一些工作量,但能将动态图集用在刀刃上,发挥更大的作用。 --- ## Label 不再是合批噩梦 在项目之前的开发中,我们可能会使用字体图集、调整节点顺序,甚至修改渲染流程来解决 Label 的性能问题。 -但是引擎不是提供了 Bitmap 和 Char 两种缓存模式吗? +引擎提供的 Bitmap 和 Char 两种缓存模式在稍大一点的项目上就显得力所不及了: -是的,但是这两个解决方案与旧的动态合图一样在生产环境中使用太过 "玩具" 了: +- Bitmap 缓存模式:字体纹理会打入动态图集,但动态图集却无法复用,随着游戏的进行,图集用完则直接失去作用。 -- Bitmap 缓存模式的缺点:字体纹理会打入动态图集,而动态图集无法复用,随着游戏的进行,图集用完则直接失去作用。 +- Char 缓存模式的缺点:还是无法复用,并且只有一张图集,图集用完则直接无法渲染,应该没人能接受游戏可能跑着跑着字就全部消失了的情况。 -- Char 缓存模式的缺点:还是无法复用,并且只有一张图集,用完则直接无法渲染,试问谁能接受游戏可能跑着跑着字就全部消失了的情况。 - -所以,**服务包几乎重构了 Char 缓存模式,除了解决不能复用的问题之外,由于支持了多纹理渲染,所以既可以与动态图集一起合批,还拥有高达最多 8 张字体图集可以使用!** - -接下来我们有几个小提示能让你知道如何选择合适的缓存模式: +但,**服务包重构了 Char 缓存模式,除了解决不能复用的问题之外,由于支持了多纹理渲染,所以既能与动态图集合批,还有最多 8 张字体图集可以使用!** ### 委以重任一把梭 —— Char -遇事不决,先选 Char 缓存模式。 +**如果你不知道该选择什么缓存模式,那就遇事不决,先选 Char 缓存模式。** -虽然 Char 模式也有一些缺点,但能够应付大多数的场景,由于它既能与动态图集一起合批,还是是按字符进行复用的,所以相比 Bitmap 模式它有着更高的性能优势。 +虽然 Char 模式也有一些缺点,但由于它既能与动态图集一起合批,还是是按字符进行复用的,所以相比 Bitmap 模式它有着更高的性能优势。 -而且不用担心这 8 张字符图集会被用完,内部会用引用计数自动释放废弃字符所占用的空间,可以试着想一下你的游戏最多在同一帧会显示几个字符。 +不用担心字符图集会被用完,内部会用引用计数自动释放废弃字符所占用的空间。 但 Char 缓存模式不适合下面的场景: @@ -141,37 +141,37 @@ description: "在游戏开发中享受不用关注 Draw Call 的快乐。" 在解决了动态图集的复用问题后,Bitmap 缓存模式的纹理也会使用引用计数自动释放,并且不会有 Char 缓存模式无法显示字素簇的问题。 -但当然,Bitmap 缓存模式也不是万能的,如果遇到了下面这种情况就再考虑调整节点顺序等方法来解决吧: +但当然,Bitmap 缓存模式也不是万能的,如果遇到了下面这种情况,就需要考虑使用调整节点顺序这样的老办法来解决了: -- 巨大的字体大小也会瞬间占满整张动态图集 -- 在非常大量的 Label 需频繁改变文本的情况下,请使用性能分析工具检查动态图集的性能消耗,避免合批的弊大于利。 +- 巨大的字体大小也会瞬间占满整张动态图集,动态图集也不能这么霍霍。 +- 在大量的 Label 需频繁改变文本的情况下,请使用性能分析工具检查动态图集的性能消耗,避免合批的弊大于利。 + +:::caution 注意 + +无论使用哪种缓存模式,在做缩放动画时不要对 `fontSize` 属性进行缓动,这会导致每帧都需要重新生成文字纹理,造成巨大的性能负担,可以使用节点的 `scale` 来代替。 + +::: ### 关于字符图集与动态图集 -常见的误区: +**1.Char 缓存模式所使用的字符图集与动态图集并不是一个东西** -#### 1.Char 缓存模式所使用的字符图集与动态图集是一样的东西,只是叫法不同 +有多种因素导致没有让 Char 缓存模式直接使用动态图集,在 Char 缓存模式的原理文档中有详细解释。 -由于多种原因,没有设计让 Char 缓存模式直接使用动态图集,这当然可以做到,但是权衡之下选择了分开实现,在使用指南中有详细解释。 +多纹理材质只有 8 个纹理插槽,所以默认情况下动态图集最大数量为 7,字符图集自动多纹理合批的数量为 1(注意,这个不是指字符图集的最大数量,字符图集的最大数量是 8 张,并且不能调整)。 -多纹理材质只有 8 个纹理插槽,所以默认情况下动态图集最大数量为 7,字符图集自动多纹理合批的数量为 1。(注意不是最大数量) +你可以自己调整这个分配值,比如 6 张动态图集,字符图集自动合批 2 张,保持数量加起来不超过 8 张,也就能保持 1 Draw Call。 -你可以自己调整这个分配值,而服务包使用这个默认值有以下几点原因: +而服务包使用这个 “7 + 1” 的默认值有以下几点原因: - 引擎原本就只有 1 张 Char 字符图集 - 大多数项目因为 Char 缓存模式加入了可复用的特性后,1 张 Char 字符图集是足够的 -如果你直觉认为 1 张太少,我们建议你合理搭配使用 Bitmap 和 Char 两种缓存模式后,实际测试发现不够再调整该值。 +建议你合理搭配使用 Bitmap 和 Char 两种缓存模式后再进行实际测试,发现 Char 字符图集 1 张是真的不够再对其做调整。 -**请注意上面的 1 并非是字符图集的最大数量,而是字符图集进行自动多纹理合批的最大数量!** +**2.Char 缓存模式依然不能在图集用完的情况下正常渲染** -所以这并不意味着字符图集只能有 1 张,而是最大能有 8 张,并且这个数量不能调整。 - -如果你还是对为什么会出现一个 “字符图集进行自动多纹理合批的最大数量” 而一头雾水,建议详细阅读使用指南。 - -#### 2.Char 缓存模式能在图集满了的情况下依然能正常显示 - -现在如果字符图集满了,依旧不能正常显示,这样的原因有以下几点: +原因有以下几点: - 我们认为 8 张数量已经够多了,8 张都用完的情况大部分是没有合理搭配使用两种缓存模式 - 8 张是多纹理渲染的上限,这意味着如果超过 8 张,1 个 Label 有 100 个字,就可能有 100 个 Draw Call @@ -182,7 +182,7 @@ description: "在游戏开发中享受不用关注 Draw Call 的快乐。" 以上就是新合批指南的全部内容了,稍微总结一下渲染批次合并的几个要点: - 启用动态合图,只需要合理地释放资源即可保持动态合图的一直有效 -- 能就优先用 Char 缓存模式,不能则换为 Bitmap 缓存模式,字数太多字体太大的则放弃挣扎使用 None 模式 -- 不要优先考虑打图集,修改节点顺序等需要维护成本的优化方式 +- 优先使用 Char 缓存模式,不适合则使用 Bitmap 缓存模式,都不适合则采用老方法 +- 不要优先考虑修改节点顺序这种需要维护成本的优化方式 如果你对批次合并还有着更高的需求,可以阅读 [进阶合批指南](./advance-batcher-guide)。 diff --git a/docs/docs/update-log.md b/docs/docs/update-log.md index 8c3e61c7..ca733c02 100644 --- a/docs/docs/update-log.md +++ b/docs/docs/update-log.md @@ -17,5 +17,6 @@ sidebar_position: 7 - [新特性] cc.Label、cc.RichText、cc.Sprite、cc.MotionStreak、Spine 组件支持使用多纹理材质,并支持自动切换材质机制 - [新特性] cc.RichText 支持使用自定义材质 - [修复] 直接修改 Effect 的属性不回导致其变体的 hash 值刷新 +- [修复] CHAR 缓存模式 hash 计算可能会有重复的问题 - [调整] 默认禁用 Label 原生 TTF 渲染器 diff --git a/docs/docs/user-guide/multi-render/assets/autoswitch-settings.png b/docs/docs/user-guide/multi-render/assets/autoswitch-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..e12e8e7b5e859e91bcc12ea4ce2a9ad6cca8e52a GIT binary patch literal 87299 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

`ACdLT z!3mg(y_i;AF+i7ZW4Xs&RPeSBi%g>7QVyc#sGe2v)lYYLR9~pR>Y|zVvM;!;e`$<5 zgnAODv9LX2RcKrX!|8e$PQyVzuXjKgH24biJEMU5`oK1tQU~2o5p|kdJwS00BaW3| z(AQOmf&O!{|J}@^3f8`K@Kk@lLg$~Z?6YjSto=DutiM$}46kLGX$W{l<7qxx-)j%} zow+|}lhn3U9iWDHyg?&lIaTF+z5d*abCR|<*jXFNHTs3X@Z^J?smTr%VfSF+J&jvKqoBGv0U-8j`W0<95QJ@9C%RZJ< zvY{8KARv;J(8|!?HXqoph%&ruQ4_gfP(x`3 zFqqP*22+g3i=A=Yft=TT;S~;(7b@B@5Po&4T0|V*#t-_t+onk_46Hx*NPjVkj;t3P zV^Fn}5?d5kXPaZSIM&M;(Of}n++4fBT$1s_4(Y&c01^Nw+WRh#@j^?K>JaGdE;CZ)G+vrxk##Q(i-bP?#B%XB+dK6B>edAIL ziR9urETT^lb>nk6m)^`Gpf|OjhB0-{17_Nbi5Vg?uY(JFp>jn?kIDnUk1IsCWOLmB zWEqG01N>xWl*CSO*Da)E15xm~9{OLyDz}q=&il~S0;n9N>Y6@-q9icKIs_QQ3XWIfJo!1V9r}En6u{O#fl(%+UHofj0>- ziBC1VIa$RF2I9%*hj&HX?Yj6_@G5a!!8o-p>V8K2sK|g&6@&V(7rgK%$1SZjhbiw> z5yzELEYMOF*RlZoWG5s5vpwDMqQ`VzoBF3hj8dM=7YNsOcp4$4CGCij3cEW{M-)iY zIcZM88|R~Mdab;1JH2{x23R#U+&3v+_1(tn0LITI-^}&Gs4uPR%ZW)FS#RWaap98< z`rBjkF00~Qi4ecFvXfqk_(z+-cmvY?cyix`mWvfkzeqjzJRcd^+!##1jWnyWm`$*o zJwez-bVG@Z=G+#?y5v<#T=i@zYinT!m(uDr${5UW5e_6(kK zl~B@KTv%}Kw>jQup!YSTrB;vl2mINJyyS)+(3%oU+kC=oZ9W)Zj8N^!T}hCeG2|v5 zPdrzSNR^q*>?CWDBM`nW+^UvHNy6jt_p+sMUY^XI z@Ej$9)9>8-A5&usPZ~IEb-U3-)v&-0Dkf(5)arJ3t~~Ss1F0RgblGZwgACZKszPX_ za$9UMp_lM)6UnSIz!XQND)f~s#A2u3c2gHoG{e$RH+X3;`vUAuz^;SV<*Py+(|rNQ zlGP+BEqYX~RgIt!ujd#>Zh}+a0ia?gmEoz`ve?xMmD4ii*#;r+8n|Q;#@ffZ^pfy_ zXxATm8SO-uawezq&F@dpj2q_jui2CO8046HL9S^A7%V1GbS1u9f4sv2+5@?-?crOU zk#25o!^%R-3$uq@cgniE5pwO4fC(Kh)aP62(^$Bmh<|11-E}g%9G`L><{ED8B8D(d zTCar41Fr3N)G$hycqo?G|9bjUeJ~N#we#l5HS;iWe zUrb7OpnmiVTYA*|G;s_Hb}7i7`E8EzI<-X;cgljihJ?t12SastzwSLwm)(LiU4t5P zg8irYKw=yb{jGXM1ufyKxtBhBAkTfouCR>H=GRy8tgZII~ zM$+Ql`i^k0$qPxGh6}#Hvelw#3Z?#8AwSdr-nrNRx^rB1_mzl{$S=|YU8ty|ExuNStAf)f#UunjXQFzVv_)Gq>x}Xz+n2G3n+>9xq!E|1_QRDAwC?Or!fChX zXYyyF{0>%(EE>vpan9Ui-}Efj;2W)U&34=O*SqyfE!A`ymfUHG^B3u#M2egJnhF7P zd7GwLi++iyP!vmBWu!PlMZ3d&VqoJgPJ=2H|zBR+)q?}`Xnbj8<1C?iG^oe*3kM&s(V1|0ovhLZy-8Y_|l zc0+RI*LR{=RODqg%~$#HgzO))a~ zSPoAC>%>F>>*PcY>)y6}xlZbKF`RXGthj17c=fJl+w+dFj>sO|xgT<`9XcYNcAgw6 z2OW9y8~vYYFQBH2Ku&@Z=hQSd8~mkOOQuR4Q=`!D3dIP(>SHHGDz za8z#!GcjRst=9aJ&+S#Hb+A8PG!xN=<=g<^D~Vv;`tc^_*?&2(gQcRGKorXU;#*-I zUNa+tWI^wE9_@Fj%7bi5Cilvy8IQRroQ7jU5@XwJy!?uU<&_<_F(90^Jt5zGJN=eET>dbGO;av-fyhX5SjoF=DaZ zKLE|XsiGNoRF+ucP;wXag>}K3;-ofX+3+_MuO7eEWnJXdT#s>>0UhRvqPoqy zn4Y3w+l`&1?L%)Q(I3o6v6P~twy-#{O<(zW?a$x!ze;_-YZ>CNa#UG#RDQHbXvDlm z9kiY>+)MSj?#vR%^t)ky>JKqdG~oju~~p_V+Z*#xp&h{BEmP5_4i%>16Pv9 z{$%g}r>JTw;ED?$yFz>|@Fu2*?Kc(sFXsA`6^uK68`!!r5ChPvu_J~(5N!zO_W+Pr zAOY#w-#^@GSPZ26=a`v9#1fDp`nzUVqTY#B*rG{J2B5l0mvP6#T@I4{b6A%`IY_60 zDf)V_h-u3y!zPM<0ai1O!9pE+qH0!nxqY5coMb7|l5tyHk~hhOl1}>_9ekql`%Wyl z5Mb1$#C|pk=s|zMpD(~uX~-BzD-6;L*~iF<-kqYqk^^-Pp)Aho{s3}-)$(L+r2Uha z?oVW_n6*WC7UT)^b-j?h$EU8b#*h)Wiaym&)A5u2C-IiJ|7n{!A`(hir-{dGPssQ2 z8@@JqXn&P7{#Y>Gw+{`OU;nX9Hddstwjaexp}5B2Ug>AjfkkCzQIX)jm>%2WC3?ao zGX6xbSRg87?DU7CF7%0&xR(I3dW^k%1)$%&Q^Y}ydpjnM0UJ%w_<7?}XaXz(3!K zv2z%VDe5u9`2;HsC8I&@Uw1|x?8y3w z8!(#_dsWVJ0j&{qCjndBneBSYg6S4Zjtgjq&&&GmON{}~DZS;6$+vawz^F-t$H4e{B-dwNnLCZ29Zobw$keg(TI zY)T@y6pPCAd9{$M=8^H|8kB+!JIP|-U_u;AJ@DmPBAqv|Nqs3G6`_fx4{knMZ>DMl zz!Y)#j_e|Ac??8d3}Z9>Zm$5r6vPRboqhr+Y9nyUs;djRKmN?C>&l(4mGizUIGl0; z`{?hNHn`es#6SvpG4Cta#~7WXF`Xv8nD?r4~xLLoaH1&)yU0yUqYRyp(DIWr_}V0YN|Z#z(J> zGlWcT5bBa12e(O1nb@&DBa_gjLd%&t{Dhr@rzZ#MMcE0JS}w9O?yn$!a(ZyZradA_ zL`HO}sc-C8PHQFusXRz}o60s=6nm(h=qi?|%9NY*0LiOlaQT2>NFwmTQjtR{PTU3E# zTMsJd{T->5bcpghI&6VK#!KE9P5yL=tvU1tp2bjTO*iqQ(DBCS5B0>e&Xz}Woha)w zFxk>-BQQRJmxzEq9jn|l3Z|ym0V#<|%dY`U#FwWH8I$)7)%;Z&E=(2y3Z9FeA)A-h zm?&g8PZQc-1^V6)D4}AW6|Om&GrU8M*J{f++FzUyhKv(1oy@bM@V6`1vaP~m!!12K zohbr=i0b$IN0!1`M%*U9ARWd$*@tr#2N#7k2|@`U&MCOJYPn8uZZJeLyMhL(<;*ix zKC49=%ht$h+mZLW47zhH=vnFyU|Ik*H8@Gdf<=#ldnXaJ2!v$it{iWf{4E`zIB`&1 z*GO|#85A>Xr;{|0$G~yG@ae8SG1=-fT1y*Akp}l%l#$ohHx;M!7V43UjbLK2vg%5M z1+Yeu59>~LJbk6eqjcuEL_|q!x>?Hi?yciro{-xAeFSyrooFI*$=sP!-}G2U4?Yoa zxM(CzRV&*dQV{gk;8plKU`f0^4NJ?Pn`dTJ@bzZ9?gjJ~6PeDvDdJFz*JQARLy*D~ zG;K#_8vLb}S)YAh@v5Q*eh3_TYT)^$w#U-<3Mu{xv; zLh!9!o)n~iYV3UqC2_r1PH17=>WY2yH;@_fJ~cBD8Z@u)Sm&ExC!vUVy~FEtK6hAuz2E08jDe!`oymqYmt%GB z#S95jzJyR8Fpm&#?s^Jy-dvqHrf#z2Oy|&Ghk;M6RU}?t8N|$dB-sOjTzd&tEE`hM z4Rz~UZ(AI7PmZrud@;0Z!?>mZGUmF5%+&VkV8s}eC*Ts~+6NHyGhB4AN*zpa2jAMZ zC?{^eWN-3Gn>5AqiupCb&Gh@xZDeYsr3{>Da5=a^X<_&++s{I(@M|Id|9B@Dk}^7M zjTSmgeV#~`sNf%AgpvCsc|;i|kGkK!xiA;xJ|yivi8ipix^)U)#kVzjpEDz(;$gca zuv}0`O42pSwvFhDU9WTn8Ma()+md9|o_jgj(;#tGSyZg+$_rAi2KF8kwlx3yK`p#+ z_*D0sQ;m?>?ZHi)XQfFqDG5Bp$71V@hE)1>{@?ZMzPxo=uU>71bHs$4_MN(>S)ViE zXqegR#PM!rbw)YCRVyw`E z5O}_xCWUk#EmlSE^Z2z>c(=x2p4M9kAq`k#x){S#V=J~!#Xo8~=|;sV2}j&i8v+0W zdyII%2!8WShiU%Gq}Mn|?1|0df6g&2UY)4~In7iK-B2cjMetO)EZogD*5-nbKZ3Rg zw*Z=CDk4m+&mk=X=CJZ5q(ySY#19ylKPUzN#1IKJ6}rXjMEbL)0yZ0Nsg*FtxeE@r z3mq`tJ4n4-uHm;WsGsiv^gKsG@gm`UVO?9q0@J(6O1HYkRl<80nM&_oio1OxJ{VtX zvgI+RN2hb@vHg?t#6>8)uHKEd(o--=VGDhkvbuII&A1BaO{C~k)3d*t=wrmhy-#bw zb**%cFwAe$u$gOmP+$VCtHkfGC4OIhB&uxSnZ)lPh5yv7;5W#(?RXn*)R6}qb~jyodx{+t(zzxqh^TR z(#UuxD`W;lfdpmA}5C-)ED3z z(EfD7PFH?(gmd(3ZoVI~(=^VP0`0na@$We>Hd`=A!q-gPo2N>#D~NKO^X!&N)~4la zpt=cOOar@*MEo=*6MA|@%kWkE%qU=nI%OGgSB-vtd;WRluVdXps^eVyXoOzqr<=cR zaKQI?6zk77yUv&kzQo!s;jDpgV82%M+tP0!?MOMR@dTc}g?&QiCAp7!DI%3S^*Q>G z*XRfZW_pHoEoHei>2iPtP(z1f$QyTAZhiQdc>%I7qGn4XQ7dv-IrY#Rni+iDuJ?YB z?tEkLAtfF$Q`Cz!_Y`)bAU^fywNFG(??EaC>z3wfZ@w>5+=Da^em3`>`_$Km4SU}R z5o(5BUpbXzF8yAZgys3^8Zl$34K@+#jXPk(7tl31`;wpD4L$Vt$BVou%e_{*M63{T z{~tN=G2*tTZT6mRtsY|=fMvo(rGIhK&_Bed*fE|+QtYsm&d59jv&8@-b)=a7Q|9hc zRGF2?X01!~Q(zI{W6FcU>T1#LBtF!97m1Hq%2Lwsc;7-U9U-!A*jlLMXNhhxH- z#mQ~vjHxyN5NW2Qf`^~{((5L*_$eXSe_1s1<XgE_-fEABZt8|M`!Gh>On=|zv6(lFEV5UvN3yl zfg&Aa>S5ZWAxpL(wLf)04TUxKwQzjf1ICBdXQ-pf#qdM)1!2xYgj2c1MoYwQK~aEg zJ{+ky0znG_+J>HQAYafo%D?Y*d-=(a{prtvCl2Yn0s2?hJ3_b!bf+K1I6crRKf!Sz z<8+XJpa5i8BLk(7(xxus2`u@uE&8dyy`dX9F{7wXSvKJ$7BG5p{ZjOQ9Laz6#(#eT zXrjOb-~^jJRZiFso>z+HD*hL0V$J-j|nLMPM+*aQ~|mJ+jzI}Jy2toHwMx|H-t=eRZvMpc`8Z;Bt+aw)DO-NzMC z25g#;YnDq(xvRKb_Zc5a@2p6A;eaF|V&Q)_3!Y@6sA93vq2&AyVM)Tm`UQzVi>h9) zMXc=Y%=jsMZ)QFGpj!PYNo4SplG)#t!2zDkp8%cB#y_BlR7?ne@f&&%5Mn|Gy`3kj z^LHZ?I!3|cW@uKd)xJPLLVrCE(N#hIpBX;n_Z29l|C$JcOYHA&rD#^7)mHQK{}BzJ z_I{;Tcc=O7*dq!aqSJy){(jd#p8WO~?|Vu=Fjg?`EKNB1kLzOO%!`+M=u#Ga% z3;n}3TaWg)R0ixwFrWbsdFEw`v!rV?-7kq~eEu>MjVZ){z_&=9yJ=MQ1d})~kuCA^=fJW2#b_prIi8^(K@ISsktolDd5z4>x%)5QZ zvexVN8U9%T@uB{*SsMi=>I``xphO~B-pA|RiQd;LaRFd7oVd%lp8Z)R)Zc@EZ5ha} z5F;zE24-(kJX_-3J^gdVf4KbGgywC<28cN+`T_NZPXp^<%o20jG2hWX`tg!iq7y`!V!7YW^3 zX!JPw(TKJYB25A8(KR&%lwRr!3~Wn=j|{wal=@Ydqw~}-5?|h>nlbeJeuxyU7zXGC zx}{1%m<@13(WS`-!9$&H#X1z9SxP}Nk1jJ{$vLVrdrqF0GbCD9evpdqpE#j+mOqcHJOrKy-2e zFgV_)Roai2^emQ77_M}Kjv89fr!|S)`=MFkFX%*)6JC*Fvk&uOys} z7j0sjF1>--CUuVI$O%paQ4PUSTxs#CKZI>F0NEQqx!nO^i%jv0m&ChRR)6C zg5#R~cRW)uu=#UX@(X-->PQpzqW$)B+Ezg1DIcirnS7=b1sE1tfjCm6c zTbUSM4x4E>eTXKwZhSm#vF97vE3RO67PZ7wz`U(n*92s&xeNnPYL zy`C62ON_!7yGr_uk$DHHm{@!8G%bONkVw9-z5{$$y zjj5)a_a)nFOL?=aZxi;@CEq&0eu`rE%m`L@ip)vC$?ToFrA%?hyR&=dPV$8- zW97H>i8m~Rkk~PMQyI*$L|#RoaqGEtY=d?hFJHid8Wn<1BmPG^mtNG@jLRNl%+o~_F_OzDg9wIF00JCpN zI~1N1!Ju}zYSGr9T1h#U5*USOrdpTSX|_BaU0WrRTdhAj+?yx|jB|Ec-Ec{ZI`po0rGqEdYEi}5HsDPRKc@@E zOCRJ+AygI%^(qTz%3p8mO#~^&GtgjD#9V^!PDK^jl^<&1ePrZ8@8}%0tF?ILtC>FY zpezXhUf_ZPUtcMy#q!5-y&7V1dVFM%HH@g^U`$I@{yy=XOnTHn-6+Voa_^qqSVFuq z*+q{;S_Ouv8hq*@Vr}Y< zKS!g0N1@i4_PBWMk?kIkVdW6J{xH@2Cs^1~gGmp+Kk|~)erU}TXSHA* zN>qyAQX1BN_WT7KG)G9E%26!-)@8lP{La-?UGHtwq~Z8rd42`Q@ayo{57nj;DirMo zwd41jK8&f>P)&u#*%jp(YYzvFE71_yX51KF&~bO5HmLcuI+Y2(JIE)kPD2NYy_3KU zRL<0AEl!|YLa=Y<3iwlIzggHdSYG4bt@FQtl_+M{G;q69*XtW`I{|UlyVg(a(u;4K z-$2CR_V!46xRLjUvVCg9?sEQwj9R}Bi45^F>xLRM zcUIDy8HezjIb=y?E-A$sSnT~+C3i+A+$z45cWmx5=M>V_Js$;BnWM`QAs)PZGcA=$ z&J)`cYv3cy0}a&mPgN@iTHokE!L*Sp(?}7q@Usq~tF&`6j4`GMc`B*a0wg1gmV3Z& zVDf^pp3=&235ngqoHwL84q9*Ko_T1Bv3nC7Fq~8+SLpcF!)dS*)$bP}Q@7({oVRPM zFMNAdX7(t$%RauNmm65I7lUSx&wgv>=y1muKol+?R=N2zT+k)l!7X+!9G&UAh8AUU z-1EdlyTV6=~uC~IqhmlR)l&D@51N=NHQ+E`+j335a=;V3={>sB8iHApD zqI>(LcKyp1f1NJ0uruDZNSS4`s)WOPq+NvtzZ6T9FdKsEHnUvN4QTn8tKL4k;I&xF zmF;?>b~#4dsDPKc6~*FibwX_va4*qZtlsO_?PVNpG)09utzCEj5jIJ>VY-vWJ0?DE zI>XIbDOxP3?ma5M7BV;SgSuE=Q=$71@0?@p7MV^naTC}b>Rog8iwmk$*1t1fqe-&L zk#flFeo#+__uI|&d%uBD5wGlp1P$vsq7qb)k|nvmAIRObc)SqO)lRlnRbDFHcLSE7$QNxK-7VsX8=hFQKDp$<sqTMdcRE@B_Qvx04;u4|F&LFj)SOZ&NEoGj< zP#4tCT@I^RRQKGqwYViOZRJcEZQ9v`s@X3oVVy&7^NihhTwv_tSpV1ck5YjgfrUYE8Q>=0G)4fT3}Q4Z1@(lrGe|bqlAR3U}l<3l(fBZyZH-Gx0?` z4&B~YGSY`E!QE=5nC(32`5wu4(qQgMY-h*y>A*a2td4O^5I7E%(?RW%(b`<7vUp2k zMEsEjTPu|9^slaXqEj))VS1uGO7EMOOK8hp9TnV7=4$s4#1C`bVoKt1A(|5+{RCh;2ATxfCDl9&ct7^c4U;;Xy6cEBy%|3luJheO%F@8ii*wiMYzn3O_cl zSAQ96nedvjtWY6qVkYS@q3KNOs1VVaSF6Em;Avs>YnM);Ha7W5Qvjg&EUo=8i}fD( z%rBp{n1rC4`1M>DDJ_1av#s`!h4{o)CsvJv# z-lJgoTyN0-o7Tq?HGHG`llRfw+?hz8i)l+L7k zb(@CG^w{nDqE%>blSQ69d2M&23(70LcScpj%4pLVpm*Dqnh& za4?s3t!(m2Bv@vK*_Z4b(&{XM>QvAtCy5(o0%>P8fTQ}bWS{wRpk4pz+UXz^Zw{|s zgz_Y*9m>$;W(-2wGf@DGm+7s}!KU}Oc~2E#a7>#6pS7nP^xvsQjW=iLZ`-Z18PZRG zG!pD%e8WRoCi`W;wno_k zpxQ_1BbyuddOisbU+ropameQpyoRz^wmZn6r zSA;weg95Vt@8MiyG#dJJSsG`IT1CW zV$xV@rz`P@5Fz=(3>T2cU#&J=JQ;|)ip(-$NStuAkah3x%!awAUnmr~+Er9`MDNKL56)6mg^T$gjecl>jAx}fUPc)xD^oH0Eq-~_0)y0(-9@YOQ ze)`;|(x7rfN#6i)A4lAUSBTbxjbW)aiYP zyjPIk@MaQP%gnE*?>^1d{?dMZ@e5N^#q?#ZOOd0Jc8WqNqEdyo^iXtHjo!;okqQoRxnsr~r--f`6SCYe*ZRct$V<~EFXNBrzd15LkBXG=BxY(NR&>8E4-O8J z00sQM((}SSB4Ahf>$DRtbLk=3+8thc4D1^L*`s+VZ)F3Rkm4je9mhnleO=pd%&ppK zS9wdO^vMu7c!(W^1>p5 zOd`!}3s%up?Gc2J*e$4bAb{MnJGW{k>Y%(mZx}EksYS4_KpM%w#|h+h@PWw*_qSV za4qNi9p@7t-5gx$+;iqasm1}=6*##hd9d3PLQy0Jmb50$Wnu6Pa>6u*V@&}+(E_h{ zonK21b`mp;QDG&McAwb!MI0h->##>36;dq(Ybitz)9o;&N2WY*pTzyniD@2}lIiZH zOW`l1jh~hJ8^9+}rQUdU{O2EYF&V;MiKAz<`Z^E8-Px(#^E?DDHa4@5J4j~S?~#u2 zR>(Exmu`zOIF$NepYw8Lbo$Uo_d<;&6wkr@Y4wy*a39Taj7*N+Z;CLgBK*=Ke#K)2 zBLmh?CH!m*Q_9SyL27V~(a4MIcHf=)35~3FpKz}dcoi|SWJt2FZ=8Ii_5fE8$m|>i zMnrsnsa1;+l6z%&4XWhx7~>9a2u;FmPNo}^Qa4$2?COqxJo}vcn2GtV8F_*(+ij~# zroguX4`dwo3)8Ym`WT@d3E!joZGy75DCEaAHCn`zllik$|#d^o2UFg2&WB`dS01q9MkbD29 zF1^D^Vp|@^>z{cuQ&^M4Op$S5Z%+$(&!wTE}VNqNpWukzh4|}g=D1uNo4@wBF6!* zH7d=@f-gKy;ZL#sH}b;AMf$(kslWJ#T9`q9{NJ#p|G#{tk~)%(RqXWm&!3d5tE+XI zos2g)Xa5c_0XPk4kIVu&4y*gXhVlQ-AH+(g64&UnN<=ai@7OBuf?k>Y|78wp*dX-o zeZfT|X7Lo!4h4!JIxbE=<}bj}-JdtvBkg&3)6F>kgep7JAv42!zcuba&H8!6wkS5K zGYEF*#XI`@*`G|LUGlnl{{2Px*;JU)9s_qDX%diDHu>f!BYkbm;pn~49B+%72B=D1 zpQHfxARE*-{`*S|l}+HkY!Bc*%I_Z9qFO3|Z+*~>Vi@czZVRPX6ZBp5Jt|a7nZtU0 zJUGg5D^Z<~wTCfenBV)ZN~{JjR}b}glRt5rLk9S@orMj;J!_xNzvqokmzm9X&vh&d zM@sI3ln=KtyWgbPn-qezMzWQYJj1%dWT*+i0N=O&&yAL;SF#~Pn3|d*J?6ea>JKzb zYW%{b?_^!H&Bvxc6mUNlXhJCzgnE%s$K474s^4518ZYS-jOvccAf_ z8Zj-l+Rc@@5v3GB)j0u9YG~}U;-o56#Pf+Dg=Ll^ zf(7C3CmQzT297E9$dSKZ%$it7;G&0d-C3s1hhE-v|s1j zJMa^}Go*l26R<{Paj+5*00_Vz+y((& z6#z>9iC4SuyapWUqHP$xSfBwg!J z4FrA_J03l(SO>UIb`tMdMbN+>b6|3yVW0srmA*v2hF|i{41q7aR4a6RxssLPeTyL( z-Y<2C4&lD=X(4EH2i5m$6W7wGg9JzI_Im<KPz+N?ZfXNV_3{26?K{ zXRPA3ceVgx280g%H-OjUPxoB1>JZPse$oeHevLn{71y9Itq&g@=f!dlaN{tV9%rmo zvPaCu2H$m6))&?Mme^6!XUWVCHXgJOG573mg`-rC$@6^$R+upH+T3c@ zF-QklZW#z%2+{UrQJloo*E3Sgiyw}4&3$3*&d}UfUGM}hNBFgN;O&P!#Tlh68Xa`K z!L4ePWusTWg_WhY`9{o}U5%WA0JZ53l9YpYKf6wzN5(cmT z0r=wmn#e1dV$|quWm$DTC-D`ycn8_?BJ?8etu0} zSoLSp^q&k+4*f`dtMaeYorF2JXAxNas}~rh+8(}T+b>yU++T3!LqZa7rviMU2a?3`D}Er} zne%MgAadFSY$YqZu`_3re7FGl5DBbiYUIB2>qYK&=5))_M&xM%%kXUN#`n3Uci~li z@k9xCaWiQG+6J;dWSH8rY5qK1J>?+)om>|r))45e0y^1e?(xnO0q3{RFh2*YRDeD( zRH*vmPrFdrNSh_QuIF1cuc~W21AsqLa#nThqh|+Ra4r=04!P!VAbfJ{D>Z43I4Emb zF@CpcJb^Ww5if0oJidPa^JL)z8X16t_u3(swy0N_e4=-aaoTYTc2ll;#cE#?*t$GCX^y+sSrC-Iu%fhvWt3Ey|J>!76i3 z0~z}YU-+Rc;Q-34#LrU6^UCQogqIgi7^@pRaWje38{gAj`Nz&oh{iQKxDucA1U6RN z>F|k<>yy!T;PGUZ?o`B`Gl77dxk?__j*qDQ9uu2G%}XtAQ{3cRfv?j@CcL4 z$A_MM+?k`~B4TnT7VoYzOnP9xmTMbn(`E03lQklcbd>0?X!-#m;1Xn%cL*kT7u*~` zn+1#ombVU+;@mZ45^x3X3_g| z;ti5#M|O=Y_7=-878nP5rc4 zhK{r4W4k+_falbIhLrRF>Lj*1+L!Pq>B&cxNap{%9wo+Y^R0g}KHJSQbQ4*>#lM`} z3s80_T7D1y7vJlsWzu}BjF||5{BL|OmH)-}y2fY~RLWy1x5LldyH-$ig8O@aetzNt z2<=vCpZ}r>`9D_#h2Af~&>HL8zSI2Y#e!df+kp%MQ*h?~<)HkRU-v?a-HW>a-w0*f z?=&N3B^H=2vTyt*SnnPYqFSf_8|Tgr%DGNj-Q|1A`hRn-|H{^b-g(rry6OCyN_D5> z-&TyupW!Nzv#=;U@DRQG`8lj3^+GL!rreFsSHQZDHvaxJIG^S7U$%-A z0*MH*|I7!($F1QVwZBBkb{5nxkPw)3`FVAww#Q3mol3LsdaYUu0wUR)dYw{f6%Xi` z3B5iDeg85yFN}Ik)*(u_Ue%%EYR3;}rFNg?EQd+o%t5#-IVi``qJc-5AYh^s^-G=1 zL>&f7bGej!=D+aPfVn1jVa-3XySu@?ujqS`fZ~uikyX06Tv6R*Ai1c zu2yr7({65zXU;BgDfpzP0810SgbX+5Yh_Nm^utzhEjAF~z)FVbj-Atbe3hSFCzK5J z$ov#Z8R+Kf5U&Q(PRjRUPm6-@Vh5xs-cs*1Hy%y+5pS(WFi75Pl1CDPVmmYr5`S=A zRax|uj=m8E3x5JP?%zBOh6f)O`qys42u#qS5(N{tc_*SaCH3YZ=BqQ4+nF`oCX zHxyV(BJHhJkj!|E6uCN;gG4|S>7jH}p_0gF^-l^$bS~@M^!z{B6)^Cg9Lz{6_k9=a zPQHD5C^1o78#B|SLgt8rb)X^W$n}?^CyElsf0;Li z(H8zV_hqFuCIKCn1bSCq={;U~dDfgh?}KjbVD?6@scix~dgwh2V}N)%sCBz?l+wD; z^>{cemZSH_Wlxp}!g9v|)8?J=Wb{)lmWR zYZ~*Ro0nsGIY#2vxLx_vQm42Ec>T47l3gGVde06U-&(ylPMxOwn`xu19OR+j9A>9E0d{kJaf3Kxphx-q!5b zdcV2}`*;3J;ST8MGuQ^WOeP(CybtG@p_Y~0nY(#_5c!>Hz2e}y*O3NF zBF1;?-fT)q73+H5#ta!dZ)H>|zW+d_2-((J0vI1EdFkAT+y=Kt4Qsty1L2DYb{+~k zDSk~JSn{k(nISBmT(qz?VSWRnPJs)YjNZ8&y=C-6)9NSY969wu-j>3NfZ<4)Yg)~@ zmJntN(gou<`WvezV-5I+Aj1q(7iQ+gf_B%4+j%Gx{G;?oZw;+_3XZvZ=f}kW`8{q* zH}2E|G1q4Z4RIpo7f6(^Ra{mvvTm)IxX1G|v0_N->#HxUy|Hg9P6OrwM>F@~q^r*M zlROjJNxAaetC92P8%7;F+NeV36|KKngH}(Ej%yPtfF>2Pv{f~dWALriS5}PwR-yDM zkW=(>9Tpu=58rum)+kc&kD8TC6{Z;`l=-XF8Jx5PK2v@Xsg&0!o%LGOR+{^>%uo9h z)&Vc^%beAFbxOWVzTN|0 zf<&79GLNg&8KDkFv20b2QB(&m8i4y%;-uYR|RooucKruYp@ zc4Q-Z*~B}~h4G8oREOl86LIEi;v3C0|BdNY#h!+8&lYZ+^!4@LZiOt$_Hujn;NZ%{ z#Jgr8=Ht6s0ke_NY%|`uxBpU_bes0EFyA>EeXsm(+uF-VNr3IZQWB z=E>7pD{^(%Y|t|j=oG!uQ(&=9vDT)FU*DuMegKNPiO*i2ZJ1fy4MbO3q2q4;esh35 zSBN}@TKH@c&{n!#>oYrCd)w?zznf}J14-6%GX@)=%$v(G0=y_r-*eM2%DjIw;v5$_ zA|lmg*(r7ze=k-KDQ)LV4O$iF4P_4O) zdJehPJvQLG`1=&yN8`#&`ep$sZ4jO{bb2`baQ}IOEsg`FD74|1!EXxA{-4PZ5gjG) zrW>^xQm1oNmTw>%Jp)?9V%D#J=>tuPtyoik%xVKVws9#Z@X;7;i2KDMyr@g>s{|f4 z{uy-A4>NapVyBd0&qD&6RXb3sX%M?NcwgP;QnOANiRVl-L4&~r=pHTbAICPYb%d+Q zV6GOTLPiNg`X6ODiSzgCYQm~^f8Ra|`$hxa6ic6}689>j6 zuA*Ne4;ILWC5?BYzXwF8SZc-=ovuxean*pI00Y{mi9-uzS+_$Qcy#p91vc;9)N9lt zb+BIHHScx4x8aUSwkLUPxQLgh)ENjr?4yo%vkjMq7eDG=o;DcvJ4`Sz=VEj%C*C5O zX&TmZjulBF)Clk79h9poPRzAp0cq72bclsi#6NF6g~i`>vpK@y94To7C?*H?_4Ul} zFTKI8Pb>;&Abjh^i4-$dzG`@Yi&OeCAvhxEUs*vndwC6+5kjm0RWcJ3jR%O7ZqC~~ zg=;?oO;lU`;GtRv)zJvKQB|d)i%7MVYj?lYv+L!_l_xO~nw+>WOga7G30J=eU=xa} zJ!{idDROd}z74jp5h2bPcX#B&aG!hl%BJwkZlLU7opu3J%yc9bxpYgO;Bd31G^bzZ z04I?^r^aO}2m%T+w+L&;%h{)}&8<(u*SmOL?heJ3;#x^iC5JyAUnSr`yAI;5dVA#Q zhd@;cC-T$i#fdq{azkCPob@MpK}C~8W-+w~6CI+J!btwsfzm;h#LQdB!NF7-r0jL98SEtC^;+*6OO5Dg(hety2F30ER?(tLD{Eu-`2O`zX3V zh`m{GI7YPiyAAzWgJppWr{>;{lEjo5R@=1SBhBLAbh9XxKEd5y9O7orYpE=n7YvCk z=0(4IZta=s#@hU3GT9bDfo0a`u)L7jZuSn?QXb_1m2s zAoVN|O-~_59e?rJg66*g10e#_+@(`5!JP+19P}p?;$2pY zB?j3ZC!TSl+mf9O;b|JBPmZ{CA=&L1SiISyENL^l14^Wc(m*!azlfno2}!@)*Pt6z z_r8b|SG>Pq;q<+zOaTMUTeVdnknvEal@vr@m$`-16i zov?_NFEp6ruq@r3L|6t_{7mq<+A#Tq65ir9Z75OIx&#^&3yqOkhkD=0e2^db1EVQf zu_z(8w(PJZxr$B)iFX{8$q*li-;+1AMIWrpYFz>;Xlag#nFH)879BgVmI)3Uocu3y`>XEHC9TTTvo zbHZSuEwpbn^qmn|zLim(JfXkb8`T>GgmWZ29aP70b9#4-;qa`aGKc9Kd!OJ3EJuNb z{C1X1LUHuH@D2Nr@h69Y8;k`#Mf*OB;}m>7lmQ*+2$JN z-1Fo8eX)KOfAo|7R8h7If*zj%9;~?3qh0&_#6^EdI3iN-my2A1%HFsBd7*U-REXpg zRY+#P?Q4wLArkG?woTY=Q$w~iHKSZzqQNezO#;A+KotnKr zc>{HR`sE!^R0iM4W4m`4t%KG=DTXQix)Df>jZ79)tVwH z1~IFlZ=UrRZl{i~N`u7ge*bHD7&_AR7e%-Tuy)1*+f(UwHx7_-JC0S8*{7Lc_I25B z?(Q9T!t^Qd#JXRV%6j`RRNOu(}6dm;`#!J_@)Uq9hH6G2mcNvD+A2r5g?btYU& zn7t33Wi@%=)0=Qp=$iJwnj`dAry@O;CA60q<8;iDB0 zSY{!Eqo6Ex4r2wNlvheX)!kwiq)4*`pxkuxDG}f)2S6Tr=n&960S^gLY@v;|sLPM* zBDnyn^r5n^u)_$8;JWSWLMNx%zC1Zej+hasrv6d2rYs5|aKg_`mmjw%6#vr4oJ0c# zS>=W0u26Rx`-K8ZHCpF5Wn44eHmkhXuASil{^pz@@00C31TuHd*@OO|G!`_~4+;ur z?4J!!Y1A4LeMGJyXOb4~&pKYYOupr_7~8&3ji9J~0>Q7l#a1b?=Z46&2{SGTr1m#X zhSPr9tqL8j02==MNiU6%unV)}o$2wki!?zMwha03Ah7KcF?u#u%^1eAvjL zB4T_%5x`WzJBz312*HCM_fs|X-pX!JXv+Fo2 zXh<871ystWyc(aeG8{X9|25A5@D^2s6)OSMzCf(i`QwMKCoof))sMql@;!zOlUrWH z7+*l`Q2O|AH-3YqR_@$0Ss`o@kCF1Z+`-+pGr=d2=$6+~WRn_$F#XsMV@3CAqdS$L zNs>+lb;%`N3`irTpyX`>axY-IG6~t+wge<+}H)zu2A{lz8+ooI(sM!0ef!A8HvJhN?beeDNpF&?%j&&9$Jt7BPm?n>z1C zxSd*j>S#0X(VyaqtJ%7>o4zv}8N-@+ip;s1kYEVx@E&r~aeimqv4Z+H8Iqdv9h5Js z{=7~DX>xs-{LXC)i48YMF4Dic@ipxkF*IUil-5xCgy09k8CR26g@An!GzILq=sC8A(C>h;zq1Cw1Cq)7kjfJvGHzvw7!4919c5_0vE(flBw<67nUf*S@TVMatB zL8`ZYVr2=>HRm5ShH$#mqM8O!?v6jcd*X<#6FuJpHbpwC&FX`OyWXf34V|9IaZovp zJrDdPs7va)Iflw##&AezT;TdbD|!5fXw(Y(lT;{Gy;_FM1g?FIp6<-s*QYI~c zC-$%wz4yoihD(M>cfgk~e&`bD?-|LRpT1w&#DgKecnB5t0X_-Nkub&-u&;BIVtJ1w zT|$xFcU3Pdx?r*aS^VZ|L_1d7(fTAFj6Z9BIn_>&OzGB(yY}Zm4dy*8cBMqB^cU$s zIn-^-c?$HoNI4m~T?o#3Z!Z8Erh-o%I21*$xigaA3(SFtY_t$6Iqc^7AwBI%Va8OK+h$xD=%5{_uk52#fL+#6E=_O_f+*wLa~jU@h^+J3{qHHgjvOiyVqt_mqD z!9ii?nyr;oNI`IwOZ`m3hXZ3ehR?gIL)VzWii+hYW%;wB04h{QjshhADQ|D@uZ_!o z_tDb{7jtGCy7dYpgdBahUhQ;t#uehDE;? znl5l2`82zBa`|Meht!4a?;iALTETBmJ5%Y!dSJf$$x zJpn)glibepQE7|?oYiy463}w;{JB;vHk#RhwKx6S9WYT}agN^kgm=P@Wt4N54Qn|- z1GQTsDx*AsTY-&9WX`^C4DaNcrTLZ6Nkkzqz~H(3vVf-k*hoVR8lNSou5tX+;qRi) zLEwoPGkH$~`$H@PfFXF`Wt%w~BkiWDDRn}I0R~S--vO2L0TBfeJt&|7HIn7xUY6Q}ifPeMRIQ2G*n7Q@Nuw7t4xL2cN{?>4vDWKm-~Pk0v_0Nc zW6E{8aH!hXx3s;o3KQ?^9*Rh={8@kvHJ_(cBg2GI!^Y zhSpUH#tOMYO${mV{iJ648fL21MH&CLM`P`2QJyi3MEq46Ag`Foa~m%TpHg)Ac2-yp zAJKNkT$bdRh9ox5i@+(*ZH5(O}=yYty7xNYc0w16IcU`Yjb-k-PcLVuP@|H-dH zA}G1>&IPG^SS^MhmZvBYMH`S>kgRJiBAN1+Jc76=;0U0)uXCN=-{D~uYo5f{S5}Iy zte9c$9nwX7i+#P+}Ji%-=-Gj zcl1wI;u;36?R$1u*3YMEK=4?e1QM6(`MU<+yQKeRBN!vM;}}eN2cw{`0fMa2TGxjL()Eyjn*Ee zDUAKckFlafAP%4pG7|ucQ%m9>g3>Z_AhXeMsq>EiJSZgLnri?FbiX_y#WTnr%d#Rm zyLZd@fVK?C05YJ)++TUV8+NJfTYy!3o35d$4 zxoORt{W~FdmEC*$N*)i`oTr$&U|-!?`~VXQ!kkx-Ge3XU0wSYT*B;q5m26uaIN_5M zTl1UHygB67mpl>=gWx&Y4L}C~%~~dI@+*>tY94YXPaT#GoHhn_FkMJ#H2#w<54yku zBl!a;UBNVydM_M5dDyJRbUVFq;#V`O8{$QNY!@dwJ=_(n1;3PV>jttEEbM?oAbllSf0IQKu(M6`IZDP9xrwnb+} z4YfD=*j8UE?485ARRLd6G@Sk_NG1KOTAIfD;?SQ_Z(oG#6B3Ab8uE7c?{@?5Jzbq^ z8J2dL!EqP<{NneY&c<%PGfwsIwTZoVQi&UFwmEf5FVg@m}7jGCxUDf2j0$5A@)rZTZ{&HSa0pd<&11Wq6 zmL@MZ3xk;j%-G*kcJhj4q|+-}H}t z$G|c3nubruSlPh8{OT)C#&!PwOR`_*@Uk!%^6Jp;pO1lo0lI{YwAz>>)4i}(Z}Xap z$$5X~QC(3b1nEbO=m6_90E~MBx<4Sr4FL5fe;5$!&&o&C~^Q2f0aY}8Nl&pJl0p7A*Mnxx?7dcvOSsO-eAS~bHKsO z31C(*pjcT8XcP>2GoV=iinc99(Ug_lwQI2FsU zDG(Ean~B|<6NnEV15P5(4-1v21G6|5bR`JZ>Y9bib8JS{QxxPOjzOA`h-uZa>xt(+ z48fCS-G$}GfL&Z*9}JzXUz?`#bpM9BopklWzF@yikh7PGl#1*X5#F~#7iZ&--!M)d zIa!+nazT)lriRcKL~nWnlJhV+#}K}M6ENX6DyF6m6X>^8H1{9vn~Bn$3N~e2Wv)Gx zt~>nF?%^(lOeOQgk?!VD+^;zt^5*R{!e~<{tblh9~HI{N9 zKLvlx{L?c^$XRO58|c=+i5HOz$44(rK%E*}tB=+mDf~I-BmBJR*0e9~&tb%5e7^RC zueqWw6#Zfbk1A_byH#S(RM-tTt1ZKeeH20w8INgd&iNH}C zpY;X=*>K_q^G4e=dDQ`c9t!~*JD;g@A>Dv$LID;*C}Th_%(VEPe)ZvbKxQRVixK?k zJ`EIbjy?IFxl-f?nn2I58>ayDcUji=XV)9Qif^~79~GigvV@Hj+E9pP2Og5FqDiTr zoz_BC5i68Watup;&=YL8K)OvD*lj3JRivjZ+dD;!zBdI#SUn2rA)LR%By8SvuP43dtZ4tgQbIcTU5TEdcH; zeS7rq`fvc<#6)+)!y@kK%keUB+o@%swTns0TKW-+o`U@2&`Ag&0)0>$GTo}2{;D9KKGAj!`N$%mKyH=~Rwb@mD(Cyrq$?jRmk|{+R zy?~^~0_yl9WzCZ~^4oU?8eS<^>*W|QQekM>rFuLEMlIahUE~L3OqFl;jgPe^FqfLG z0D5>9!&}g6OX*pn(JKuYzDN!A+ok)ZzaY5WN6PK6@MK)FYuO3SNR($caWvkO+=C*By@}#&om5NDy$ox z8UX#S2ooc3F#XxoW9?p%!1k|-Cn7z~loL@TZ=>!5+FoOi15;)DX6c~^+IDslgz8Q< zA}Ce#v~^eG@54F397o6r-T3UaaZGP2SYMhb;?MCG^#YO0I{kYomWTLV1D)_nhT|o2 zB|JArE+J)%?U3;65>bN{_)zrI{5P8|kQr&)SGm40`!nY~76GS9OMp*F|7 zR&nJhYr0NPK!?4ab>)6q;H8t-Uv=5vxS5(Dr_S?vE!oX}y{#VA4^WDFP`GPfs*~G3 z|CLJ4Y5`}hi5kEU!Zak?8y8!5rs3S_vjB}|eA$^i8#NjiG6(o8r=NTRn;~#?(lN^) zf06{8dMUS4>}z9qPb*NBC~tA6>1s+)CZb}1Oatmp#f_7)sN~E{&1QPXND{P2{*<1n zH)Bx0dw*!t()|4=ps;<2S&sd$CltQ~k(@9Kk@3v*hS;gJ2#qS0f4K6Y5BT z8%aE>-&WNvR2Y`#knf50Pd2B9z^Z*YR`nmN7RVxd^2|a?+VR7^t2S#Uao?gJ3a{Rn zF9Rlm!9%D!y<~_}B=+C5DSPs%+}yJy^&Z5Zb2#enxK#AbEF4u9&ZWqSa+3qS@SH@E zs+E(@_iKwSv~>autpKUayf*_XbV{6|SKr4{;*cDCtBA{BaV8I1ity<@j|ONdo~ack z`RTw~3~E&IN;;PFf`h~7hSg8=7s~z&LYg0a@6h-F7j@JNNYhDc}f&ZxeLz zbq~z%_tYmx;nKc50%oGTJTcm+f$OW&OzyyMtw^K-mu7KLwfKY6nl<*pt=j3BECsi8 zZX?9P?|bsG{t)TF$lg;5|4Hc$8i}&QFy0b=G3}OFY+UgAzH?tkG`BIQrTvv3$zxt{ z#nth2pSm7e?pR)ITd#o~0~!#(0Wm+p49`fw3AeRHf+Sd9SvLi!?qfXTfLW&Wq}NU0 zAk%Lj3CR3KkQT@(u9A;9Nc0R91M;y?Ajh{LyOna1WAtdo38 z@GVA;%at`ixzIGlC8c|8XRIB@5Qr}vZVT10Uw8nOcg+BBWD}{QZ$*^xwaB0!A>~?S zOz&t7I%2XoXuZRO%+#U;?8?MCP=-j=OXYnn_?E?Z!48uN+sFx*WkM(O?9;`*$GJ1Ky*tK0V5&=U^+^owi>UvYWd3CiG`vsX0fh;6 zgJk*_eYSykvh>eH^xTz#+QuR^Ddd+xzzgtkuOA<2ihP~|&iiVGkc22CVKJWY*aQXK zx4gdbka)m!*Zfqr(97Ty8Z6`ek8KFJkBP&L>(fa~ zKA=;?rM2idvZ;csS6n{07py`EEzI%2W2(+uS4-+@N6@O$@3l`Fm@VUQf_D8n;T5ya z{#c=l7T5Mojs#&*jaQGUDXBfM${CW^z+_R921eP59iO=2`1X2I`u!q`A=;Amn=$v& zkjt-qIxYneax4z&H;ufsRV*DJGF^2CykxW6>m9Ey27r=i(NemMPV7X(=78zmb`b@( z2jvFHHLAFV0?(@GK71%!2hPcJb;>=5VR=c$TF=Vi4q>3ujT1!SeA^8R{AfwmROoXa zl}%fO?Q|4_94oZ|gmJ#ao4*bw5e41rd!z5R(YN+38<27_*UgM9b?_*jPd9DCi-5`= zoysC;Z|tA2h;=uHXA1XHN{{{s+DzZtnMYur0Xk+G2?i;6KC>irO-3LZxT=j^ew{a- zWyvZkf&#r@!zw|IS%T3vcQ|Hb5~Z5YjMX06xx*5T`~30RwGK*lw5WWPotlhAD5m_4bN{>R_BN?>K;YB|`Q1J6JL7*SvVHUZSu+;`d4GM6gk*OE9>n#%;%E{3!&UhG zexQn3Qy+Hqzro7|w~~^I>ISjwyCLWAS^y9f{de>oxU+M*JqZ_=Eev73^7jkg?iJlJ z_W4`#@A3KJh?(yb!8uO1!{WD-l4}3qdzqmGuj^mt4-IvgSGD};IAqE6Hv}GXzX8|! zZ&3PnZ+Z)ic7O&Ll0x3OfBjb_`VhE9{!3^2wqoytxK?m~1?!YNw~I^v(9l3jJ!)2m{nrgVcr8QonET``@h(gTU4r zYJH&mf%|DJO_C>b8mnuiYx>xTIY54I1q`tOW=$n9CAwYV;auGgT>1ilifkc#->+^> zMRE{C9RfA&?K~PuSU&O!1`zmxTXGuG_B|cJTa#%fb(u zp6O6zF6r%1GcWj00YU*`BM-C0O68#O`Sw3l&mZVnX$C z)CD`M<$1VY7qE>)E_SA034Vn)_4#FSyd5ckgQBH6GOJ#)HIR}`+)L*sr;3E2zSbac zac5e52BLmBTq6WlLI6f^bauAWvFx3#p>&>=FDbaPQ)V9c#GuJCDjKxkUbo?s;npd5 z-BGJkJiYg`Kw+KGx^0F*r#BdFgsGXRMTcQjmx zSV;n*&k9Nb1f?_Xn*dM@0A+%}F~h|gAW&0Z?rJYH1Hjn0Kx?Mj%_WQ}X5tA$S^VpB zpyvbfFTy#4+>p8o2%W$nYkT_-c7RQ9js(ph$W{l52GAGFz;NK26DU53R@{=kvh*$` z+DY^$&jz4|kg73RkG*RJ6Wwwz&%tA#Q|PEqC*ZB(eF49hYxfvcVk3>7M^4@uos;t8 z@ne&$0SZ!VJSI;Wrg&bC#%UO+iCp*v$-wkxgpkN8{DlvLfBoiRzYD7C8x=CJjy+IFQJ}aFE?zF6u@#n!^`NV6yMcOD)-TQ zY)NShKr>w;&~LW2$h-X^t<7!T6=edqXo*ca{ZbJG&+!M0rb3=rmsG|dTmdk40MvIJ zGBscw2#}?oUQeL8Yk+{fggXNA@{LhVPp5H4jkmq$>$31qj&>~naAsx(;L}o=^U(Bp zT=#lFk#_M#7luTtFJaU8TrEdxR7{79pZmuJ zP?uVxln>Ek2%!onaY+CGuBY?TnZkhyyUWN)BWi8;i>*tQJRIme)1etQybRFQ@jia_ zo?!yOYV?*--Xb#<=v>rT8;~O<$}NQ_Edx`7qg+_Ri`;v zG%L3+>(@R(MDJVveeF>N0pZpS(Q=ma>=}58ELJ z|H@7;XW7e>Ifje`sjsPUqUt_F4@7}~<&Dxx3UB9Pl2#FA#pWK{V^26eVLd3pgSCjp^K9t9?Ur|jDTd#0!Nwu8@X<1$Gp>3Y9hu}Y5r?vvVxy?Yb{@{niKs7YmjmU`)kh_b#igLH?+ zK6j8AhsiI4N*aL|3!l}B0Y`fnltu~c3E!L z$$m}Xq%CR(42O&A$8Gy17#y39=8?H}hND&NHj1mMhRZ144ey<@N$|qr64llm|Dn#N)qfjM-_r+eHds zqkCGb!uyAeIqyol$~Q}nzs&Z>^N=2W2eU|E3HK_%mxFT{r19eZ_}1~f>|gqMXMdif zbd~;Y8Y!L=^W~S^>jUxN!9;UNB4E#8Mzq5O>Zx(ZaZq(Fep)b7M1cU6&9CUYtAN#2 z>d;(biAD;%GwKQ*)u1Tto0qo7>DXxx7`PU7;L{R1OJ(VOH|HHK3} zRB@#?eR=6DLOSh&VdtEa%}hP{TJccTK_aoACG5j*Qw|WA)+mW-l}i%lVf`j^^m+6q z*KRT41&mdHqy_bU;MqS)i~dDlJMV)snX(>76y6J|g&epMr6{wRd4)+t7N+%j-k1IM z0&jwDju@LUsSz_wnFAk+hon%iqDn6lh5CeVU3HAx)Xk_WQDraE zRwd05qMsr49JwJ)w|NpOt=%|s>;}cLomk>wHB_NUj(L2&?uNetrHrR3d-RDLZ20v4 zhRnbxyh+udRo-XG;C^YTi{N>aM3~-MbVF;}{(*&2mCbKYMdFzVHc~w^P4792UOl?+ zI)Bn2rfxlb44mzZtmD(hP9m(x0$^gDn{oXg}rH#XJ zf-}Ve191EDWa}uUp8Dh{*_z^pr~OizN2n*5pYl0jrUm#CPWYa`r0V5!*p@Ce?2PJFPDg1qnQTB_=GZ% zk)D&58pF0CH)xrX7h4>?d_sAM)@XeOPB=n$0QKLZ*5nul@W7tO)(*m>g9|D#yY+)TNA?oW#j!$Gr1BnFvH#5~M3_62Np+eS$(o@I*NTe6R)LHuDb-lg_X zsayp}*YibzYC(vt+9kb5PI~(Mk)j?fEp^8mYbbZ#aP&8947Er9CGFjQO$Wij5LH`u zz2&IX$G3k?yTEG;^Z%tT5M_@JCW>kA@$z;vH{hoFKXSI0ar{1(R0(%>A1OOy^UMEl zx&%FxL~vk>jZaQeD_SIYrdGDZ>}3sqmTd^+{@a$OLn)dYcwkpLZ|~QjyaJj2Y_q2K ze)#*vj?+zGU&as16ePRb->Mgx^#9BIH;TXYptI1HDPjyQp%T61Ssh4*cT;jTUn?&5 z&tNiLBQG?3A#UrUrOc&uLC#6+`Nhn~X{mg)*8;4LXdPDhFn3tOzU5=XrIw|JmeB_R zAuk`tq2gYC{^{$M?WH$mWo2>8;+C#u?@Zc$Z?R>YDO1boEfc$$RvO+vOXK&2EPmR) z#(%0z^g!Ool0Y9I#Vf(P&H?*3YCA0IU(t9!Hh>*h1|^AI6IU(_WYzflavBf)R|-HT zWQ}ZxJ=3DFB(?Skk7WPP0oU-I1tMktT;Y)fdj&x&YY}Dn$eLO_@oy_sw1XXd@;}!z z{`ZysTSX!@2$To%%rc&JJv(e~7Q{e7QC|b_=15?c^8bi?^Khv5zkj?UQkJ4Z4oX?d zT13a5NF}r(`$)1cg<*^(Tau8hne36Wja`ggWGTBDV@q~3V;Rd}4BywJ^tsRd`P}z) z-GBUk*LALQb#lzSm)HCKdOn|zjUP0C*K<+CmK)wJ8nAPY8;>O@&lB=@Y>>e2`4kKb z0GYv;+U)yt#z|Ugo%@)@I-|dy$r%0lq~B%QKWEMu2JQqCPv%lGr z;|rizdI%=o%^+mOxLF%^R(nG9R9?ZX4gKtA$z9_#i5ELFj6GC$Dj}MKIK26pT8CsM#R%+H}A~P%-g`eG2tYu=g+XhNDG&gdP8~)8K+>?M{_uYn07_iLSx>5rFzeR&P#- zH-FU0I>+up4LNO9bo#D50b^nHbF5m=u&4)ub#{jk&HG>IKws=W>Y`IZ07s>Xqo$!T z?tC3;GwT891vPZ?RTYuH`H?FRlh4~?mS`)gsp761YD1X^R;fvF{Fsn~BLJEz)r>lc z!L6TM^5bszzKjgFtX@KO&;PnI5{isc-|FY;yN>ncNUVdHU_n4IuxE<_oan5ZMd7Is zG;I?|JbhySFwq`y82om7t1ruC3i(8>$+qH;zf;3^2eB;@9agnG(wm?`cMOIGegRGr zMQJB{v2Ho--y|V7kt5FS3Ln1rR>Nkp%5pu1;q#U0Ex?V9VWD)yyTaVNz?7r^l^`bi z5#Svg_ueJkA4z0J~{`5}E>Gzww_q@a%KV!&WfH28_ zp-?&)4rpGHyxwamu1U1(poe{JnFtd&Cshd&0#hcEJRn5TFOfY@X&lm7QHo$Fw$#HMYDsXR@yWbAb+4tx|0h$LBZ-C7C zX|J$tWi<*-P5JalB6K7c&%A{?v}4Vcp~0})oGtwsfU9&rVgV@|$qQ^8ij`X?XWD!Y zvmCcr*vCr?SP+-EXf31mTK--v@^n`Lk`_0f9{nov{<72cmxvnbNx!DCLWf0&$Sx3XC-5775%)GWHFX8k@K{vJaWtzhXDx@z6XxJwN%FrE+`JV1t@2 znnEh*1t$KzE!vTX)Cjd+_3%Xq*~Ts$lGhlv@SOY4W7tx2?I3ji$SM`RZ`I&R91?5K z4s_8_-C$n&K{cL>q)lPr*5g2>6LgSdmwY1CWAFGk)1zYI7#TZEN6YEsCEg(9dbwPs z-69K<;k-2u*4XHo3M;;bu64~ll{L(yJsk}VV4&BXWO`_RKV0OX%BjWUcT9VD2Ae`Y z&42;CS=kKZU7y|A!8gX2?;xaoSn0%W1ADgc^G8H(DXx9@Ury}6+4)s=dpxdCxBb-m z6UUb&i#*lzB(btOBEFvGQzm!;<5z4;M9`pJdb6)c?N$SucF|lbcJu4%!B>LASiWfy zAHu?jHFstD`C6WMmzPo|y_=q}jU{;!uV*|h(d<}u)US1j*mKaZecxT4X%jRO0RaJ?j;&gX zKWgd*dmZ{uX&^Q15MLjx_Ke`mOG6qeN0PO+bKp8j0O?f1K4QaTzl%R&)2wsBibITe zov;d6UKv`l6-m5ZoU&`?De;;ITFs0-N%9l3O_SVq;|;U-qW}o&%|0yZ2R1V&8zPfe zBpuZ1ag7?0Zh(ZJazLQYstz?Qb2*|SVv_hVlu1{Z^a}KL;=y{f;=X(rR#HlnA~YLO z8roNM8UsrS9Z+YgWnLOtPg zEln=Zd)pT?tZMDU_TAD5IDQNd7N=>JmUpas^=XgeuXIh`ymFtgXJa}(mv?dPkszYz z3oAap1_?I@7vkuhJRkF>z7L)Z&MWF=-6(7^;7r7b9>JsDHW4O_-c=reCWi36bz*t@ ztHM)u=HxhAo4Y^&L+KLLao`?d=%+0gfhb$%sz2t7rmaxvEu1Tb1B{>Kp66KBoG{lJ zhSL=k#}o^rC<@T33RE|=G8;mYtHBMr1-=z_rw)*x0Ya^XL z_1W$63ts~bSDHcOVTotWifH>7f^(!ppKDW@~;1T!rX7DFVr$! z#~pS**PfYO!yGa8nYM!1dDZFovG3ijS14H9JRJed#r*GrG({OGkk0eYkJQ$Lg>5X) zxIAbeE}x=6s|Dmd4PX;q+`vfG!hjSzBQYBUnfk;*=N7fA$d$N6cNK^-@Ya@(1C7P+ zBTvc%+<$=Xvw=rs9$vv1*sq9%79VS`NCn@ z*_)#qAmi#<Ta2K=kt&InJZEh2@nzm5=G19C(8s$;;ClSFv07 zm0$3#-m8(uz{acSXmR$13dySL%&OnQ?R_X^I?}${zWU;eeqLp(K|Z^NvJxGR)FO>+ zc7Wk_j-+Y+12qJF*)@IE&Vv;!;k>vg-H9)Ucn6+-dw(|(>!hi~`(S?l_O)u-Y*ojI z4dz*(-ntcVMF!E4WAy1lu|`C5%;jSLC+_RgzP@MgW}IOqNIq)2mRq$kTeWrX8SoO; zL^8RKbMA7FIrh^v8X(cdG{t>G^50|yz8%uf!Nt5E$ps|C*jh=h!rGd+3ljF&qI;^q z@1ipAfpO&Cb5|@rw3S!MePE~AZCibBQ*DO3eYb#lDz?u>cu=14Z_vLx$oHqwi4#Tx z<>wgN-u^9ltP@}ygrCiObV|X!$+Cfj)up*z!Xw8~K#Pw*2(_n0Ti46x__iO);XSGv zRe$IZ-7`=U|Fjy+16G5e>ZV!^2BF*K&37w_#z>$9(cE95@XDY*SF+RfOae3%?Q^=P zX~}GYU$eT2gIe&P$Z+85SizZsZ~uOnd3UdbK%Br6XDfz*anO+@Ahvcx4|lM6u1=j( zgVC|XGmMFrY0d3)u0f_d?@s~A4pzLLv8xU-#B`HyXtbjH?@3Ju5!WfRUHRT_M{jiy z^g)YAwjaCw!S7aF;?@-a7GK0iWwfo{(tafH=YV#wM0Ep4!ps>yze~*fKPmFn`r|+3ePxAd&!46mo)UJHb z(w_Pncd8>OgEhnKxj+x0wdhhRUf+cHd-(5VrC*IaW6aO->r@ckp z;=2Ve9)JNyR(Ico5GHs%-7Jgzg7TAg1=306i9Sb^9jt%VfA0V!H)+_FZQXrx~I+1T<8M zW+-=|!V`0c@x7QMJo%@84_1_oIXP@u$Us#P31$Os{I83jRSihN5=O*pb0tV9rrE=w zN+hn0dw6kPMxsj{-5sX6e!nVw&v9^6T*PCu2>`g%zS3$>S))iu@Yr#ZfuA z)Nx1w5LcE+32MEys!%7~;n}Dpwg{&W+}r;aoIf+2EY&H1bCmPXW@S&;2twt~3#SZO zr^yh$^Qia`$D7-vSj%K>a@zdw+(T-_4TvpPp@8vv@s`;6q~0n(^e&o(f$p=7T*T$| zX7v@c$n?arqZberm?Tww|CIbkrLa+3b3ez7sxj1fH#b}}9OskpA zqv%=YN*Hn*(R8~Pt4vjT8T!Q1SG1kC)nS0L%@SW_g&kav)f?X00s+BA*bFFc1F(#v zP0-aFJ`|wn2!~9)b>pzw1NvP$ItmBJD?y`Q<631e4h~_Kis0_0sdjDF)2syba30NJ z4_r>)#b7743ThMhPRbkYM)*D~jL|u`3i42_?^00X1*}cvk_5@>{AtiaGWtQDVrBA&Pb5}jkfup*ipRrsM+zKo<)s`yNYfAFZ4&&ap^~;>EYna8gsU7f^L@%VaJgDz0ymux2_i%mg94cQn6= z=L%8=qVVMBnJXPXu)0WqC&G7wO&a~FkJ|pUU~~J;82b0}U&~FK5Eesn=g&u2$+!f2 zh@-sX0kBaL*wK20cMG)Q@mrcEc$CMA9EgquCvTtkHo{?fO&J+(l0dweN{G>#~;*_xlC2tWV-8KstB_vByTo8p+*wRJnPmz_2U$#0!pw+Hw3|` z9$oRz&7Bgl13VxUWV>gHqV-= z-@~G~26+O8UNKJ<0ilHm?*4nr4;n9R)k)MQFxRxq=~U%psI6SNFmEul0{F7Gs3yW0 zC=%J5z!ucrB0erwa3t?B`qNw`bX;P8MOaoL19O6CUK(DdVg)PKwfMx}cZ(`{&hr{& zC+~9m7!kgW?idRp1{ZNG1?#*$B5P?}R~X4|OcEA9R9w0Ys0); z0ng#IEiy%-g9)&$-7|zhBp5dDPKmuA)u{zTB4H^>gJ)Pix!QR(05 z3X6~Su#lCYNmHk4=)gmwX#oKSrq*%g_R8oyADw3{HXjo*W!eD*uu~iVu_lKnb;i~SMDKYkGcx%3}Zsi0;A-p{~;eAVVs zp&o|2Vs~%fIlmq%-u53WKU*s9;~L+YBGx9c`;h#)Ff~s9YhC?+I@6zsQM#6-Y)>HP z)!(n%-`MBR%ljW2h#hP!@0lb#a3~*G5dAK1see#T_+JmV$NFkexkUYeKkvMqmuUU} z*eU&N1Mt00kMfXm&_8ZBKaV(*?SBKf{%^N*rwyn)@eP0Mml^Qyt_~cr>reFOKQ(sL z!@cvKlY6#~akuLFeVrJC{w#*8PpMCz0GNPiWZZo7+6V-LMsG&N67LOrz6)B4_!kTP zMg;h+(-OC)PVvkK#clDKzp!mmij`PmcdcVt;`CWwjf@imO_`9zx%e=c1YFUYr_uuOK z(J;5&eZS^A;FO%kEXIMlMJj6VQf})ZlW08!VcuxpST84DOFET5LVsn@M{@z@?%v70 zpyL0pkQu&~=g(SVeCFGTXH^2*GS#JlRO+!Zo5Cajd{QXmz|q3TVK*XZFEu7_M_ZI{c^|2UTkeWUI#tdG>ZM*z&y z(J%mxCBAPFj0~sCnOPHVzySdvby{o?&`&{#d zVU>#3UAT-P)JvT68&X{WEs5b9(Tl;IxQADDl}=)sa2CCUrAy2tJ$}rUe1}xZ_=X`C z1>QV~pB}sCTAhBovpRZ$eH$58y@OuH&b-ZFSOptY5yO+f2C5;D_47|aD=Yuw0Mx|O zB2l!fas7h|QkZcV-lv(38`&;1m-b8W(mIDIoA`TD?)T#`B-s&n5if8u>o7j#xaf@- zans@6ljGp_XdD+a!kpIx0Gt`NTJ^U`{IsZ-Z+!qy8kE_pXw$Utzc-6QQN zL(o71v-ayGkJ?;@2&9N;IHts&OFZsW73A;=<=D#kT5sG6`phFbulP7??^Exu9Ze&VuF{{}(mBkI52lsjoA*mSZMeefec`Xb0Zo#Sxd2Zhfut!p?B?=Jcd-0?Oyi+dU=C%GF$4_J%*aQJPm>le zk7mfL848I6qlh3y9DGqdIZKjoEm z5$eqME(qk~^pvVAQ@|9t$tylefmD~RyNTvI@HhvriiT_rbyua*x0iDRhiotTvLBSo zO26L1pog=13n_Ij<##eyVvuKv3ziN{3o^q4DBnkF*^m!t)zfCgk3Y#pMdhJZt3<>x z$E11va+lh36lDvCOaYw1pk1+D&!Y4;DhX?Y4teGs)KsqT?lFB9-4LMailNgy`9&;W zXm4@9%5c34%oYQD-tmX8idpUZoGWak2()kyPm0`CAJ?ylcd3#W|FVHPi5q4IhhIb} z0jaNb#;IOQbzHA6Jm6-LGwP$jlD#E%hNFNvA$12C^rLHgJJ+}(6)YdAK3}4iFa-eA z_b%CicghU}KgQg4&^0fxl-effA%#!WV1e1q7C72>q-)pM_ZEHm8{eY64u;-YfyAOG z{6BK4QZVypF#KOc6IMB&7hj1K{#YTP@W9Xb2%DL#+UfgMiZ`pDCzJ)Td$VyI*iYsz z+~QxKC(k{9vAVtVZLn?VdtqNT!V(;6`xUlC`q=}&y05e^%76hHP#j>^r#(7#o~5F$ z)STNY1&c+BpsF4=zm}3BC%6q?-(RUxNbqK;6{!^ye|%iTpwynPD+tjfkH=blol|g~ zy~j%Kcg-0U+n33XH+Y}-%8T5bLA*f@U8nZk*VkJNDdUma0_CfKZU1iNAo`WtX$&QI zd1IcB(4pYX1m`Hv!^MwFkgbSmR#k&dtyO0k8>AC(XRwsUC#xfBzz`eYZ5i_HJ-;Km zuKs)pJA}JR*2Waek%3{sn-}G`kW==u=3m76qN{_mXY%qX3IK??-f=d*#`JES z_YsK@J6XZ-Qd60^wEcjKj(&Wl(nKCV+!uf5Y**MVWK)+Fkq)FFRS0QoqQr6cOH)%T zxqvtFl)lXmNfl~oO|65Isj%>AKVwAOn~v@ijyYdrg1mw0g7vi$!lk4Mv-vZLl=4}5 zmWr@@g&vt&`AMiB8x<_a=4ma!%VHTD&>ovpeZ7o)-H)odj#uv7fKA{|@1rAtk?PU~ zhmF><*bO(?AO-CrH)jT2?RMmD}rcD}lz0wKX9qs-{^#kG-^YP@U4 zKkAVHc7@ZgErYMA_FQw1ny;3x~^c$4pEv=0CL^2d+>m7>Ahra z%lM=T+y?kmV4L8fa}ubJOX&iJu%XQMxwaCpaVK4u-Uhd zZIh($Eu|XZYC>G9*zpG~e5O-^43v7W+u|v7Ph_)(i8|yQd)c~g&|JNQqdfEV6ZNm$ zxiu`&#VBRS$r3cF-@4!-;r}mLrP%9`A-X?6K zW4A8qdy^Cx*TVhM%d_7*BssI#4}%Joh? zqbsAyb8Q;n<8S&FEo5KH9y^9t+YcM|0!2%unUmHVryV>~0otVS`y4i@wxA4Z^W(z z%}lV_24%v)9J(Q>_jI2(K?#EHolBMep{RHepgXn9S(;|i9(8~P_OrlWZdBGlZf{O0 zY3G*De$>tUn~w7SGQR;YY&=4$sFEFV%}zMLlx@$@0bF)LQLgd2PBDYAxc!|IhxE`5 zszUFUh*8sM*%eIxOiU@h63mWMN+t6|jphlT{f9p04@8~4%No4O3Dl;40hPN>DUON) z-rUHG->MJ89QjS=IT=nJuq>UZa|OdC4h|W*3{6DLi|Lu}_atBoO&tm}ef?Gx>vrgO z!Civ{HT-tHp}ff0T`_9VozPD<-`ykNz1UOb(LZ6V#|fmdF&`wY&2}k6d+1(BcIee6 z8a-C4WBHTT`==jNe(S5n#^GgLuNAa#>z|D+wON#=2?S{T+boanzhwjI|6BeRcu^h3 z2aFWb{+8za8G|I>2E8~v=IY*7JeMSLx8mFR!&sg2soLRiXH3)Qnxe?q-z49EIWTd? zqpWy;qxx^sTc1l8n{@v$(02g8J#_Ky$}w^3NasG;DS=;``S1P>d=6v8URv_u(Ds*l zOO~kVD;xik&-U}}YRVY(^Ye$rXn63h`s~>zR981L9?C`G4Psov)}7 zlDKsPxYSLZ;s^|SDqXXyJJ|WL^3PvhMAEo&r)2!0qy4%F5+IP26%WRX2d<8uN@j9m z{I7lXEp@sZ48SH$*;qaE1Dnx5?#j!3H0iX!{*1@(w)+7qn!o;W<~mh57h}qbLdz8wAQC@VcfPJ1a4tXmTzp zRuH{JKZZHL1v=aS#x{hEI3>9){$fbD1kL$Bqm#_Iy`lM1eO+%zb zsoG``6ld93nA`zZ^-M|q-(gS^60~$jW%Kgmc*A3j5ILJKt*pnb^jJ_z@snonKL+J$7MTWiWJ+ccWI9rU|*3HV=2hJFSAt2};8 zu1p=%Ns^F|Wjxu($suuR*H#RmWGB+1S;3@^H({^bkC3VWVDJ1C*xY!%<&@|Y-2Je| zpG(0@o__6s+y*z@RsX&AHg!**?%n%mrT4^w#guRnpLX6#-Lo@XLc*JI8grPS+CpDm z#cTD)P!7C|_yKGmK5~-ROg*W-#!5n2NSii9-O#-6x;{?F`?>ym3DI1}M6C5?4;W&1p%_-16t!c&@l3EzaZuiysc6 z0RV{QSl}>J{t%3ug99dnm>cFlO(i}AO9BQ^zetc;Cg_M-yh^0@DO95+I2_1I(vLK|@?^libRy$!B~T(JZPiJC17NUBW&h;r zfMa_l8k?g)_h9uUB`4DhCw(AAk@4m4QLp6BtI&tEb+Ys$g8sydjfF*N(}{{>J_I$H zm+)x;Rvw?t#h8u)=!VY-D2`SAzj-q-GQG_~QK6IQLNM^?5!fjGNW6H~Y(gjceUeKV z5CM&rE0XbrIpv-!y?TM&t{+R+BEB}<)gcJK4i|85%hf5GpfZk^$Y6RyhYjPi=SIUp zI*`tNDd^IX&`P(>k*(FzYJM;Pc|;6S+B{Xb2`JMSCMJNrStlGMvG)Ct6q%p**@nwn z>%RMz=-hi&JhWFhD>Qyw7RVDXfXHPllNbju_5Wm{Z)^fOIbI~Xx&^% z_g@gS?*{edEAzEpY|+gBFQ(iLev_P+H1y1jHxg1EL@_$1Oj{w(W!rU+@#$H-Nct#v=0%a(=mOAEU#EKbNXe#M zi`OCn2<@1zX#>|FPF+?TIpE5GqjFi#Nyss*0t~gNvb_r2)8koHc9mR2EM)#ndbg^| zFrB9fGHYw~&_Fh-NJL1adc@C|4Gy!P^zfoHUEc5YlSua!@*Tu}1q!y;pZD$3?Q93j zIud|Nj?AI=137{jqRkGhg6O>S_DKSKbx>>30`{mALb1ophB6#KLa4(KXZvC>aFZ^H z7sFH#22kW9_!U+>1v*F&ku3|sbhJo|C;k&zK8FCsN z!cl|7c7u^Q!AGTb{jb*}JZI8lyHMjyRMYW|5!S&3#gDL*jT_{C%cOMJ*}4xm0HdW+ zk*4$ zr9M!_6}wWF+LauQV`B%TaRr-TP66%`uc}6oHEV5T6ce(%T7c##|i1z0BDQQ)tOf4{PbjI#&hp>KNFPxEGM-Izo;vgWuE8e`7a4qK01EHq1mpd0+_9*D5k&FOJp8PK@-upi&^;cg`M zG=g(P;P}Ik>;tU0G(fcw2x8{8>AmhFW60UcdOd~GP@w6dFXyri)-kKXDS$ClHh9W# z6&|C!!g#6CR?Ho9gU$mgK3c$`Fd%<;Xi{PRXw_EFU2XmchHUowE2VBPXH(#!rm)t+ zuA@ir9`E%l>ST`>hl-C-EjJMtk+{`Qquv|r)LnD->(j703eZU$gkxPDqnoB;Sn-;R zNR0+8+(1rLIF>OgB*1sp>uEvkBl~RXAI;V6XUX_uqX2}JC;xN zvuX}ye~snP;yW$;~pf| zWs}WQhvt~nO4;$ya65eK5+OAD1N7Wx|9e2R&_GV*^omJZ37xxfOu&)!!rJsvjKnIJ z9F&+i)obc$(7)kGIPADRa(0BzZ%AdUUfM#G{Y#dxU*#}O8ER`xmh!VxN~?c5l3fxx z*?n=y&|(Bs2;iz97GAS=1O&*BUC3k~G5P>uCZrxU+Cuq6+1Ez2$_auK!?lq*sOAYtq!UUP+%FRuE!0Uis>gWPkVEAvb3|?yrxA$8w3DWQxYsl86In z1*}xZTnGbH^9RN`#Yd-VHr>0lMA(=kf|~5oq-bCeBxa&A|2RgX?;A1ExKhqFz@k)c zc)SqRL_W_f`Dq55anBh(T}>xRqYBl2(mSt619{c#`{%VBIQx*xH0fN%k3|^3(%t zz2_f|IoO%cQ1Tr-stUY4s#gn5n=3x~Yi#TUyZO#?xPw{5llmX7+P%`^KQ9<5(U7x4 z^;un%{hsuNxm%vg8pzf|HWMv}*x14adOV*$Il_`p8y#SKvn=Z-)9RUPUM9p%Locad zGxW`qh~#D0MZS?kpH22xuvDX;-ODer;k)9h*MFV`j?aFgR7TQZEkA-!Omezg0*Vre z;)DcrB0okhT9Eu%Kq)FC5{w?A(pwD_Q>KIN9}P|q(FBrYyb& zoR+xSCjt{~Rj4JIrkh`Quv>b&Y`NAvU<_M+nRV^flqn{5%P!ydTKZ;I>UqpQ&CMX1 zXH`pby?iol|3{uPuS{KO6zqaUsU=hLI-`s1WX?zPK^3hVV9RpHh%OJQ>fF4xb_-T9 zEMA*9bx~(sv8TV!Zz?$bRzRz{3$SM`(InV)us?G%{PKyewxy}h9jm|c=n&gy12iw2 zU**A7r*Pj?`xTlkOu1LJc@h5hnUM~lld7RKgoQ^TU5CMpd-grj*?!|a{}I-F;tT!z zNIa*5B0Bh(66dLsVou|=C4Wyx-uaol($^@h7S5y!UNp%;UPeI| z@f(L{yv*OO%T6#r$2j?+ zO?V%yCpxrf*?>#nj4^Gj&utC{nl_8AQfBoeRqm7G=qvc*~RRTqA zS-G`2#A2pZyU0siWzV>XE9Wp?_uX}$L$kf~o67quiO&tUN#`)pu_KW7fIQP!htXAi zKjXhVE+ZyHaaX}0b?bP{Xe?*c5xiQ98rVOIgH(r;$EZf#8=kXP7kwOW*YZr}r44Ti z#2yqRk-mhOF2j?Xt0cDhR*3U|RmynsSkTHs%0bGcHLJA%W+FW-SPgdE+~m=at;Od)B*M*r^f1_tS9)G%pYV@Ub1vZ{ z9|j%QCKWna+a?1GZrN&{$gINZ38JqYo8{GUWx! z`{LyXGsUNp$*GqkxmbF|#FBqvXUiirN7AeQm^+`ZG+EMilNufiL3Ftu5^SjxX2Txi`&@I zmV(>a(_j`lWIC{HPja@$p+e`#?M4k?c_XIA>|-_=EKuH{;ojw`~gQW6f#w5#Kvb;E_CPv~auXJriSY z!7TMZbleap7iZ|tV!V3%8T_2sx8oor>CW>GDPK3w+z_ngK@8?!Ki=D z@Ls-Ntpj7jMu+xI&_Re|KqsPbuXYZd8#3B4mc;)uR4L~asiK7(j^%b6?DVMKc(vx_ zCv5v_>Ae!=0|2_5VQdU$iszc7>$^Xk0WdRj21nZipPw@WU+)Xand9Dnjp=@X-a;g&~n#e$tlxX0=GBTzemLeMEFM^oVrlI}e+$<+QPM z&xgl&50+(1uQAZVs*bfdSOWRS$8YiO$P4zOrXM2TaJ{M zZ!`Uvh>(t*@tcGV<1~3B9IUEicvoN_+xdV-hR~3}E`V>RDY<2uV4mPAA5RxQT){c% zh$vcjeZBRU3)3=D`cz0l|Ii2S7kmfM7SFhFGv##`>z&*uxaQnB5(jdPpL=a7N)65S zUPqFh=L-dxH6=6-Ar~5fx0&Fe#yAI-kw7EMltZFzqe(O;n^^UOWFZ(IrpG z=H>&*n|VwmlxCgrq-%95r^@Zj+7h~1?=<-#VeQId@kd;8iCQEfk5ld5<#XuwL1vS) zdcxw2l6nS)x`$ub7-dDGOGNnK^_Ga`Sf#~E7?n)fx?SWONDA`2uX;VAxscDRL199WcH`Lbk?Z$fn2TO~{oZIQ(UOTn zWZ78b*#nXtw&<+$1s#iNh4Jon3AgA3nOlqM(zBfT=CVoc6e9Fr*Ivrlj zBR8LUf#EV!iOOYAyWcYnJS!|^;%`WZ8MZZ{TzlVqu>VYJ%tnP>j<4HIr`0qq|CYOO z#>_nP+sp~GC#A$~cEXz@Vm|zc0y#<)Zf!D|C1%Lf6X1$vbs>+IDsjU8bVJ{Ex z6DFJQylnt^%U2$Zqp4?Mi5%IkRg`XQl<2Udn=8lVs^Th^6j_ZdPwq+s!3Ucs7eVsI zPCx@x3j=8>>f5z75RL`J$Hh}T!$BMa|H2yERgN~8$#4f$>S?g2Y$eo$y=Jykq{l9{re0)^%ZDFf7&pX-(PAGm3Rs9#98)NX^ z(9co=-S2`Mt$t2xk1*>Tq9^*FW? zoiTE6XssRCE8jGJPTvnky+M*?S9>6C;8J|#jJs&7i#xrDGu@W`1g^p1xdY(uf0Od2 zC23ALTjMPr7@J?!?fJ6Fu>TB?AI+XB>nM*f+oAl*9(enGxN&p3T^UsJ0z? zB!>>2R3lNv*jys?^XC1sA~1zlMEPD!r5gapwCwLIH;qdGDRJo2CKh?=6`u zIRNH+lRbqFg>~54A~eg<8IHkS)Z`_|TanZ+N^QJz;;yxw&cjVz0|1h!3mx4X3ja>~ zdy@VezyUN@>WK~~)b2eBr|#_k^`E0=KYz?@rKUW_b7@yi@at;(&T$A)^OD>wo%Vb- z***B(Kd9~en8x5pM;X1=A6RPV%ai56>I0`X#QB$U{=Wf#j_mySsV=S5oG;s-JG}Gd z(_y|{0Azu?(b3<+gH)H_SMJvzZUy}Ov0U=8|KCqLx&QwPv#kAGgv0pD?nkbb1t~rQ zAOZv=4$aV801GA00M6%sZkY0CMyr?U`7w<~`eXLAWZov{lVN+(M!+*#z)^&yQWaHQTEC$%Of9G1%R<>BDr_~%W1 z>RSs;dnhkzIk}Me7yr2!Ym{%(9Xzy}8XR7l#SB6HvPT1ESR9 znpUEDTlnp7Q2%!NSE6%T=6A=3N7dW@mN*?W^zR3$?Xqu1A@4Wo*0`zzsY zM1XM!0@B0HIpB~n-pJ)Ba_qi&qNE?@%+3--~ zx(z_9e0i`9a5Vvc(th76@MF*hI)F$J`p9DM;{(t%=g&BHQ_s#DX~6*~rZp5qk3wKC z(T7M_4BpWWmLzH$Km_C7)H5=!yf`P;J2lWkJj zhVz`TWD5Lh>&-eAeLzN?!gks0)AX9`9(Eh?5*-ygKXg`gaLNKU$uOMlF$5ql>$pw8 zgzNb@0!YVtAAnJfvl0L^n)m$HS;$HzTX?B)vyOV*7+@hEX9#h82cZt2@0#0wci!4u zU#o2k1v2`6^+aU$b;|V#`M0%*Lm_PtVz5peeME&>D@O z6EVxa^`uqF)~h0E8Vg)fCe?}Qu_iZ`UdwC_esZ4i(QtCx$eawE70wyXYtiTw(eVId zGR92u`R}K-%c#hx?*m4mCwYdQCTFmDdSqLXSQ#;gcaYLo*I{A3dn7#s&AK$Mp#sty zVpx*yDH`x@0s3SKr`|q&n)8%#U*a>pYa4)!9cMybO4^qHaQEJ`+_Oe;X;a^Ww{VhAC$X{C%#0 z0s(QoMY< zPSc30;Gu4&yvE?th+chLY)C)@P7(2?z%y!|O8xzGr7BhOTcX0iBlBVkP;Lb$`kM@B zmD>csVz?{%<8lUAt^?|u{7QCzCAeiqh_bJ&jUH~op{S{ZIy5y^>>;i%XQnY#e??EI zl6XhKC2vC55vCi@=SKnBUF%}uZ1dX#Yeahx<5h`y`q9wj6K}=N<9F0dx#>gy6QQwOf*1gnb@rXSLB%pSsT|^VJEu}VW0ekh5&eV@p$%;{22<1YkB1iy z9$QJ3#vf(VV-10E_k}{xmEMFR26206anCx=2q$OfS#Z6Fgf6Ee|cMyMG`5K(0tT#7lU9_k7+_nv~l@L7yD=&yd`8ERg6_rG}0#>J(hkjvJ}2j zwXkl%V6OBA(+p44^U1ffz*QGtK~a3(djcP$L+dO9QN>0l^Kyas@ipwF6Zci>J_jUD zYhP`aRKex2thNHnO~BzT1nr^1smoV)LQp$zOQ79R*T3Qzo+x5K-%^p~8p`T=!pb9m zR_!gUiYgH(@o;B}B1Sb~X8-ot+Ps;P)EfiHeCcTBjXq{roTxTJ|23iR$+&eG!v>O@ zsN8%v=XxYCuP*8OVmr6gbK4^(X%;wE$4j{wNA4GRJ>lBIiocQdg*KW$C1-+VYxH%H zX6oJ4J1N`4Y^JJ6Tb0W=D^YF2$voMQB1{FMO6Pktr>k4$V)Tk@wN;uYfy{Gr()WC# zjtseC>lot3`|C7IRv$xOBrZTBERB8iP9TmR#(C@E7A`fQ*bkvwLl*g@v;84x^|r*M z4)|OCm&JuBpJyv!32|}P%7+$*wY+Z~4e`23pd4nyLbUa9p{EP!_MQLb~5e8^rvj#ihvw7=IR^pf|;brXa zZNeR^vBD`l2i1ng6zaTHYT=lAhQkbc;w==~=fq|EzHbYjav43rfK6Nu;_)5(V#TAOle zGZ#O6kZrUZ47C@jOxn|37`M_LMxx;Lh>vQ18$h51sk*$T19!b}uI(r7qGhxkqJoBk zZnr$`y9B!?7tB0_1{dkU?cwOSBmD2~Wsn%jdozO_=S8C-I`LFN4ePoZIxkCX=m0dq z+^%Ht!CgL?Nj1H#~Wp+taRlv}-d&8PQq z84QEDc9q8MRGC!;L84 z+D0j`x<2(o0TIl^@pElPHP)YeH#8>5x0Xd}d2&C+7{AO+k=q zT%0Qz^DJm9pslf@6D#*J^H(1%z&Qi_6g>5<>#kZ;H3B6Pn-17-mAxTLahf<*R`E{z zwvC_gg%uUPn0fLNL|YXS5|ZWlA+9clYrciIq!&+^kU_p!*T%zO)2!HBoR^uBX2-c7 zjY&uH998do%S3Xf1Q|!N#b5inF$2FaM;jx_$ zTrhiSCX|Ls8U0?u#X_bAtTEY>U@dIcEBye($dX4~dL`6LiHU_?KyMF(jUH@|nQA0H z@BMTT3}}Cl7o31fS+@Y`ekdrmvW}>U%wozfhlR(o<7ef>ISS=(*0bV|pW}Hp9D5|e z0tO7h02|ygrOIqzm`X~upwq3o1fgs|8r;NDy=utql{_EK5er#^uRhOT99&%(OHUiN zbKF0X<@CfS9JQuaO&=e?xFmi@oHy{@1fOE~1-}I2ADjWq4-VhpbfTknmY+GEb1(I^ zn-5+E@i3vS0Lz##J_`gICfP5uFBh@&uc}~ZBVp(5Q)^T{*t1;mzIr_}nTerDSXn-=xjQgmU=QlJfjIg;Po3o-f?rS%Vj%Lw7B7%&0w)s}YpJ?lw zz>nY+XRlCl_?fUu%4|1YcuR!)Oq-Ri3LR8|WzN^%-SdFVax|ZYw5*3mkKUI_;I%>7 ze9}G!gczG!q-w{BEX$rLoFLay6}`vQDjz1gQEQL|N~Yfj&s7Cvgk_4cfn zNOnbJ$60_fS#1aLdUG60+o+g5d48&X)ZF$BIP&4{Y+q-LSYY$OQ}}%Vz}K1I-mlnZ zvU=7-0Jd{#@q8sOYr@X9vEt1}tW=s)^&Yg|Iy^=>Hl~Ib&L7PCf90L|TT=NR$1NMn z#xx^bN3ChI(#%lI1$T35l5!^ZFqB+U(aO|8bDz?*(r%fWBbcRj-HFOF&|K1R$t?vn zEO&Fk0)&Lf`&G2=otF6nE-f#*4V&*6K{;rV>t@9*oK;=uo>+xs7A^{Q0i&IefR|F1fk#0$cE7uo?e z9#4EL=g*IOzwR^+Q_-cwB?u?Is4bBn*&J^bA#0s9t6V;a$eqkXmW8JjuQ#zH z+v92l&o)p-NfP>z{0@Tio1jTdpQU+PQUkI1EeGHR;tbQ=cP9!(B{82G#jR7U1$U;h z&hW$N5FvuQO-}^eSJR=49SUkh~w^`QSM&FWX0&ghn%86l|Y`#%- zbFYR@H*4B+^i+yl3~HuSQchS5b|ykp|4<#$&&dpU*WQk|{_uD||DO+Yw2*X zG^{u6(uc~5$Vo>%o8`64naByRAxo%V^2%6GQK@c=F?}^>rZPB!%_Exk(aX3os0knJ zYy0Duh$b@hxF3LnN;j&pS6$N=Rbolu`Nz382KcYVcjIYpuE3zecrlY{7&2mx#s@VX zl9eEa0y7Cv_d2B~j>e$|?5uIA6w~-_`w34rKW~TYmiTG|b?2&vq<0!^5dSA*?9%-g zc5gP;_!TEO%Xzg<1BV?AJ#`b6Q&fF&I^Q_Us!yxjI@{45X77I;{O3QwNQCS6+}ow$ zU~6~14BidnLW}V<`>9m7St=%gCy(f|IY9_xK5D`+Sbn#uhC4e5HTYB{Bm;*XG>G+B zY{GcM#g$~BijXeXQbF?6&;8HV$-xy^{cOhSV8uhK_UA}(s=kuA-Wi1F@k+sCiIjc> zOU_9JGf~bqcpmn?CYsQ*UAAy$f*909Bu_omABGl`Vii2+G9s6lw8rN%b|^L%0%) z@chD9`5xyMlt-VNtHG#a@IA~B-^soN=bKz&;1eFApwi}xr{rF(ca@cKvXya~^$`}4 z&k!$MKnB@Xa{g6J<6bEy#}gK%1JecR;A#}jaG=X20DCrL+&^$!4in(h z6IXE~|5RMB+ojIfrj;Ko##6S2I-TBq0G_2eNd2hJ6`(>GDc<3FvEmY+eb2iO2Y@zN z2fb)4ZGDw-F1Q=?g$4~KbF(eyZf;*K&)XR92C!uBZ93l{rU@);=2}e_J8Zivq`aHD znibM@Cowzd_mQ08)MLnd>_>2y2?-^p%3rH$0I*nD;;i?F`F@TOla@4%j*8w8E=sQv z6Q4mpNuriZo-5Pdpvu*TPBP-fm{vN~rhy8jFmmKf!Lcng*D%d&m9_;@MKq`daA|8_ zqUzwXwVkyvJ}W>qx$R_V^d+5U*>H{>NpJx6XrA=j@hTvKt!&(G!T)8j`%au!Y($ot zsD*eQG<(o+)ed?g?VT=2C+mY5QOvE&Jrm9NC5l2lkdfGBJwU7c7<8HuMBDgMmif7z z*y<&rGty3PtSzrQ?ornQ&xX5AAH z$)3^OS(nXT+>y!lR=X(b#vY+Y)ghHEPH5z4r-USX7v>OC>(F)=Q$Th)edn@&uU4Sm z`Z$ne?BlQ2oN1`{=uK`$k7tDDk;KTkM}36o5utqJh>e->x0_iRrkc2HdLoX3+T} z4*Z-Vu`ONpme!kJ7oUSm+J>trN&72la7&~%j)B13z;kixL=!l_MW6W|+~FP$BmVLJkET8#Ayssu2E7XJBJBf896js9`Zrf*K^cTN-? bBb*c8dwcEE;uvU^7