diff --git a/.gitignore b/.gitignore index 5539efd0..fc7a49f8 100644 --- a/.gitignore +++ b/.gitignore @@ -234,4 +234,8 @@ msbuild.binlog LottieGenOutput-*/ # Visual Studio debugging configuration file. -launchSettings.json \ No newline at end of file +launchSettings.json + +# Tests +**/FramesAll +**/!Results \ No newline at end of file diff --git a/Lottie-Windows.sln b/Lottie-Windows.sln index b30bd62e..4cbe161d 100644 --- a/Lottie-Windows.sln +++ b/Lottie-Windows.sln @@ -171,6 +171,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Lottie-Windows-WinUI3", "Lo EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LottieSamples", "LottieSamples\LottieSamples.csproj", "{6AB50ED0-6273-4919-9ADE-50195664EF15}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LottieTest", "LottieTest\LottieTest.csproj", "{C9DDFDED-8E1D-4161-BD5A-D7186F94798A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LottieGen.dll", "dlls\LottieGen\LottieGen.dll.csproj", "{43C57BC9-B5D0-48CE-9048-314E66D26462}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution BETA|Any CPU = BETA|Any CPU @@ -613,6 +617,66 @@ Global {6AB50ED0-6273-4919-9ADE-50195664EF15}.Release|x86.ActiveCfg = Release|x86 {6AB50ED0-6273-4919-9ADE-50195664EF15}.Release|x86.Build.0 = Release|x86 {6AB50ED0-6273-4919-9ADE-50195664EF15}.Release|x86.Deploy.0 = Release|x86 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.BETA|Any CPU.ActiveCfg = Debug|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.BETA|Any CPU.Build.0 = Debug|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.BETA|ARM.ActiveCfg = Debug|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.BETA|ARM.Build.0 = Debug|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.BETA|ARM64.ActiveCfg = Debug|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.BETA|ARM64.Build.0 = Debug|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.BETA|x64.ActiveCfg = Debug|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.BETA|x64.Build.0 = Debug|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.BETA|x86.ActiveCfg = Debug|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.BETA|x86.Build.0 = Debug|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Debug|Any CPU.ActiveCfg = Debug|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Debug|Any CPU.Build.0 = Debug|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Debug|ARM.ActiveCfg = Debug|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Debug|ARM.Build.0 = Debug|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Debug|ARM64.ActiveCfg = Debug|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Debug|ARM64.Build.0 = Debug|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Debug|x64.ActiveCfg = Debug|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Debug|x64.Build.0 = Debug|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Debug|x86.ActiveCfg = Debug|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Debug|x86.Build.0 = Debug|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Release|Any CPU.ActiveCfg = Release|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Release|Any CPU.Build.0 = Release|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Release|ARM.ActiveCfg = Release|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Release|ARM.Build.0 = Release|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Release|ARM64.ActiveCfg = Release|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Release|ARM64.Build.0 = Release|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Release|x64.ActiveCfg = Release|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Release|x64.Build.0 = Release|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Release|x86.ActiveCfg = Release|x64 + {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Release|x86.Build.0 = Release|x64 + {43C57BC9-B5D0-48CE-9048-314E66D26462}.BETA|Any CPU.ActiveCfg = Debug|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.BETA|Any CPU.Build.0 = Debug|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.BETA|ARM.ActiveCfg = Debug|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.BETA|ARM.Build.0 = Debug|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.BETA|ARM64.ActiveCfg = Debug|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.BETA|ARM64.Build.0 = Debug|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.BETA|x64.ActiveCfg = Debug|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.BETA|x64.Build.0 = Debug|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.BETA|x86.ActiveCfg = Debug|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.BETA|x86.Build.0 = Debug|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.Debug|Any CPU.Build.0 = Debug|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.Debug|ARM.ActiveCfg = Debug|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.Debug|ARM.Build.0 = Debug|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.Debug|ARM64.Build.0 = Debug|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.Debug|x64.ActiveCfg = Debug|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.Debug|x64.Build.0 = Debug|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.Debug|x86.ActiveCfg = Debug|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.Debug|x86.Build.0 = Debug|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.Release|Any CPU.ActiveCfg = Release|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.Release|Any CPU.Build.0 = Release|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.Release|ARM.ActiveCfg = Release|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.Release|ARM.Build.0 = Release|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.Release|ARM64.ActiveCfg = Release|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.Release|ARM64.Build.0 = Release|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.Release|x64.ActiveCfg = Release|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.Release|x64.Build.0 = Release|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.Release|x86.ActiveCfg = Release|Any CPU + {43C57BC9-B5D0-48CE-9048-314E66D26462}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -651,6 +715,7 @@ Global {FC89273A-B2DA-4625-8A73-EF02A658D65E} = {AB232F35-AAF7-4AE2-B1D2-45DD9BC2F7D7} {7654A857-9A99-4185-9F8E-DD0CE662AF23} = {AB232F35-AAF7-4AE2-B1D2-45DD9BC2F7D7} {DC7F7A39-B7A7-40B4-937A-601460CAE38C} = {AB232F35-AAF7-4AE2-B1D2-45DD9BC2F7D7} + {43C57BC9-B5D0-48CE-9048-314E66D26462} = {C75BD686-21A6-4EB3-8D4B-D5A01C019C52} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {51B9BB4C-5196-41CF-950C-12B04AD8A61C} @@ -664,6 +729,7 @@ Global source\LottieMetadata\LottieMetadata.projitems*{25ceb8b8-90e0-4d23-9978-0cd83889d4ac}*SharedItemsImports = 5 source\WinUIXamlMediaData\WinUIXamlMediaData.projitems*{30059ca7-0745-4eec-8d11-b14850a70c98}*SharedItemsImports = 13 source\YamlData\YamlData.projitems*{39c6b7f3-5e75-4019-82ab-00fd8a0a06e2}*SharedItemsImports = 13 + source\LottieGen\LottieGen.projitems*{43c57bc9-b5d0-48ce-9048-314e66d26462}*SharedItemsImports = 5 source\LottieReader\LottieReader.projitems*{4e7d8957-3f5f-46e1-99a8-2012b806c9b0}*SharedItemsImports = 13 source\Animatables\Animatables.projitems*{5120efd7-a556-46bf-8d56-f65f1ef9a305}*SharedItemsImports = 4 source\CompMetadata\CompMetadata.projitems*{5120efd7-a556-46bf-8d56-f65f1ef9a305}*SharedItemsImports = 4 diff --git a/LottieTest/LottieTest.csproj b/LottieTest/LottieTest.csproj new file mode 100644 index 00000000..4550b8ec --- /dev/null +++ b/LottieTest/LottieTest.csproj @@ -0,0 +1,45 @@ + + + + Exe + net6.0-windows10.0.19041.0 + 10.0.19041.0 + 10.0.17763.0 + enable + enable + Microsoft + x64 + False + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + diff --git a/LottieTest/NativeMethods.txt b/LottieTest/NativeMethods.txt new file mode 100644 index 00000000..002c4375 --- /dev/null +++ b/LottieTest/NativeMethods.txt @@ -0,0 +1,9 @@ +GetMessage +TranslateMessage +DispatchMessage +MSG +RECT +SIZE +POINT +ID3D11Texture2D +IDirect3DDxgiInterfaceAccess diff --git a/LottieTest/Tests/Banana/Animation.gif b/LottieTest/Tests/Banana/Animation.gif new file mode 100644 index 00000000..833735b7 Binary files /dev/null and b/LottieTest/Tests/Banana/Animation.gif differ diff --git a/LottieTest/Tests/Banana/Lottie.json b/LottieTest/Tests/Banana/Lottie.json new file mode 100644 index 00000000..e7cbf2a8 --- /dev/null +++ b/LottieTest/Tests/Banana/Lottie.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE ","a":"","k":"","d":"","tc":""},"fr":60,"ip":0,"op":300,"w":500,"h":500,"nm":"banana","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"glass_banana Outlines","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":181,"s":[235.366,196.647,0],"to":[-1.094,5.909,0],"ti":[1.094,-5.909,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":211,"s":[228.8,232.102,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":271,"s":[228.8,232.102,0],"to":[1.094,-5.909,0],"ti":[-1.094,5.909,0]},{"t":299,"s":[235.366,196.647,0]}],"ix":2},"a":{"a":0,"k":[68.5,39.5,0],"ix":1},"s":{"a":0,"k":[91.336,91.336,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.302,0],[0,0]],"o":[[0,0],[0,5.787],[0,0],[0,0]],"v":[[-5.278,-12],[-5.278,1.523],[4.322,12],[5.278,12]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":46,"s":[0]},{"t":135,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[50]},{"i":{"x":[0.642],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":46,"s":[100]},{"i":{"x":[0.665],"y":[1]},"o":{"x":[0.356],"y":[0]},"t":90,"s":[70]},{"i":{"x":[0.819],"y":[0.71]},"o":{"x":[0.338],"y":[0]},"t":135,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":180,"s":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":211,"s":[10]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":271,"s":[10]},{"t":300,"s":[50]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[90.605,41.253],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.302,0],[0,0]],"o":[[0,0],[0,5.787],[0,0],[0,0]],"v":[[-5.278,-12],[-5.278,1.523],[4.322,12],[5.278,12]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":46,"s":[0]},{"t":135,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[50]},{"i":{"x":[0.672],"y":[1]},"o":{"x":[0.325],"y":[0]},"t":46,"s":[100]},{"i":{"x":[0.682],"y":[1]},"o":{"x":[0.327],"y":[0]},"t":90,"s":[70]},{"i":{"x":[0.804],"y":[0.704]},"o":{"x":[0.333],"y":[0]},"t":135,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":180,"s":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":211,"s":[10]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":271,"s":[10]},{"t":299,"s":[50]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[29.911,41.253],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-3.86,-2.021],[0,0],[0,0],[0,0],[3.152,-1.337],[0,0]],"o":[[0,0],[3.831,-2.093],[0,0],[0,0],[0,0],[-3.168,-1.287],[0,0],[0,0]],"v":[[-6.179,-2.064],[-6.179,-2.064],[5.963,-2.176],[6.179,-2.064],[6.179,4.197],[4.774,3.626],[-5.012,3.702],[-6.179,4.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[71.385,28.621],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.571,0.067],[0,0],[-16.292,-1.924],[0,-0.655],[0,0],[0.619,0],[0,0],[0,0.706],[0,0]],"o":[[0,0],[16.292,-1.924],[0.571,0.067],[0,0],[0,0.706],[0,0],[-0.619,0],[0,0],[0,-0.655]],"v":[[-24.504,-4.118],[-24.504,-4.118],[24.503,-4.118],[25.509,-2.846],[25.509,4.763],[24.388,6.042],[-24.389,6.042],[-25.509,4.763],[-25.509,-2.846]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[101.314,17.174],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.572,0],[0,0],[0,8.572],[0,0],[0,0],[0,0]],"o":[[0,0],[-8.572,0],[0,0],[0,0],[0,0],[0,8.572]],"v":[[8.229,19.519],[-8.228,19.519],[-23.75,3.998],[-23.75,-19.519],[23.749,-19.519],[23.749,3.998]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.102000000898,0.102000000898,0.102000000898,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[101.312,42.734],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.571,0.067],[0,0],[-16.292,-1.924],[0,-0.655],[0,0],[0.619,0],[0,0],[0,0.706],[0,0]],"o":[[0,0],[16.292,-1.924],[0.571,0.067],[0,0],[0,0.706],[0,0],[-0.619,0],[0,0],[0,-0.655]],"v":[[-24.503,-4.118],[-24.503,-4.118],[24.503,-4.118],[25.508,-2.846],[25.508,4.763],[24.389,6.042],[-24.389,6.042],[-25.508,4.763],[-25.508,-2.846]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[41.456,17.174],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.572,0],[0,0],[0,8.572],[0,0],[0,0],[0,0]],"o":[[0,0],[-8.572,0],[0,0],[0,0],[0,0],[0,8.572]],"v":[[8.229,19.519],[-8.228,19.519],[-23.749,3.998],[-23.749,-19.519],[23.749,-19.519],[23.749,3.998]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.102000000898,0.102000000898,0.102000000898,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[41.456,42.734],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"eye_banana Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[307.5,261,0],"ix":2},"a":{"a":0,"k":[54,30,0],"ix":1},"s":{"a":0,"k":[78.002,78.002,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.144,4.295],[0,0],[-4.328,0]],"o":[[0,0],[0.144,4.295],[4.329,0]],"v":[[8,-3.865],[-8,-3.865],[0,3.865]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[3.446,0],[0.595,3.285]],"o":[[-0.594,3.285],[-3.446,0],[0,0]],"v":[[6.891,-2.865],[0,2.864],[-6.891,-2.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[30.782,25.311],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.896,0],[0.385,3.813],[0,0]],"o":[[-3.896,0],[0,0],[-0.384,3.813]],"v":[[0,3.365],[-7.466,-3.365],[7.466,-3.365]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[30.782,25.311],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.325,9.729],[0,0],[-9.804,0]],"o":[[0,0],[0.325,9.729],[9.805,0]],"v":[[18.12,-8.754],[-18.12,-8.754],[0,8.754]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[7.137,0],[1.61,6.654]],"o":[[-1.611,6.654],[-7.137,0],[0,0]],"v":[[14.702,-5.754],[0,5.754],[-14.701,-5.754]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[26.662,27.692],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.495,0],[1.034,8.251],[0,0]],"o":[[-8.495,0],[0,0],[-1.033,8.251]],"v":[[0.001,7.254],[-16.499,-7.254],[16.499,-7.254]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[26.662,27.692],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.144,4.295],[0,0],[-4.328,0]],"o":[[0,0],[0.144,4.295],[4.329,0]],"v":[[8,-3.865],[-8,-3.865],[0,3.865]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[3.446,0],[0.594,3.285]],"o":[[-0.594,3.285],[-3.446,0],[0,0]],"v":[[6.891,-2.865],[0,2.864],[-6.891,-2.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[86.227,25.311],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.896,0],[0.385,3.813],[0,0]],"o":[[-3.896,0],[0,0],[-0.385,3.813]],"v":[[0,3.365],[-7.466,-3.365],[7.466,-3.365]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[86.227,25.311],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.325,9.729],[0,0],[-9.804,0]],"o":[[0,0],[0.325,9.729],[9.805,0]],"v":[[18.12,-8.754],[-18.12,-8.754],[0,8.754]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[7.138,0],[1.61,6.654]],"o":[[-1.609,6.654],[-7.137,0],[0,0]],"v":[[14.701,-5.754],[0,5.754],[-14.701,-5.754]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[82.107,27.692],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.494,0],[1.033,8.251],[0,0]],"o":[[-8.494,0],[0,0],[-1.033,8.251]],"v":[[0,7.254],[-16.498,-7.254],[16.498,-7.254]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[82.106,27.692],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":180,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"banana_two_19 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":45,"s":[20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":90,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":135,"s":[20]},{"t":181,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[250,250,0],"to":[6.083,0.667,0],"ti":[-2.083,-0.083,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":45,"s":[286.5,254,0],"to":[2.083,0.083,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":90,"s":[262.5,250.5,0],"to":[0,0,0],"ti":[2.083,0.083,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":135,"s":[286.5,254,0],"to":[-2.083,-0.083,0],"ti":[6.083,0.667,0]},{"t":181,"s":[250,250,0]}],"ix":2},"a":{"a":0,"k":[161.5,184.5,0],"ix":1},"s":{"a":0,"k":[76.152,76.152,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.806,-0.048],[0,0],[0.74,-0.64],[0,0],[0,0]],"o":[[0,0],[1.008,0.06],[0,0],[0,0],[0.485,-0.603]],"v":[[3.441,-5.022],[4.51,-4.96],[5.23,-3.081],[-5.97,5.07],[1.137,-4.358]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.651000019148,0.486000001197,0.322000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[11.368,278.296],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-41.658],[79.195,0],[25.54,24.856],[-26.716,0],[0,84.64],[9,28.771]],"o":[[0,83.51],[-37.493,0],[21.725,12.525],[82.807,0],[0,-31.16],[20,31.748]],"v":[[120.285,-25.216],[-23.11,126],[-120.285,85.971],[-46.757,105.634],[103.179,-47.618],[85.285,-126]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.987999949736,0.811999990426,0.128999986836,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[134.715,187],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.306,-0.906],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.49,-1.591]],"v":[[6.5,-4.547],[-10.5,5.453],[10.5,-0.736],[9.5,-3.547]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.651000019148,0.486000001197,0.322000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[204.5,10.547],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.942,0.689],[0,0]],"o":[[0,0],[-0.647,-0.971],[0,0],[0,0]],"v":[[10.781,19.548],[-10.134,-11.865],[-9.605,-14.832],[-1.113,-19.548]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.842999985639,0.694000004787,0.128999986836,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[204.113,30.548],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.111,-0.868],[-2.76,-0.852],[-5.804,-3.483],[12.886,-59.922],[60.855,-15.424],[37.104,57.624],[-0.939,1.394],[0,0],[-1.904,-1.005],[-23.861,-0.624],[-0.179,84.202],[3.879,13.39],[0,0],[0,0],[0,0],[-0.19,0.899],[-1,0.6],[0,0],[0,0],[-1.15,-0.55],[0,0],[-0.37,-1.009],[0,0],[0,0],[-0.01,-0.019]],"o":[[1.137,0.839],[3.141,2.438],[6.467,1.998],[38,24],[-13.199,61.376],[-76.838,19.477],[-0.91,-1.414],[0,0],[1.202,-1.786],[19.85,10.484],[84.175,2.202],[0.03,-14.646],[0,0],[0,0],[0,0],[-0.51,-0.859],[0.189,-1.07],[0,0],[0,0],[1.19,-0.719],[0,0],[0.88,0.42],[0,0],[0,0],[0.01,0.019],[0,0]],"v":[[82.299,-124.485],[85.671,-121.925],[94.161,-117.461],[112.641,-109.225],[146.837,47.114],[26.567,173.207],[-158.73,101.584],[-158.663,96.95],[-152.515,87.822],[-147.056,86.438],[-80.871,103.722],[73.641,-46.399],[67.731,-88.605],[54.641,-128.225],[34.837,-157.586],[29.228,-167.046],[28.758,-169.775],[30.577,-172.425],[38.178,-177.015],[46.528,-182.046],[50.258,-182.225],[50.268,-182.225],[52.258,-180.046],[64.888,-144.376],[67.018,-139.315],[67.047,-139.256]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.987999949736,0.933000033509,0.128999986836,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[163.36,186.225],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[162,386.883,0],"to":[5.167,0,0],"ti":[-1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":45,"s":[193,386.883,0],"to":[1,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":90,"s":[168,386.883,0],"to":[0,0,0],"ti":[1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":135,"s":[193,386.883,0],"to":[-1,0,0],"ti":[5.167,0,0]},{"t":181,"s":[162,386.883,0]}],"ix":2},"a":{"a":0,"k":[-86,133.883,0],"ix":1},"s":{"a":0,"k":[91,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[169.141,11.766],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.149019607843,0.149019607843,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-1.43,133.883],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/LottieTest/Tests/BlurOverlap/AfterEffects.aep b/LottieTest/Tests/BlurOverlap/AfterEffects.aep new file mode 100644 index 00000000..e1092314 Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/AfterEffects.aep differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame001.png b/LottieTest/Tests/BlurOverlap/Frames/frame001.png new file mode 100644 index 00000000..63322c5b Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame001.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame006.png b/LottieTest/Tests/BlurOverlap/Frames/frame006.png new file mode 100644 index 00000000..c6697789 Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame006.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame011.png b/LottieTest/Tests/BlurOverlap/Frames/frame011.png new file mode 100644 index 00000000..181bc17f Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame011.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame016.png b/LottieTest/Tests/BlurOverlap/Frames/frame016.png new file mode 100644 index 00000000..80bea068 Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame016.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame021.png b/LottieTest/Tests/BlurOverlap/Frames/frame021.png new file mode 100644 index 00000000..30e3a8fa Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame021.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame026.png b/LottieTest/Tests/BlurOverlap/Frames/frame026.png new file mode 100644 index 00000000..5f3e3844 Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame026.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame031.png b/LottieTest/Tests/BlurOverlap/Frames/frame031.png new file mode 100644 index 00000000..052de8c9 Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame031.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame036.png b/LottieTest/Tests/BlurOverlap/Frames/frame036.png new file mode 100644 index 00000000..260d64d3 Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame036.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame041.png b/LottieTest/Tests/BlurOverlap/Frames/frame041.png new file mode 100644 index 00000000..3133d6d4 Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame041.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame046.png b/LottieTest/Tests/BlurOverlap/Frames/frame046.png new file mode 100644 index 00000000..a1d32f7f Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame046.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame051.png b/LottieTest/Tests/BlurOverlap/Frames/frame051.png new file mode 100644 index 00000000..b61c7d04 Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame051.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame056.png b/LottieTest/Tests/BlurOverlap/Frames/frame056.png new file mode 100644 index 00000000..4ce161ef Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame056.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame061.png b/LottieTest/Tests/BlurOverlap/Frames/frame061.png new file mode 100644 index 00000000..3c3d4eb0 Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame061.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame066.png b/LottieTest/Tests/BlurOverlap/Frames/frame066.png new file mode 100644 index 00000000..236e3513 Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame066.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame071.png b/LottieTest/Tests/BlurOverlap/Frames/frame071.png new file mode 100644 index 00000000..e0b0856e Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame071.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame076.png b/LottieTest/Tests/BlurOverlap/Frames/frame076.png new file mode 100644 index 00000000..ba543c1f Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame076.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame081.png b/LottieTest/Tests/BlurOverlap/Frames/frame081.png new file mode 100644 index 00000000..08e1e8e6 Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame081.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame086.png b/LottieTest/Tests/BlurOverlap/Frames/frame086.png new file mode 100644 index 00000000..70344574 Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame086.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame091.png b/LottieTest/Tests/BlurOverlap/Frames/frame091.png new file mode 100644 index 00000000..fc9bf8ec Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame091.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame096.png b/LottieTest/Tests/BlurOverlap/Frames/frame096.png new file mode 100644 index 00000000..82979e37 Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame096.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame101.png b/LottieTest/Tests/BlurOverlap/Frames/frame101.png new file mode 100644 index 00000000..f03396e0 Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame101.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame106.png b/LottieTest/Tests/BlurOverlap/Frames/frame106.png new file mode 100644 index 00000000..896fc519 Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame106.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame111.png b/LottieTest/Tests/BlurOverlap/Frames/frame111.png new file mode 100644 index 00000000..4ed2cd70 Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame111.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame116.png b/LottieTest/Tests/BlurOverlap/Frames/frame116.png new file mode 100644 index 00000000..dd7661ba Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame116.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame121.png b/LottieTest/Tests/BlurOverlap/Frames/frame121.png new file mode 100644 index 00000000..9230ac19 Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame121.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame126.png b/LottieTest/Tests/BlurOverlap/Frames/frame126.png new file mode 100644 index 00000000..302bb19e Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame126.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame131.png b/LottieTest/Tests/BlurOverlap/Frames/frame131.png new file mode 100644 index 00000000..c9deb45b Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame131.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame136.png b/LottieTest/Tests/BlurOverlap/Frames/frame136.png new file mode 100644 index 00000000..56d9f1b2 Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame136.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame141.png b/LottieTest/Tests/BlurOverlap/Frames/frame141.png new file mode 100644 index 00000000..b49df0e2 Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame141.png differ diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame146.png b/LottieTest/Tests/BlurOverlap/Frames/frame146.png new file mode 100644 index 00000000..06d421b4 Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame146.png differ diff --git a/LottieTest/Tests/BlurOverlap/Lottie.json b/LottieTest/Tests/BlurOverlap/Lottie.json new file mode 100644 index 00000000..6abfe2e7 --- /dev/null +++ b/LottieTest/Tests/BlurOverlap/Lottie.json @@ -0,0 +1 @@ +{"v":"5.9.0","fr":30,"ip":0,"op":150,"w":500,"h":500,"nm":"Main","ddd":0,"assets":[{"id":"comp_0","nm":"Shape Layer 2 Comp 1","fr":30,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[491,393,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-42,-125],[-166,-109],[-194,9],[-91,3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.610795855522,0.419607818127,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":150,"st":0,"bm":0}]},{"id":"comp_1","nm":"Shape Layer 3 Comp 1","fr":30,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[258,402,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":29,"nm":"Gaussian Blur","np":5,"mn":"ADBE Gaussian Blur 2","ix":1,"en":1,"ef":[{"ty":0,"nm":"Blurriness","mn":"ADBE Gaussian Blur 2-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"Blur Dimensions","mn":"ADBE Gaussian Blur 2-0002","ix":2,"v":{"a":0,"k":1,"ix":2}},{"ty":7,"nm":"Repeat Edge Pixels","mn":"ADBE Gaussian Blur 2-0003","ix":3,"v":{"a":0,"k":1,"ix":3}}]}],"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-42,-125],[-166,-109],[-194,9],[-91,3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.108758166432,0.866666674614,0.394088506699,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":150,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Purple","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[250,250,0],"to":[-14.833,-12.333,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":58,"s":[161,176,0],"to":[0,0,0],"ti":[-14.833,-12.333,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":126,"s":[250,250,0],"to":[0,0,0],"ti":[0,0,0]},{"t":149,"s":[250,250,0]}],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":29,"nm":"Gaussian Blur","np":5,"mn":"ADBE Gaussian Blur 2","ix":1,"en":1,"ef":[{"ty":0,"nm":"Blurriness","mn":"ADBE Gaussian Blur 2-0001","ix":1,"v":{"a":0,"k":10,"ix":1}},{"ty":7,"nm":"Blur Dimensions","mn":"ADBE Gaussian Blur 2-0002","ix":2,"v":{"a":0,"k":1,"ix":2}},{"ty":7,"nm":"Repeat Edge Pixels","mn":"ADBE Gaussian Blur 2-0003","ix":3,"v":{"a":0,"k":1,"ix":3}}]}],"w":500,"h":500,"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Green","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[250,250,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[250,250,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":98,"s":[317,238,0],"to":[0,0,0],"ti":[0,0,0]},{"t":149,"s":[250,250,0]}],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":29,"nm":"Gaussian Blur","np":5,"mn":"ADBE Gaussian Blur 2","ix":1,"en":1,"ef":[{"ty":0,"nm":"Blurriness","mn":"ADBE Gaussian Blur 2-0001","ix":1,"v":{"a":0,"k":40,"ix":1}},{"ty":7,"nm":"Blur Dimensions","mn":"ADBE Gaussian Blur 2-0002","ix":2,"v":{"a":0,"k":1,"ix":2}},{"ty":7,"nm":"Repeat Edge Pixels","mn":"ADBE Gaussian Blur 2-0003","ix":3,"v":{"a":0,"k":1,"ix":3}}]}],"w":500,"h":500,"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[381,215.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":29,"nm":"Gaussian Blur","np":5,"mn":"ADBE Gaussian Blur 2","ix":1,"en":1,"ef":[{"ty":0,"nm":"Blurriness","mn":"ADBE Gaussian Blur 2-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"Blur Dimensions","mn":"ADBE Gaussian Blur 2-0002","ix":2,"v":{"a":0,"k":1,"ix":2}},{"ty":7,"nm":"Repeat Edge Pixels","mn":"ADBE Gaussian Blur 2-0003","ix":3,"v":{"a":0,"k":1,"ix":3}}]}],"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-42,-125],[-166,-109],[-194,9],[-91,3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.309803903103,0.488442987204,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":1,"nm":"White Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":500,"sh":500,"sc":"#ffffff","ip":0,"op":150,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/LottieTest/Tests/BlurOverlap/Test.json b/LottieTest/Tests/BlurOverlap/Test.json new file mode 100644 index 00000000..649463b4 --- /dev/null +++ b/LottieTest/Tests/BlurOverlap/Test.json @@ -0,0 +1,5 @@ +{ + "duration": 5, + "frames-per-second": 30, + "number-of-frames": 150 +} \ No newline at end of file diff --git a/LottieTest/Tests/BlurOverlap/Test.json.bak b/LottieTest/Tests/BlurOverlap/Test.json.bak new file mode 100644 index 00000000..1efd2d33 --- /dev/null +++ b/LottieTest/Tests/BlurOverlap/Test.json.bak @@ -0,0 +1,5 @@ +{ + "duration": "5", + "frames-per-second": "30", + "number-of-frames": "150" +} \ No newline at end of file diff --git a/LottieTest/Tests/Earth/Animation.gif b/LottieTest/Tests/Earth/Animation.gif new file mode 100644 index 00000000..52b1f859 Binary files /dev/null and b/LottieTest/Tests/Earth/Animation.gif differ diff --git a/LottieTest/Tests/Earth/Lottie.json b/LottieTest/Tests/Earth/Lottie.json new file mode 100644 index 00000000..e7dca040 --- /dev/null +++ b/LottieTest/Tests/Earth/Lottie.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 1.0.0","a":"","k":"","d":"","tc":"#FFFFFF"},"fr":25,"ip":0,"op":100,"w":300,"h":300,"nm":"EARTH01","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Hand1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":18,"s":[22]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":53,"s":[-6]},{"t":82,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.26,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[-78.628,85.519,0],"to":[10.333,22,0],"ti":[-42.333,-17,0]},{"t":45,"s":[26.372,160.519,0]}],"ix":2},"a":{"a":0,"k":[26.372,160.519,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.817,0],[0,0],[0,-1.626],[0,0],[0,0],[0,3.073],[0.146,0.5]],"o":[[0,0],[-1.951,0],[0,0],[0,0],[3.073,0],[0,-0.545],[-0.598,0.777]],"v":[[13.491,-2.315],[-12.363,-2.315],[-15.895,0.629],[-15.895,3.572],[10.314,3.572],[15.895,-2.009],[15.649,-3.572]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392158031,0.72549021244,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[140.669,220.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.472,0.946],[2.052,0],[0,0],[0,-1.984],[0,0],[0,0],[0,0],[-1.272,1.307],[0,1.943]],"o":[[-1.291,2.445],[0,0],[-1.984,-0.048],[0,0],[0,0],[0,0],[1.943,0],[1.307,-1.272],[0,-1.123]],"v":[[20.432,-5.091],[15.257,-1.09],[-17.576,-1.886],[-21.194,1.646],[-21.194,5.091],[11.725,5.091],[14.129,5.091],[19.109,3.007],[21.194,-1.973]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392158031,0.72549021244,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[145.968,204.457],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.393,0],[0,0],[2.224,0.553],[7.643,5.095],[7.065,3.532],[-12.082,11.781],[1.073,0.916],[-53.073,-28.173],[0,0],[0,0],[-3.462,-1.307],[-1.025,-0.318],[0,0],[-5.545,-0.035],[0,0],[0,3.144],[0.046,0.291]],"o":[[0,0],[-2.291,0],[-5.716,-1.42],[0,0],[-6.335,-3.167],[-13.828,-5.716],[-32.41,-14.855],[0.742,0.282],[0,0],[2.967,2.261],[0.989,0.353],[0,0],[5.298,1.625],[0,0],[3.144,0],[0,-0.303],[-1.278,1.821]],"v":[[60.022,40.255],[34.961,40.255],[28.183,39.432],[3.506,29.658],[-17.687,11.997],[-15.383,-23.134],[-43.47,-40.916],[-23.513,18.638],[-22.348,19.062],[-5.746,31.637],[3.897,37.111],[6.864,38.101],[16.437,41.068],[32.756,43.576],[60.272,43.788],[65.959,38.101],[65.8,37.238]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392158031,0.72549021244,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[83.541,194.019],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.272,1.307],[-0.356,0.965],[0.738,0],[0,0],[0,-1.17],[0,0],[0,0]],"o":[[0.732,-0.711],[-0.567,0.232],[0,0],[-1.951,0],[0,0],[0,0],[1.943,0]],"v":[[15.24,0.235],[16.87,-2.319],[14.92,-1.92],[-13.338,-1.92],[-16.87,0.2],[-16.87,2.319],[10.26,2.319]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392158031,0.72549021244,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[142.772,193.1],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[142.772,193.1],"ix":2},"a":{"a":0,"k":[142.772,193.1],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[142.772,193.1],"ix":2},"a":{"a":0,"k":[142.772,193.1],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.943,0],[0,0],[0,-3.885],[1.307,-1.272],[1.943,0],[0,0],[0,0],[0,-2.861],[3.073,0],[0,0],[0,0],[0,-2.826],[3.144,0],[0,0],[5.298,1.625],[0,0],[0.989,0.353],[2.967,2.261],[0,0],[0.742,0.283],[0.706,22.147],[-17.379,0],[-10.738,0],[-5.369,2.755],[-2.367,0],[0,-3.603],[2.19,-1.095],[0,0],[0,0],[0,0],[-0.459,-0.106],[0,-3.391],[1.307,-1.272]],"o":[[0,0],[3.885,0],[0,1.943],[-1.272,1.307],[0,0],[0,0],[2.826,0.318],[0,3.073],[0,0],[0,0],[2.79,0.424],[0,3.144],[0,0],[-5.546,-0.035],[0,0],[-1.024,-0.318],[-3.462,-1.307],[0,0],[0,0],[-11.974,-16.955],[1.448,1.236],[0,0],[0,0],[2.084,-1.06],[3.603,0],[0,2.508],[0,0],[0,0],[0,0],[0.495,0],[3.214,0.671],[0,1.943],[-1.272,1.307]],"v":[[49.416,-0.035],[56.481,-0.035],[63.545,7.029],[61.461,12.01],[56.481,14.094],[21.158,14.094],[47.968,17.061],[52.949,22.642],[47.368,28.223],[21.158,28.223],[41.01,31.049],[45.884,36.665],[40.197,42.352],[12.681,42.14],[-3.638,39.632],[-13.211,36.665],[-16.178,35.676],[-25.821,30.201],[-42.422,17.626],[-43.588,17.202],[-63.545,-42.352],[-21.229,-21.229],[0.954,-31.826],[14.906,-37.301],[21.688,-38.89],[28.223,-32.355],[24.62,-26.492],[7.029,-17.697],[14.094,-14.164],[49.416,-14.164],[50.829,-14.023],[56.481,-7.1],[54.397,-2.119]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392158031,0.807843148708,0.764705896378,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[103.616,195.455],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"shadow1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":22,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[113.629,208.392,0],"ix":2},"a":{"a":0,"k":[113.629,208.392,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.245,0.747],[0.61,0],[0,0],[0,0],[0,0],[0,0],[0,-2.826],[0.272,-0.665],[0,0],[0,3.073]],"o":[[-0.55,0.182],[0,0],[0,0],[0,0],[0,0],[2.79,0.424],[0,0.764],[0,0],[3.073,0],[0,-2.461]],"v":[[12.052,-5.451],[10.314,-5.146],[4.52,-5.146],[-15.895,-5.146],[2.871,-2.474],[3.956,-2.32],[8.831,3.297],[8.403,5.451],[10.314,5.451],[15.895,-0.13]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[140.669,228.823],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.49,1.298],[1.769,0],[0,0],[0,0],[0,0],[0,0],[0,-2.861],[0.253,-0.636],[0,0],[-1.272,1.307],[0,1.943]],"o":[[-1.236,1.102],[0,0],[0,0],[0,0],[0,0],[2.826,0.318],[0,0.724],[0,0],[1.943,0],[1.307,-1.272],[0,-2.119]],"v":[[18.738,-6.184],[14.129,-4.413],[-0.193,-4.413],[-21.194,-4.413],[-0.613,-2.135],[5.616,-1.446],[10.597,4.135],[10.194,6.184],[14.129,6.184],[19.109,4.1],[21.194,-0.88]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[145.968,213.961],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.215,0.803],[0.663,0],[0,0],[0,0],[3.068,0.532],[2.306,0.707],[0,0],[0.989,0.353],[2.967,2.261],[0,0],[0.688,0.26],[-13.313,-7.883],[0,0],[-5.329,-0.094],[-0.211,-0.001],[0,0],[0,0],[0,3.144]],"o":[[-0.592,0.208],[0,0],[0,0],[-3.132,-0.02],[-2.364,-0.41],[0,0],[-1.024,-0.318],[-3.461,-1.307],[0,0],[0,0],[8.91,12.585],[0,0],[5.097,1.563],[0.211,0.004],[0,0],[0,0],[3.144,0],[0,-2.436]],"v":[[40.896,6.921],[39.015,7.264],[17.185,7.096],[11.499,7.052],[2.195,6.193],[-4.82,4.544],[-14.393,1.577],[-17.36,0.588],[-27.003,-4.887],[-43.605,-17.462],[-44.702,-17.861],[-10.992,13.228],[-4.82,15.141],[10.868,17.622],[11.499,17.649],[19.111,17.707],[39.015,17.861],[44.702,12.174]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[104.798,230.543],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.778,0],[0,0],[0.585,0.51]],"o":[[0,0],[-0.393,-0.672],[-1.238,1.112]],"v":[[-3.052,0.893],[3.052,0.893],[1.575,-0.893]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[156.084,194.526],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,2.508],[1.664,1.186],[0.31,-0.155],[0,0],[0,0]],"o":[[0,0],[2.19,-1.095],[0,-2.194],[-0.277,0.199],[0,0],[0,0],[0,0]],"v":[[3.532,6.454],[6.994,4.724],[10.597,-1.14],[7.837,-6.454],[6.994,-5.873],[-10.597,2.922],[-3.532,6.454]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[121.242,174.836],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Hand2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":18,"s":[-29]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":53,"s":[7]},{"t":92,"s":[4]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.26,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[386.258,48.033,0],"to":[-10,27.667,0],"ti":[21,-4.667,0]},{"t":45,"s":[286.258,103.033,0]}],"ix":2},"a":{"a":0,"k":[286.258,103.033,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.951,0],[0,0],[0.644,1.44],[0,-0.975],[-3.073,0],[0,0]],"o":[[0,-1.951],[0,0],[-1.16,0],[-0.442,0.804],[0,3.073],[0,0],[0,0]],"v":[[15.895,1.781],[12.363,-1.751],[-12.363,-1.751],[-15.188,-4.136],[-15.895,-1.445],[-10.314,4.136],[15.895,4.136]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392158031,0.72549021244,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[158.331,155.961],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[52.934,-23.67],[5.33,-2.284],[6.395,-3.197],[0,0],[5.716,-1.42],[2.291,0],[0,0],[1.048,2.589],[0,-0.813],[-3.108,-0.035],[-0.035,0],[0,0],[-5.298,1.625],[0,0],[0,0],[-0.989,0.353],[-2.967,2.261],[0,0],[-10.42,6.853]],"o":[[-4.414,2.913],[12.493,11.73],[-7.065,3.532],[-7.643,5.095],[-2.223,0.553],[0,0],[-2.965,0],[-0.312,0.701],[0,3.108],[0.035,0],[0,0],[5.545,-0.035],[0,0],[0,0],[1.024,-0.318],[3.462,-1.307],[0,0],[0,0],[57.625,-29.914]],"v":[[24.478,-33.791],[9.531,-25.556],[12.185,9.903],[-9.008,27.564],[-33.685,37.337],[-40.463,38.161],[-65.524,38.161],[-72.066,33.741],[-72.589,36.006],[-66.972,41.693],[-66.902,41.693],[-39.385,41.481],[-23.066,38.973],[-19.499,37.878],[-13.494,36.006],[-10.527,35.017],[-0.884,29.542],[15.718,16.967],[36.417,6.688]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392158031,0.72549021244,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[222.089,132.533],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.951,0],[0,0],[1.225,3.15],[0,-1.288],[-1.307,-1.272],[-1.943,0],[0,0]],"o":[[0,0],[0,-1.951],[0,0],[-2.606,0],[-0.608,1.042],[0,1.943],[1.272,1.307],[0,0],[0,0]],"v":[[21.194,5.294],[21.194,3.528],[17.661,-0.004],[-14.129,-0.004],[-20.211,-5.294],[-21.194,-1.77],[-19.109,3.21],[-14.129,5.294],[-10.597,5.294]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392158031,0.72549021244,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[153.032,140.673],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.943,0],[0,0],[0,0],[1.951,0],[0,0],[0.251,1.022],[-1.076,-1.046]],"o":[[0,0],[0,0],[0,-1.17],[0,0],[-1.774,0],[0.22,1.539],[1.272,1.307]],"v":[[-10.647,3.03],[17.611,3.03],[17.611,0.91],[14.079,-1.209],[-14.179,-1.209],[-17.611,-3.03],[-15.627,0.945]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392158031,0.72549021244,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[156.615,128.809],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[156.615,128.809],"ix":2},"a":{"a":0,"k":[156.615,128.809],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.025,-0.102],[0,0.344]],"o":[[0,0.106],[-0.047,-0.331],[0,0]],"v":[[-0.05,0.204],[0.05,0.503],[-0.05,-0.503]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[138.953,125.277],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[138.953,125.277],"ix":2},"a":{"a":0,"k":[138.953,125.277],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.272,1.307],[0,1.943],[-3.885,0],[0,0],[0,0],[0,0],[0,2.508],[-3.603,0],[-0.848,-0.177],[-1.307,-0.671],[0,0],[-2.79,-1.166],[0,0],[0,0],[-8.619,5.687],[-1.342,-14.518],[0,0],[0,0],[3.462,-1.307],[1.024,-0.318],[0,0],[0,0],[5.546,-0.035],[0,0],[0.035,0],[0,3.108],[-2.79,0.424],[0,0],[0,0],[0,3.073],[-2.826,0.318],[0,0],[0,0],[1.272,1.307],[0,1.943],[-3.885,0]],"o":[[-1.943,0],[-1.307,-1.272],[0,-3.885],[0,0],[0,0],[0,0],[-2.19,-1.095],[0,-3.603],[0.883,0],[1.484,0.212],[5.369,2.755],[2.896,0],[0,0],[7.453,3.073],[9.714,0],[6.429,12.292],[-10.42,6.853],[0,0],[-2.967,2.261],[-0.989,0.353],[0,0],[0,0],[-5.298,1.625],[0,0],[-0.035,0],[-3.108,-0.035],[0,-2.826],[0,0],[0,0],[-3.073,0],[0,-2.861],[0,0],[0,0],[-1.943,0],[-1.307,-1.272],[0,-3.885],[0,0]],"v":[[-49.204,-1.766],[-54.185,-3.85],[-56.269,-8.831],[-49.204,-15.895],[-13.882,-15.895],[-6.817,-19.427],[-24.408,-28.223],[-28.011,-34.086],[-21.476,-40.621],[-18.898,-40.374],[-14.694,-39.031],[-0.742,-33.556],[7.912,-31.614],[7.948,-31.614],[21.441,-22.96],[51.394,-34.863],[63.333,5.616],[42.634,15.895],[26.033,28.47],[16.39,33.945],[13.423,34.934],[7.418,36.806],[3.85,37.901],[-12.469,40.409],[-39.985,40.621],[-40.056,40.621],[-45.672,34.934],[-40.798,29.318],[-20.946,26.492],[-47.156,26.492],[-52.737,20.911],[-47.756,15.33],[-20.946,12.363],[-56.269,12.363],[-61.249,10.279],[-63.333,5.298],[-56.269,-1.766]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392158031,0.807843148708,0.764705896378,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.172,133.605],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"shadow2","parent":3,"sr":1,"ks":{"o":{"a":0,"k":22,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[195.419,144.797,0],"ix":2},"a":{"a":0,"k":[195.419,144.797,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.236,1.102],[0.392,-0.67],[0,0]],"o":[[-0.583,0.507],[0,0],[-1.769,0]],"v":[[-1.57,-0.886],[-3.039,0.886],[3.039,0.886]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[142.929,130.953],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.19,-1.095],[0,0],[0,0],[0,0],[0,0],[0.277,0.199],[0,-2.194]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.31,-0.155],[-1.664,1.186],[0,2.508]],"v":[[-6.994,4.724],[-3.532,6.454],[3.532,6.454],[10.597,2.922],[-6.994,-5.873],[-7.837,-6.454],[-10.597,-1.14]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[177.758,111.255],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.185,-0.18],[-1.943,0],[0,0],[0.016,0.675],[0,0.045],[-2.826,0.318],[0,0],[0,0],[1.236,1.102],[0,-2.119],[-0.989,-1.206]],"o":[[1.272,1.307],[0,0],[-0.238,-0.597],[-0.001,-0.045],[0,-2.861],[0,0],[0,0],[-1.769,0],[-1.49,1.298],[0,1.668],[0.163,0.199]],"v":[[-19.109,4.1],[-14.129,6.184],[-10.194,6.184],[-10.583,4.268],[-10.597,4.135],[-5.616,-1.446],[21.194,-4.413],[-14.129,-4.413],[-18.738,-6.184],[-21.194,-0.88],[-19.605,3.511]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[153.032,150.38],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.79,0.424],[0,0],[0,0],[0,0],[0,0],[0.55,0.182],[0,-2.461],[-3.073,0],[0,0],[0,0.762]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.61,0],[-2.245,0.747],[0,3.073],[0,0],[-0.274,-0.666],[0,-2.826]],"v":[[-3.956,-2.32],[0.616,-2.971],[15.895,-5.146],[-1.996,-5.146],[-10.314,-5.146],[-12.052,-5.451],[-15.895,-0.13],[-10.314,5.451],[-8.403,5.451],[-8.831,3.296]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[158.331,165.242],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.322,3.374],[0,0],[0,0],[3.462,-1.307],[1.024,-0.318],[0,0],[0,0],[0,0],[5.545,-0.035],[0,0],[0,0],[0.035,0],[0.57,0.201],[0,-2.437],[-0.274,-0.666],[0,0],[-0.459,-0.106],[-3.003,-0.25],[0,0],[0,0],[-5.298,1.625],[0,0],[0,0],[0,0],[-0.989,0.353],[-2.967,2.261],[0,0],[-15.794,13.892],[0,0.724]],"o":[[-10.401,6.828],[0,0],[-2.967,2.261],[-0.989,0.353],[0,0],[0,0],[0,0],[-5.298,1.625],[0,0],[0,0],[-0.035,0],[-0.637,-0.007],[-2.217,0.802],[0,0.762],[0,0],[0.748,0.542],[1.985,0.414],[0,0],[0,0],[5.545,-0.035],[0,0],[0,0],[0,0],[1.024,-0.318],[3.462,-1.307],[0,0],[0,0],[0.014,-0.721],[0,-3.468]],"v":[[79.37,-39.072],[33.556,-12.524],[16.955,0.051],[7.312,5.526],[4.345,6.515],[-1.642,8.381],[-1.66,8.387],[-5.228,9.482],[-21.547,11.99],[-38.037,12.117],[-49.063,12.202],[-49.134,12.202],[-50.942,11.858],[-54.75,17.112],[-54.322,19.266],[-53.101,20.91],[-50.234,22.071],[-45.135,22.768],[-37.709,22.711],[-21.547,22.587],[-5.228,20.079],[-1.66,18.984],[0.442,18.328],[4.345,17.112],[7.312,16.122],[16.955,10.647],[33.556,-1.927],[79.863,-26.67],[79.919,-28.828]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[204.25,162.024],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[204.25,162.024],"ix":2},"a":{"a":0,"k":[204.25,162.024],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"circle mask 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[22]},{"t":24,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[149.51,149.51,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":2,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.8,0.8,0.8],"y":[0,0,0]},"t":14,"s":[132.3,132.3,100]},{"t":24,"s":[79.38,79.38,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.448,7.065],[52.984,0],[13.352,-5.793],[11.656,-21.194],[0,-0.035],[0,-19.074],[-60.472,0],[-19.604,18.544],[0,31.366]],"o":[[-10.102,-50.017],[-15.471,0],[-22.324,9.678],[0,0.035],[-8.583,15.613],[0,60.472],[29.106,0],[21.123,-19.957],[0,-7.488]],"v":[[107.31,-21.829],[0,-109.5],[-43.553,-100.493],[-96.042,-52.666],[-96.042,-52.595],[-109.5,0],[0,109.5],[75.166,79.617],[109.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.658823529412,0.933333333333,0.956862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.23],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":14,"s":[2]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":113,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"circle mask 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[68]},{"t":24,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[149.51,149.51,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":2,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.8,0.8,0.8],"y":[0,0,0]},"t":14,"s":[106.82,106.82,100]},{"t":24,"s":[78.4,78.4,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.448,7.065],[52.984,0],[13.352,-5.793],[11.656,-21.194],[0,-0.035],[0,-19.074],[-60.472,0],[-19.604,18.544],[0,31.366]],"o":[[-10.102,-50.017],[-15.471,0],[-22.324,9.678],[0,0.035],[-8.583,15.613],[0,60.472],[29.106,0],[21.123,-19.957],[0,-7.488]],"v":[[107.31,-21.829],[0,-109.5],[-43.553,-100.493],[-96.042,-52.666],[-96.042,-52.595],[-109.5,0],[0,109.5],[75.166,79.617],[109.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.658823529412,0.933333333333,0.956862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.23],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":14,"s":[2]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":113,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"circle mask","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[47]},{"t":24,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[149.51,149.51,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.8,0.8,0.8],"y":[0,0,0]},"t":14,"s":[118.58,118.58,100]},{"t":24,"s":[90.16,90.16,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.448,7.065],[52.984,0],[13.352,-5.793],[11.656,-21.194],[0,-0.035],[0,-19.074],[-60.472,0],[-19.604,18.544],[0,31.366]],"o":[[-10.102,-50.017],[-15.471,0],[-22.324,9.678],[0,0.035],[-8.583,15.613],[0,60.472],[29.106,0],[21.123,-19.957],[0,-7.488]],"v":[[107.31,-21.829],[0,-109.5],[-43.553,-100.493],[-96.042,-52.666],[-96.042,-52.595],[-109.5,0],[0,109.5],[75.166,79.617],[109.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.658823529412,0.933333333333,0.956862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.23],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[17]},{"t":24,"s":[5]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":113,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"scale","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.16,0.16,0.16],"y":[1,1,1]},"o":{"x":[0.62,0.62,0.62],"y":[0,0,0]},"t":26,"s":[98,98,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":57,"s":[111,111,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":74,"s":[111,111,100]},{"t":99,"s":[106,106,100]}],"ix":6}},"ao":0,"ip":0,"op":100,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Hands","parent":1,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[150,150,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"f","pt":{"a":0,"k":{"i":[[1.448,7.064],[52.984,0],[13.352,-5.793],[11.657,-21.194],[0,-0.035],[0,-19.074],[-60.472,0],[-19.604,18.544],[0,31.367]],"o":[[-10.102,-50.017],[-15.471,0],[-22.324,9.678],[0,0.035],[-8.583,15.613],[0,60.472],[29.106,0],[21.123,-19.957],[0,-7.488]],"v":[[257.31,128.171],[150,40.5],[106.447,49.507],[53.958,97.334],[53.958,97.405],[40.5,150],[150,259.5],[225.166,229.617],[259.5,150]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"w":300,"h":300,"ip":0,"op":100,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"line glow","parent":6,"sr":1,"ks":{"o":{"a":0,"k":44,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42.387,-28.258,0],"ix":2},"a":{"a":0,"k":[191.887,121.242,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.417,0],[1.126,0.383],[-1.878,5.543],[-0.305,1.043],[-5.619,-1.64],[1.639,-5.619],[0.443,-1.307]],"o":[[-1.128,0],[-5.543,-1.878],[0.347,-1.024],[1.639,-5.619],[5.617,1.639],[-0.388,1.333],[-1.495,4.417]],"v":[[-0.553,12.366],[-3.955,11.802],[-10.591,-1.633],[-9.617,-4.735],[3.524,-11.939],[10.728,1.202],[9.481,5.165]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.658717675303,0.933783677045,0.95715379902,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[231.977,177.757],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5.852,0],[0,5.852],[42.849,0],[0,5.852],[-5.852,0],[0,-54.536]],"o":[[-5.852,0],[0,-42.849],[-5.852,0],[0,-5.852],[54.536,0],[0,5.852]],"v":[[44.153,54.75],[33.556,44.153],[-44.153,-33.556],[-54.75,-44.153],[-44.153,-54.75],[54.75,44.153]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.658717675303,0.933783677045,0.95715379902,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[191.887,107.111],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":113,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"earth shadow","parent":6,"sr":1,"ks":{"o":{"a":0,"k":22,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-9.644,9.703,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.29,-3.13],[13.615,0],[10.562,3.392],[10.922,9.367],[3.538,27.53],[0,4.777],[-12.065,17.597],[8.233,-14.97],[0,-0.035],[0,-19.074],[-60.472,0],[-19.604,18.544],[-4.397,6.383]],"o":[[-12.026,4.541],[-11.689,0],[-14.021,-4.503],[-20.056,-17.199],[-0.593,-4.615],[0,-22.948],[-14,9.67],[0,0.035],[-8.583,15.613],[0,60.472],[29.106,0],[5.614,-5.304],[-7.19,4.944]],"v":[[76.567,64.494],[37.902,71.538],[4.398,66.297],[-33.323,45.172],[-70.665,-23.875],[-71.598,-37.962],[-52.462,-99.797],[-86.398,-62.37],[-86.398,-62.299],[-99.856,-9.703],[9.644,99.797],[84.81,69.914],[99.856,52.317]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":113,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"continent","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[24.269,4.356,0],"ix":2},"a":{"a":0,"k":[173.769,153.856,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"f","pt":{"a":0,"k":{"i":[[1.448,7.064],[52.984,0],[13.353,-5.789],[11.657,-21.194],[0,-0.035],[0,-19.074],[-60.472,0],[-19.615,18.533],[0,31.367]],"o":[[-10.102,-50.017],[-15.471,0],[-22.324,9.678],[0,0.035],[-8.583,15.613],[0,60.472],[29.106,0],[21.123,-19.957],[0,-7.488]],"v":[[256.81,127.171],[149.5,39.5],[105.947,48.507],[53.458,96.334],[53.458,96.405],[40,149],[149.5,258.5],[224.666,228.617],[259,149]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.318,-3.532],[4.38,-2.861],[4.592,-2.473],[6.393,-4.945],[0.106,-0.141],[3.073,-0.035],[5.334,-2.084],[-0.742,-3.991],[-2.261,-3.356],[-0.071,-4.062],[8.583,8.089],[3.144,6.817],[0.636,2.614],[-0.671,4.733],[0,0.035],[-22.324,9.678],[-23.264,-4.506],[-7.338,-8.618]],"o":[[0.459,5.298],[-4.345,2.896],[-7.1,3.815],[-0.141,0.141],[-2.508,1.907],[-5.722,0.106],[-3.744,1.448],[0.742,3.991],[2.225,3.356],[-11.515,1.943],[-5.44,-5.122],[-1.166,-2.402],[-1.201,-4.663],[0,-0.035],[11.656,-21.194],[8.293,0.645],[31.53,6.107],[2.296,2.685]],"v":[[68.435,-11.444],[60.806,1.554],[46.783,8.477],[27.602,23.242],[27.179,23.596],[18.842,27.234],[2.347,23.772],[-2.174,34.016],[3.265,44.789],[7.751,55.88],[-23.721,43.341],[-37.073,25.397],[-39.793,17.838],[-40.711,3.638],[-45.803,3.57],[-62.744,-52.43],[2.766,-54.783],[63.737,-20.77]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":0,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.46274510026,0.768627464771,0.43137255311,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[94.169,93.266],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.331,-3.885],[2.685,-4.592],[4.875,-2.473],[3.214,0.212],[2.649,2.155],[-0.071,4.557],[-2.473,2.473],[-1.66,1.13],[-1.024,1.06],[-1.166,0.495],[-3.638,-0.389]],"o":[[2.72,4.592],[-2.685,4.627],[-2.826,1.413],[-3.462,-0.177],[-3.568,-2.932],[0.035,-3.426],[1.378,-1.413],[1.236,-0.848],[0.883,-0.883],[3.356,-1.413],[4.627,0.53]],"v":[[17.944,-10.519],[17.379,4.634],[5.298,15.09],[-3.886,17.492],[-13.175,13.359],[-19.71,1.808],[-15.365,-7.305],[-10.738,-11.049],[-7.241,-13.698],[-4.309,-15.712],[6.464,-17.407]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":0,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.46274510026,0.768627464771,0.43137255311,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.49,88.173],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.177,-1.59],[2.19,-6.287],[0.918,0.777],[3.038,5.298],[-0.459,6.959],[-2.049,6.747],[0.671,2.614],[2.049,5.899],[-1.695,2.932],[-1.448,1.378],[-1.59,0.671],[-2.896,0.671],[-3.462,0.212],[-8.23,-4.592],[-1.095,-7.559],[5.652,-5.51],[3.638,-3.073],[0.495,-0.918],[-0.071,-1.342],[2.826,-3.603],[2.755,-0.424],[2.826,-0.035],[1.201,-0.812]],"o":[[-0.706,6.57],[-1.201,-0.318],[-4.627,-4.203],[-3.532,-6.181],[0.459,-6.994],[0.777,-2.579],[-1.519,-6.04],[-1.166,-3.32],[0.989,-1.695],[1.201,-1.201],[2.685,-1.166],[3.391,-0.777],[9.608,-0.636],[7.065,3.921],[1.13,7.559],[-3.426,3.32],[-0.848,0.706],[-0.636,1.201],[0.212,4.415],[-1.625,2.119],[-2.79,0.459],[-1.484,0.035],[-1.413,0.954]],"v":[[-9.959,30.804],[-8.475,50.372],[-11.513,48.43],[-23.876,34.654],[-28.009,14.308],[-23.629,-6.25],[-22.675,-14.197],[-34.579,-28.821],[-32.848,-38.428],[-29.386,-43.268],[-25.077,-45.917],[-16.706,-48.778],[-6.391,-50.12],[21.655,-45.882],[34.795,-27.443],[27.483,-6.426],[16.144,2.369],[14.025,4.736],[13.389,8.692],[12.047,21.62],[4.877,25.293],[-3.566,25.647],[-7.804,26.6]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":0,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.46274510026,0.768627464771,0.43137255311,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[131.978,204.248],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[2.473,4.38],[-1.59,5.334],[0.071,2.473],[2.296,2.932],[1.519,3.32],[-2.437,2.896],[-2.932,3.356],[-2.119,3.78],[-3.921,3.462],[-2.155,0.989],[-2.508,0.424],[-3.674,0.212],[-6.561,-3.609],[4.774,-20.652],[8.471,-22.588],[6.949,-8.746],[1.066,-1.007]],"o":[[-4.663,-2.755],[-2.79,-4.945],[0.706,-2.402],[-0.141,-3.568],[-2.331,-2.967],[-1.554,-3.32],[2.826,-3.426],[2.967,-3.356],[2.437,-4.345],[1.695,-1.519],[2.261,-0.989],[3.674,-0.6],[14.116,3.825],[9.412,5.176],[-2.927,12.663],[-2.569,6.851],[-6.204,7.809],[0,0]],"v":[[-30.997,24.251],[-49.329,20.23],[-49.682,4.087],[-48.199,-3.225],[-52.72,-13.009],[-59.219,-22.122],[-57.029,-33.143],[-45.55,-41.196],[-38.909,-52.394],[-29.301,-64.191],[-23.579,-68.112],[-16.302,-69.984],[-5.141,-71.503],[41.003,-66.573],[58.886,-30.337],[23.592,18.604],[14.65,69.898],[-4.173,55.446]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":0,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.46274510026,0.768627464771,0.43137255311,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[261.951,199.174],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[175.951,69.153],"to":[-4.528,0],"ti":[11.028,0]},{"t":100,"s":[124.663,61.653]}],"ix":2},"a":{"a":0,"k":[173.951,69.153],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[-9]},{"t":100,"s":[2.287]}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":113,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"earth","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-0.5,-0.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.18,0.18,0.18],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":3,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.41,0.41,0.41],"y":[0,0,0]},"t":16.895,"s":[108,108,100]},{"t":27,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.448,7.065],[52.984,0],[13.352,-5.793],[11.656,-21.194],[0,-0.035],[0,-19.074],[-60.472,0],[-19.604,18.544],[0,31.366]],"o":[[-10.102,-50.017],[-15.471,0],[-22.324,9.678],[0,0.035],[-8.583,15.613],[0,60.472],[29.106,0],[21.123,-19.957],[0,-7.488]],"v":[[107.31,-21.829],[0,-109.5],[-43.553,-100.493],[-96.042,-52.666],[-96.042,-52.595],[-109.5,0],[0,109.5],[75.166,79.617],[109.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.380392163992,0.517647087574,0.68235296011,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3,"op":116,"st":3,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"circles","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2},"a":{"a":0,"k":[150,150,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":300,"h":300,"ip":0,"op":100,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/LottieTest/Tests/Gradient/AfterEffects.aep b/LottieTest/Tests/Gradient/AfterEffects.aep new file mode 100644 index 00000000..1d6aabec Binary files /dev/null and b/LottieTest/Tests/Gradient/AfterEffects.aep differ diff --git a/LottieTest/Tests/Gradient/CodeGen.cs b/LottieTest/Tests/Gradient/CodeGen.cs new file mode 100644 index 00000000..450ed4e7 --- /dev/null +++ b/LottieTest/Tests/Gradient/CodeGen.cs @@ -0,0 +1,1017 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// LottieGen.dll version: +// 7.1.2-build.15+g2b49bb9edc +// +// Command: +// LottieGen.dll -Language CSharp -MinimumUapVersion 13 -Public -WinUIVersion 2.7 -InputFile Lottie.json +// +// Input file: +// Lottie.json (13375 bytes created 14:41-07:00 Jun. 13 2022) +// +// LottieGen.dll source: +// http://aka.ms/Lottie +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ +// ____________________________________ +// | Object stats | Count | +// |__________________________|_______| +// | All CompositionObjects | 170 | +// |--------------------------+-------| +// | Expression animators | 28 | +// | KeyFrame animators | 16 | +// | Reference parameters | 34 | +// | Expression operations | 0 | +// |--------------------------+-------| +// | Animated brushes | 3 | +// | Animated gradient stops | - | +// | ExpressionAnimations | 13 | +// | PathKeyFrameAnimations | - | +// |--------------------------+-------| +// | ContainerVisuals | 3 | +// | ShapeVisuals | 3 | +// |--------------------------+-------| +// | ContainerShapes | - | +// | CompositionSpriteShapes | 11 | +// |--------------------------+-------| +// | Brushes | 12 | +// | Gradient stops | 3 | +// | CompositionVisualSurface | - | +// ------------------------------------ +using Microsoft.Graphics.Canvas.Geometry; +using System; +using System.Collections.Generic; +using System.Numerics; +using Windows.Graphics; +using Windows.UI; +using Windows.UI.Composition; + +namespace AnimatedVisuals +{ + // Name: Comp 1 + // Frame rate: 29.9700012207031 fps + // Frame count: 150.000006109625 + // Duration: 5005.0 mS + sealed class CodeGen + : Microsoft.UI.Xaml.Controls.IAnimatedVisualSource + , Microsoft.UI.Xaml.Controls.IAnimatedVisualSource2 + { + // Animation duration: 5.005 seconds. + internal const long c_durationTicks = 50050050; + + public Microsoft.UI.Xaml.Controls.IAnimatedVisual TryCreateAnimatedVisual(Compositor compositor) + { + object ignored = null; + return TryCreateAnimatedVisual(compositor, out ignored); + } + + public Microsoft.UI.Xaml.Controls.IAnimatedVisual TryCreateAnimatedVisual(Compositor compositor, out object diagnostics) + { + diagnostics = null; + + if (CodeGen_AnimatedVisual.IsRuntimeCompatible()) + { + var res = + new CodeGen_AnimatedVisual( + compositor + ); + res.CreateAnimations(); + return res; + } + + return null; + } + + /// + /// Gets the number of frames in the animation. + /// + public double FrameCount => 150.000006109625; + + /// + /// Gets the frame rate of the animation. + /// + public double Framerate => 29.9700012207031; + + /// + /// Gets the duration of the animation. + /// + public TimeSpan Duration => TimeSpan.FromTicks(c_durationTicks); + + /// + /// Converts a zero-based frame number to the corresponding progress value denoting the + /// start of the frame. + /// + public double FrameToProgress(double frameNumber) + { + return frameNumber / 150.000006109625; + } + + /// + /// Returns a map from marker names to corresponding progress values. + /// + public IReadOnlyDictionary Markers => + new Dictionary + { + }; + + /// + /// Sets the color property with the given name, or does nothing if no such property + /// exists. + /// + public void SetColorProperty(string propertyName, Color value) + { + } + + /// + /// Sets the scalar property with the given name, or does nothing if no such property + /// exists. + /// + public void SetScalarProperty(string propertyName, double value) + { + } + + sealed class CodeGen_AnimatedVisual : Microsoft.UI.Xaml.Controls.IAnimatedVisual2 + { + const long c_durationTicks = 50050050; + readonly Compositor _c; + readonly ExpressionAnimation _reusableExpressionAnimation; + CompositionColorGradientStop _gradientStop_0_Red; + CompositionColorGradientStop _gradientStop_1_AlmostDarkBlue_FF0030AC; + CompositionLinearGradientBrush _linearGradientBrush_2; + CompositionLinearGradientBrush _linearGradientBrush_4; + CompositionLinearGradientBrush _linearGradientBrush_5; + CompositionRectangleGeometry _rectangle_0; + CompositionRectangleGeometry _rectangle_1; + CompositionRectangleGeometry _rectangle_2; + CompositionRectangleGeometry _rectangle_150_0; + CompositionRectangleGeometry _rectangle_150_1; + CompositionRoundedRectangleGeometry _roundedRectangle_150_0; + CompositionRoundedRectangleGeometry _roundedRectangle_150_1; + CompositionRoundedRectangleGeometry _roundedRectangle_150_2; + CompositionSpriteShape _spriteShape_06; + CompositionSpriteShape _spriteShape_07; + ContainerVisual _root; + ExpressionAnimation _rootProgress; + InsetClip _insetClip_0; + LinearEasingFunction _linearEasingFunction_0; + ScalarKeyFrameAnimation _rotationAngleInDegreesScalarAnimation_9_to_9; + StepEasingFunction _holdThenStepEasingFunction; + Vector2KeyFrameAnimation _endPointSourceVector2Animation; + Vector2KeyFrameAnimation _positionVector2Animation_3; + Vector2KeyFrameAnimation _sizeVector2Animation_1; + Vector2KeyFrameAnimation _startPointSourceVector2Animation; + + static void StartProgressBoundAnimation( + CompositionObject target, + string animatedPropertyName, + CompositionAnimation animation, + ExpressionAnimation controllerProgressExpression) + { + target.StartAnimation(animatedPropertyName, animation); + var controller = target.TryGetAnimationController(animatedPropertyName); + controller.Pause(); + controller.StartAnimation("Progress", controllerProgressExpression); + } + + void BindProperty( + CompositionObject target, + string animatedPropertyName, + string expression, + string referenceParameterName, + CompositionObject referencedObject) + { + _reusableExpressionAnimation.ClearAllParameters(); + _reusableExpressionAnimation.Expression = expression; + _reusableExpressionAnimation.SetReferenceParameter(referenceParameterName, referencedObject); + target.StartAnimation(animatedPropertyName, _reusableExpressionAnimation); + } + + void BindProperty2( + CompositionObject target, + string animatedPropertyName, + string expression, + string referenceParameterName0, + CompositionObject referencedObject0, + string referenceParameterName1, + CompositionObject referencedObject1) + { + _reusableExpressionAnimation.ClearAllParameters(); + _reusableExpressionAnimation.Expression = expression; + _reusableExpressionAnimation.SetReferenceParameter(referenceParameterName0, referencedObject0); + _reusableExpressionAnimation.SetReferenceParameter(referenceParameterName1, referencedObject1); + target.StartAnimation(animatedPropertyName, _reusableExpressionAnimation); + } + + ScalarKeyFrameAnimation CreateScalarKeyFrameAnimation(float initialProgress, float initialValue, CompositionEasingFunction initialEasingFunction) + { + var result = _c.CreateScalarKeyFrameAnimation(); + result.Duration = TimeSpan.FromTicks(c_durationTicks); + result.InsertKeyFrame(initialProgress, initialValue, initialEasingFunction); + return result; + } + + Vector2KeyFrameAnimation CreateVector2KeyFrameAnimation(float initialProgress, Vector2 initialValue, CompositionEasingFunction initialEasingFunction) + { + var result = _c.CreateVector2KeyFrameAnimation(); + result.Duration = TimeSpan.FromTicks(c_durationTicks); + result.InsertKeyFrame(initialProgress, initialValue, initialEasingFunction); + return result; + } + + CompositionSpriteShape CreateSpriteShape(CompositionGeometry geometry, Matrix3x2 transformMatrix, CompositionBrush fillBrush) + { + var result = _c.CreateSpriteShape(geometry); + result.TransformMatrix = transformMatrix; + result.FillBrush = fillBrush; + return result; + } + + // - - - Layer aggregator + // - - RotationDegrees:9, Offset:<590, 572> + CanvasGeometry Geometry() + { + CanvasGeometry result; + using (var builder = new CanvasPathBuilder(null)) + { + builder.SetFilledRegionDetermination(CanvasFilledRegionDetermination.Winding); + builder.BeginFigure(new Vector2(-324.709991F, 225.572998F)); + builder.AddLine(new Vector2(-439.576996F, 280.214996F)); + builder.AddLine(new Vector2(-402.381989F, 438.342987F)); + builder.AddLine(new Vector2(-264.516998F, 426.631989F)); + builder.AddLine(new Vector2(-271.730988F, 342.727997F)); + builder.AddLine(new Vector2(-197.311005F, 288.416992F)); + builder.AddLine(new Vector2(-324.709991F, 225.572998F)); + builder.EndFigure(CanvasFigureLoop.Closed); + result = CanvasGeometry.CreatePath(builder); + } + return result; + } + + // Transforms for White Solid 1 Scale(1,1,0) + CompositionColorBrush ColorBrush_White() + { + return _c.CreateColorBrush(Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF)); + } + + // Stop 0 + CompositionColorGradientStop GradientStop_0_Red() + { + return (_gradientStop_0_Red == null) + ? _gradientStop_0_Red = _c.CreateColorGradientStop(0F, Color.FromArgb(0xFF, 0xFF, 0x00, 0x00)) + : _gradientStop_0_Red; + } + + // Stop 1 + CompositionColorGradientStop GradientStop_0p485_AlmostYellow_FFE3FF2C() + { + return _c.CreateColorGradientStop(0.485000014F, Color.FromArgb(0xFF, 0xE3, 0xFF, 0x2C)); + } + + // Stop 1 + CompositionColorGradientStop GradientStop_1_AlmostDarkBlue_FF0030AC() + { + return (_gradientStop_1_AlmostDarkBlue_FF0030AC == null) + ? _gradientStop_1_AlmostDarkBlue_FF0030AC = _c.CreateColorGradientStop(1F, Color.FromArgb(0xFF, 0x00, 0x30, 0xAC)) + : _gradientStop_1_AlmostDarkBlue_FF0030AC; + } + + // - - PreComp layer: Static Rects + // - Layer aggregator + // RotationDegrees:9, Offset:<134, 128> + CompositionLinearGradientBrush LinearGradientBrush_0() + { + var result = _c.CreateLinearGradientBrush(); + var colorStops = result.ColorStops; + colorStops.Add(GradientStop_0_Red()); + colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC()); + result.MappingMode = CompositionMappingMode.Absolute; + result.StartPoint = new Vector2(53F, 67F); + result.EndPoint = new Vector2(95F, 106F); + return result; + } + + // - - PreComp layer: Static Rects + // - Layer aggregator + // RotationDegrees:9, Offset:<482, 129> + CompositionLinearGradientBrush LinearGradientBrush_1() + { + var result = _c.CreateLinearGradientBrush(); + var colorStops = result.ColorStops; + colorStops.Add(GradientStop_0_Red()); + colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC()); + result.MappingMode = CompositionMappingMode.Absolute; + result.StartPoint = new Vector2(-22F, 12F); + result.EndPoint = new Vector2(20F, 51F); + return result; + } + + CompositionLinearGradientBrush LinearGradientBrush_2() + { + if (_linearGradientBrush_2 != null) { return _linearGradientBrush_2; } + var result = _linearGradientBrush_2 = _c.CreateLinearGradientBrush(); + var propertySet = result.Properties; + propertySet.InsertVector2("EndPointSource", new Vector2(20F, 51F)); + propertySet.InsertVector2("StartPointSource", new Vector2(-22F, 12F)); + var colorStops = result.ColorStops; + colorStops.Add(GradientStop_0_Red()); + colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC()); + result.MappingMode = CompositionMappingMode.Absolute; + BindProperty2(_linearGradientBrush_2, "StartPoint", "my.StartPointSource+(Vector2(0,0)-geometry.Offset)", "geometry", Rectangle_150_1(), "my", _linearGradientBrush_2); + BindProperty2(_linearGradientBrush_2, "EndPoint", "my.EndPointSource+(Vector2(0,0)-geometry.Offset)", "geometry", Rectangle_150_1(), "my", _linearGradientBrush_2); + return result; + } + + // - - PreComp layer: Animated Rects + // - Layer aggregator + // Rectangle Path 1 + CompositionLinearGradientBrush LinearGradientBrush_3() + { + var result = _c.CreateLinearGradientBrush(); + var colorStops = result.ColorStops; + colorStops.Add(GradientStop_0_Red()); + colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC()); + result.MappingMode = CompositionMappingMode.Absolute; + result.StartPoint = new Vector2(-22F, 12F); + result.EndPoint = new Vector2(20F, 51F); + return result; + } + + CompositionLinearGradientBrush LinearGradientBrush_4() + { + if (_linearGradientBrush_4 != null) { return _linearGradientBrush_4; } + var result = _linearGradientBrush_4 = _c.CreateLinearGradientBrush(); + var propertySet = result.Properties; + propertySet.InsertVector2("EndPointSource", new Vector2(20F, 20F)); + propertySet.InsertVector2("StartPointSource", new Vector2(-22F, -20F)); + var colorStops = result.ColorStops; + colorStops.Add(GradientStop_0_Red()); + colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC()); + result.MappingMode = CompositionMappingMode.Absolute; + BindProperty2(_linearGradientBrush_4, "StartPoint", "my.StartPointSource+(Vector2(0,0)-geometry.Offset)", "geometry", Rectangle_1(), "my", _linearGradientBrush_4); + BindProperty2(_linearGradientBrush_4, "EndPoint", "my.EndPointSource+(Vector2(0,0)-geometry.Offset)", "geometry", Rectangle_1(), "my", _linearGradientBrush_4); + return result; + } + + CompositionLinearGradientBrush LinearGradientBrush_5() + { + if (_linearGradientBrush_5 != null) { return _linearGradientBrush_5; } + var result = _linearGradientBrush_5 = _c.CreateLinearGradientBrush(); + var propertySet = result.Properties; + propertySet.InsertVector2("EndPointSource", new Vector2(20F, 20F)); + propertySet.InsertVector2("StartPointSource", new Vector2(-22F, -20F)); + var colorStops = result.ColorStops; + colorStops.Add(GradientStop_0_Red()); + colorStops.Add(GradientStop_0p485_AlmostYellow_FFE3FF2C()); + colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC()); + result.MappingMode = CompositionMappingMode.Absolute; + BindProperty2(_linearGradientBrush_5, "StartPoint", "my.StartPointSource+(Vector2(0,0)-geometry.Offset)", "geometry", Rectangle_2(), "my", _linearGradientBrush_5); + BindProperty2(_linearGradientBrush_5, "EndPoint", "my.EndPointSource+(Vector2(0,0)-geometry.Offset)", "geometry", Rectangle_2(), "my", _linearGradientBrush_5); + return result; + } + + // - Layer aggregator + // RotationDegrees:9, Offset:<590, 572> + CompositionLinearGradientBrush LinearGradientBrush_6() + { + var result = _c.CreateLinearGradientBrush(); + var colorStops = result.ColorStops; + colorStops.Add(GradientStop_0_Red()); + colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC()); + result.MappingMode = CompositionMappingMode.Absolute; + result.StartPoint = new Vector2(54F, 276F); + result.EndPoint = new Vector2(55F, 348F); + return result; + } + + // - Layer aggregator + // RotationDegrees:9, Offset:<590, 572> + CompositionPathGeometry PathGeometry() + { + return _c.CreatePathGeometry(new CompositionPath(Geometry())); + } + + // - - PreComp layer: Static Rects + // - Layer aggregator + // RotationDegrees:9, Offset:<312, 128> + CompositionRadialGradientBrush RadialGradientBrush_0() + { + var result = _c.CreateRadialGradientBrush(); + var colorStops = result.ColorStops; + colorStops.Add(GradientStop_0_Red()); + colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC()); + result.MappingMode = CompositionMappingMode.Absolute; + result.EllipseCenter = new Vector2(25F, 0F); + result.EllipseRadius = new Vector2(50F, 50F); + return result; + } + + // - - PreComp layer: Static Rects + // - Layer aggregator + // RotationDegrees:9, Offset:<660, 129> + CompositionRadialGradientBrush RadialGradientBrush_1() + { + var result = _c.CreateRadialGradientBrush(); + var colorStops = result.ColorStops; + colorStops.Add(GradientStop_0_Red()); + colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC()); + result.MappingMode = CompositionMappingMode.Absolute; + result.EllipseCenter = new Vector2(25F, 0F); + result.EllipseRadius = new Vector2(50F, 50F); + return result; + } + + // - - PreComp layer: Animated Rects + // - Layer aggregator + // RotationDegrees:9, Offset:<308, 342> + CompositionRadialGradientBrush RadialGradientBrush_2() + { + var result = _c.CreateRadialGradientBrush(); + var colorStops = result.ColorStops; + colorStops.Add(GradientStop_0_Red()); + colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC()); + result.MappingMode = CompositionMappingMode.Absolute; + result.EllipseCenter = new Vector2(25F, 0F); + result.EllipseRadius = new Vector2(50F, 50F); + return result; + } + + // - - PreComp layer: Animated Rects + // - Layer aggregator + // Rectangle Path 1 + CompositionRadialGradientBrush RadialGradientBrush_3() + { + var result = _c.CreateRadialGradientBrush(); + var colorStops = result.ColorStops; + colorStops.Add(GradientStop_0_Red()); + colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC()); + result.MappingMode = CompositionMappingMode.Absolute; + result.EllipseCenter = new Vector2(25F, 0F); + result.EllipseRadius = new Vector2(50F, 50F); + return result; + } + + // Rectangle Path 1.RectangleGeometry + CompositionRectangleGeometry Rectangle_0() + { + if (_rectangle_0 != null) { return _rectangle_0; } + var result = _rectangle_0 = _c.CreateRectangleGeometry(); + result.Offset = new Vector2(-75F, -55F); + BindProperty(_rectangle_0, "Offset", "Vector2(0,20)-(my.Size/Vector2(2,2))", "my", _rectangle_0); + return result; + } + + // Rectangle Path 1.RectangleGeometry + CompositionRectangleGeometry Rectangle_1() + { + if (_rectangle_1 != null) { return _rectangle_1; } + var result = _rectangle_1 = _c.CreateRectangleGeometry(); + var propertySet = result.Properties; + propertySet.InsertVector2("Position", new Vector2(0F, 0F)); + result.Offset = new Vector2(-75F, -75F); + BindProperty(_rectangle_1, "Offset", "my.Position-(my.Size/Vector2(2,2))", "my", _rectangle_1); + return result; + } + + // Rectangle Path 1.RectangleGeometry + CompositionRectangleGeometry Rectangle_2() + { + if (_rectangle_2 != null) { return _rectangle_2; } + var result = _rectangle_2 = _c.CreateRectangleGeometry(); + var propertySet = result.Properties; + propertySet.InsertVector2("Position", new Vector2(0F, 0F)); + result.Offset = new Vector2(-75F, -75F); + BindProperty(_rectangle_2, "Offset", "my.Position-(my.Size/Vector2(2,2))", "my", _rectangle_2); + return result; + } + + // Rectangle Path 1.RectangleGeometry + CompositionRectangleGeometry Rectangle_150_0() + { + if (_rectangle_150_0 != null) { return _rectangle_150_0; } + var result = _rectangle_150_0 = _c.CreateRectangleGeometry(); + result.Offset = new Vector2(-75F, -55F); + result.Size = new Vector2(150F, 150F); + return result; + } + + // Rectangle Path 1.RectangleGeometry + CompositionRectangleGeometry Rectangle_150_1() + { + if (_rectangle_150_1 != null) { return _rectangle_150_1; } + var result = _rectangle_150_1 = _c.CreateRectangleGeometry(); + var propertySet = result.Properties; + propertySet.InsertVector2("Position", new Vector2(0F, 20F)); + result.Offset = new Vector2(-75F, -55F); + result.Size = new Vector2(150F, 150F); + BindProperty(_rectangle_150_1, "Offset", "my.Position-Vector2(75,75)", "my", _rectangle_150_1); + return result; + } + + // Rectangle Path 1.RectangleGeometry + CompositionRoundedRectangleGeometry RoundedRectangle_150_0() + { + if (_roundedRectangle_150_0 != null) { return _roundedRectangle_150_0; } + var result = _roundedRectangle_150_0 = _c.CreateRoundedRectangleGeometry(); + result.CornerRadius = new Vector2(25F, 25F); + result.Offset = new Vector2(-75F, -55F); + result.Size = new Vector2(150F, 150F); + return result; + } + + // Rectangle Path 1.RectangleGeometry + CompositionRoundedRectangleGeometry RoundedRectangle_150_1() + { + if (_roundedRectangle_150_1 != null) { return _roundedRectangle_150_1; } + var result = _roundedRectangle_150_1 = _c.CreateRoundedRectangleGeometry(); + var propertySet = result.Properties; + propertySet.InsertVector2("Position", new Vector2(0F, 20F)); + result.CornerRadius = new Vector2(25F, 25F); + result.Offset = new Vector2(-75F, -55F); + result.Size = new Vector2(150F, 150F); + BindProperty(_roundedRectangle_150_1, "Offset", "my.Position-Vector2(75,75)", "my", _roundedRectangle_150_1); + return result; + } + + // Rectangle Path 1.RectangleGeometry + CompositionRoundedRectangleGeometry RoundedRectangle_150_2() + { + if (_roundedRectangle_150_2 != null) { return _roundedRectangle_150_2; } + var result = _roundedRectangle_150_2 = _c.CreateRoundedRectangleGeometry(); + var propertySet = result.Properties; + propertySet.InsertVector2("Position", new Vector2(0F, 20F)); + result.CornerRadius = new Vector2(25F, 25F); + result.Offset = new Vector2(-75F, -55F); + result.Size = new Vector2(150F, 150F); + BindProperty(_roundedRectangle_150_2, "Offset", "my.Position-Vector2(75,75)", "my", _roundedRectangle_150_2); + return result; + } + + // - PreComp layer: Static Rects + // Layer aggregator + // Rectangle Path 1 + CompositionSpriteShape SpriteShape_00() + { + // Offset:<134, 128>, Rotation:8.999991941061564 degrees + var geometry = Rectangle_150_0(); + var result = CreateSpriteShape(geometry, new Matrix3x2(0.987688363F, 0.156434476F, -0.156434476F, 0.987688363F, 134F, 128F), LinearGradientBrush_0());; + return result; + } + + // - PreComp layer: Static Rects + // Layer aggregator + // Rectangle Path 1 + CompositionSpriteShape SpriteShape_01() + { + // Offset:<312, 128>, Rotation:8.999991941061564 degrees + var geometry = Rectangle_150_0(); + var result = CreateSpriteShape(geometry, new Matrix3x2(0.987688363F, 0.156434476F, -0.156434476F, 0.987688363F, 312F, 128F), RadialGradientBrush_0());; + return result; + } + + // - PreComp layer: Static Rects + // Layer aggregator + // Rectangle Path 1 + CompositionSpriteShape SpriteShape_02() + { + // Offset:<482, 129>, Rotation:8.999991941061564 degrees + var geometry = RoundedRectangle_150_0(); + var result = CreateSpriteShape(geometry, new Matrix3x2(0.987688363F, 0.156434476F, -0.156434476F, 0.987688363F, 482F, 129F), LinearGradientBrush_1());; + return result; + } + + // - PreComp layer: Static Rects + // Layer aggregator + // Rectangle Path 1 + CompositionSpriteShape SpriteShape_03() + { + // Offset:<660, 129>, Rotation:8.999991941061564 degrees + var geometry = RoundedRectangle_150_0(); + var result = CreateSpriteShape(geometry, new Matrix3x2(0.987688363F, 0.156434476F, -0.156434476F, 0.987688363F, 660F, 129F), RadialGradientBrush_1());; + return result; + } + + // - PreComp layer: Animated Rects + // Layer aggregator + // Rectangle Path 1 + CompositionSpriteShape SpriteShape_04() + { + // Offset:<130, 342>, Rotation:8.999991941061564 degrees + var geometry = Rectangle_150_1(); + var result = CreateSpriteShape(geometry, new Matrix3x2(0.987688363F, 0.156434476F, -0.156434476F, 0.987688363F, 130F, 342F), LinearGradientBrush_2());; + return result; + } + + // - PreComp layer: Animated Rects + // Layer aggregator + // Rectangle Path 1 + CompositionSpriteShape SpriteShape_05() + { + // Offset:<308, 342>, Rotation:8.999991941061564 degrees + var geometry = Rectangle_0(); + var result = CreateSpriteShape(geometry, new Matrix3x2(0.987688363F, 0.156434476F, -0.156434476F, 0.987688363F, 308F, 342F), RadialGradientBrush_2());; + return result; + } + + // - PreComp layer: Animated Rects + // Layer aggregator + // Rectangle Path 1 + CompositionSpriteShape SpriteShape_06() + { + if (_spriteShape_06 != null) { return _spriteShape_06; } + var result = _spriteShape_06 = _c.CreateSpriteShape(RoundedRectangle_150_1()); + result.FillBrush = LinearGradientBrush_3(); + return result; + } + + // - PreComp layer: Animated Rects + // Layer aggregator + // Rectangle Path 1 + CompositionSpriteShape SpriteShape_07() + { + if (_spriteShape_07 != null) { return _spriteShape_07; } + var result = _spriteShape_07 = _c.CreateSpriteShape(RoundedRectangle_150_2()); + result.FillBrush = RadialGradientBrush_3(); + return result; + } + + // Layer aggregator + // Rectangle Path 1 + CompositionSpriteShape SpriteShape_08() + { + // Offset:<192, 596>, Rotation:8.999991941061564 degrees + var geometry = Rectangle_1(); + var result = CreateSpriteShape(geometry, new Matrix3x2(0.987688363F, 0.156434476F, -0.156434476F, 0.987688363F, 192F, 596F), LinearGradientBrush_4());; + return result; + } + + // Layer aggregator + // Rectangle Path 1 + CompositionSpriteShape SpriteShape_09() + { + // Offset:<628, 736>, Rotation:8.999988861798546 degrees, Scale:<1.62735, 1.6635401>, + // Skew:<1.12535155E-08, 0> + var geometry = Rectangle_2(); + var result = CreateSpriteShape(geometry, new Matrix3x2(1.60731459F, 0.254573643F, -0.260235012F, 1.64305913F, 628F, 736F), LinearGradientBrush_5());; + return result; + } + + // Layer aggregator + // Path 1 + CompositionSpriteShape SpriteShape_10() + { + // Offset:<590, 572>, Rotation:8.999991941061564 degrees + var geometry = PathGeometry(); + var result = CreateSpriteShape(geometry, new Matrix3x2(0.987688363F, 0.156434476F, -0.156434476F, 0.987688363F, 590F, 572F), LinearGradientBrush_6());; + return result; + } + + // Transforms for Static Rects Scale(1,1,0) + ContainerVisual ContainerVisual_0() + { + var result = _c.CreateContainerVisual(); + result.Clip = InsetClip_0(); + result.Size = new Vector2(1000F, 1000F); + // Scale:<1, 1> + result.TransformMatrix = new Matrix4x4(1F, 0F, 0F, 0F, 0F, 1F, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 1F); + // Layer aggregator + result.Children.InsertAtTop(ShapeVisual_0()); + return result; + } + + // Transforms for Animated Rects Scale(1,1,0) + ContainerVisual ContainerVisual_1() + { + var result = _c.CreateContainerVisual(); + result.Clip = InsetClip_0(); + result.Size = new Vector2(1000F, 1000F); + // Scale:<1, 1> + result.TransformMatrix = new Matrix4x4(1F, 0F, 0F, 0F, 0F, 1F, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 1F); + // Layer aggregator + result.Children.InsertAtTop(ShapeVisual_1()); + return result; + } + + // The root of the composition. + ContainerVisual Root() + { + if (_root != null) { return _root; } + var result = _root = _c.CreateContainerVisual(); + var propertySet = result.Properties; + propertySet.InsertScalar("Progress", 0F); + var children = result.Children; + // Transforms for White Solid 1 Scale(1,1,0) + children.InsertAtTop(SpriteVisual_0()); + // PreComp layer: Static Rects + children.InsertAtTop(ContainerVisual_0()); + // PreComp layer: Animated Rects + children.InsertAtTop(ContainerVisual_1()); + // Layer aggregator + children.InsertAtTop(ShapeVisual_2()); + return result; + } + + ExpressionAnimation RootProgress() + { + if (_rootProgress != null) { return _rootProgress; } + var result = _rootProgress = _c.CreateExpressionAnimation("_.Progress"); + result.SetReferenceParameter("_", _root); + return result; + } + + InsetClip InsetClip_0() + { + if (_insetClip_0 != null) { return _insetClip_0; } + var result = _insetClip_0 = _c.CreateInsetClip(); + return result; + } + + LinearEasingFunction LinearEasingFunction_0() + { + return (_linearEasingFunction_0 == null) + ? _linearEasingFunction_0 = _c.CreateLinearEasingFunction() + : _linearEasingFunction_0; + } + + // Rotation + ScalarKeyFrameAnimation RotationAngleInDegreesScalarAnimation_9_to_9() + { + // Frame 0. + if (_rotationAngleInDegreesScalarAnimation_9_to_9 != null) { return _rotationAngleInDegreesScalarAnimation_9_to_9; } + var result = _rotationAngleInDegreesScalarAnimation_9_to_9 = CreateScalarKeyFrameAnimation(0F, 9F, HoldThenStepEasingFunction()); + // Frame 72. + result.InsertKeyFrame(0.479999989F, 20F, LinearEasingFunction_0()); + // Frame 150. + result.InsertKeyFrame(1F, 9F, LinearEasingFunction_0()); + return result; + } + + // PreComp layer: Static Rects + // Layer aggregator + ShapeVisual ShapeVisual_0() + { + var result = _c.CreateShapeVisual(); + result.Size = new Vector2(1000F, 1000F); + var shapes = result.Shapes; + // RotationDegrees:9, Offset:<134, 128> + shapes.Add(SpriteShape_00()); + // RotationDegrees:9, Offset:<312, 128> + shapes.Add(SpriteShape_01()); + // RotationDegrees:9, Offset:<482, 129> + shapes.Add(SpriteShape_02()); + // RotationDegrees:9, Offset:<660, 129> + shapes.Add(SpriteShape_03()); + return result; + } + + // PreComp layer: Animated Rects + // Layer aggregator + ShapeVisual ShapeVisual_1() + { + var result = _c.CreateShapeVisual(); + result.Size = new Vector2(1000F, 1000F); + var shapes = result.Shapes; + // RotationDegrees:9, Offset:<130, 342> + shapes.Add(SpriteShape_04()); + // RotationDegrees:9, Offset:<308, 342> + shapes.Add(SpriteShape_05()); + // Rectangle Path 1 + shapes.Add(SpriteShape_06()); + // Rectangle Path 1 + shapes.Add(SpriteShape_07()); + return result; + } + + // Layer aggregator + ShapeVisual ShapeVisual_2() + { + var result = _c.CreateShapeVisual(); + result.Size = new Vector2(1000F, 1000F); + var shapes = result.Shapes; + // RotationDegrees:9, Offset:<192, 596> + shapes.Add(SpriteShape_08()); + // Scale:1.62735,1.66354, RotationDegrees:9, Offset:<628, 736> + shapes.Add(SpriteShape_09()); + // RotationDegrees:9, Offset:<590, 572> + shapes.Add(SpriteShape_10()); + return result; + } + + // SolidLayerRectangle + SpriteVisual SpriteVisual_0() + { + var result = _c.CreateSpriteVisual(); + result.Size = new Vector2(1000F, 1000F); + // Scale:<1, 1> + result.TransformMatrix = new Matrix4x4(1F, 0F, 0F, 0F, 0F, 1F, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 1F); + result.Brush = ColorBrush_White(); + return result; + } + + StepEasingFunction HoldThenStepEasingFunction() + { + if (_holdThenStepEasingFunction != null) { return _holdThenStepEasingFunction; } + var result = _holdThenStepEasingFunction = _c.CreateStepEasingFunction(); + result.IsFinalStepSingleFrame = true; + return result; + } + + // EndPointSource + Vector2KeyFrameAnimation EndPointSourceVector2Animation() + { + // Frame 0. + if (_endPointSourceVector2Animation != null) { return _endPointSourceVector2Animation; } + var result = _endPointSourceVector2Animation = CreateVector2KeyFrameAnimation(0F, new Vector2(20F, 20F), HoldThenStepEasingFunction()); + // Frame 71. + result.InsertKeyFrame(0.473333299F, new Vector2(20F, 106F), LinearEasingFunction_0()); + // Frame 149. + result.InsertKeyFrame(0.99333334F, new Vector2(20F, 20F), LinearEasingFunction_0()); + return result; + } + + // - - PreComp layer: Animated Rects + // - Layer aggregator + // Rectangle Path 1 + // Offset + Vector2KeyFrameAnimation OffsetVector2Animation_0() + { + // Frame 0. + var result = CreateVector2KeyFrameAnimation(0F, new Vector2(478F, 343F), HoldThenStepEasingFunction()); + // Frame 72. + result.InsertKeyFrame(0.479999989F, new Vector2(492F, 375F), LinearEasingFunction_0()); + // Frame 150. + result.InsertKeyFrame(1F, new Vector2(478F, 343F), LinearEasingFunction_0()); + return result; + } + + // - - PreComp layer: Animated Rects + // - Layer aggregator + // Rectangle Path 1 + // Offset + Vector2KeyFrameAnimation OffsetVector2Animation_1() + { + // Frame 0. + var result = CreateVector2KeyFrameAnimation(0F, new Vector2(656F, 343F), HoldThenStepEasingFunction()); + // Frame 72. + result.InsertKeyFrame(0.479999989F, new Vector2(675F, 343F), LinearEasingFunction_0()); + // Frame 150. + result.InsertKeyFrame(1F, new Vector2(656F, 343F), LinearEasingFunction_0()); + return result; + } + + // Rectangle Path 1.RectangleGeometry + // Position + Vector2KeyFrameAnimation PositionVector2Animation_0() + { + // Frame 0. + var result = CreateVector2KeyFrameAnimation(0F, new Vector2(0F, 20F), HoldThenStepEasingFunction()); + // Frame 72. + result.InsertKeyFrame(0.479999989F, new Vector2(50F, 20F), LinearEasingFunction_0()); + // Frame 150. + result.InsertKeyFrame(1F, new Vector2(0F, 20F), LinearEasingFunction_0()); + return result; + } + + // Rectangle Path 1.RectangleGeometry + // Position + Vector2KeyFrameAnimation PositionVector2Animation_1() + { + // Frame 0. + var result = CreateVector2KeyFrameAnimation(0F, new Vector2(0F, 20F), HoldThenStepEasingFunction()); + // Frame 72. + result.InsertKeyFrame(0.479999989F, new Vector2(-36F, 0F), LinearEasingFunction_0()); + // Frame 150. + result.InsertKeyFrame(1F, new Vector2(0F, 20F), LinearEasingFunction_0()); + return result; + } + + // Rectangle Path 1.RectangleGeometry + // Position + Vector2KeyFrameAnimation PositionVector2Animation_2() + { + // Frame 0. + var result = CreateVector2KeyFrameAnimation(0F, new Vector2(0F, 20F), HoldThenStepEasingFunction()); + // Frame 72. + result.InsertKeyFrame(0.479999989F, new Vector2(0F, -10F), LinearEasingFunction_0()); + // Frame 150. + result.InsertKeyFrame(1F, new Vector2(0F, 20F), LinearEasingFunction_0()); + return result; + } + + // Position + Vector2KeyFrameAnimation PositionVector2Animation_3() + { + // Frame 0. + if (_positionVector2Animation_3 != null) { return _positionVector2Animation_3; } + var result = _positionVector2Animation_3 = CreateVector2KeyFrameAnimation(0F, new Vector2(0F, 0F), HoldThenStepEasingFunction()); + // Frame 71. + result.InsertKeyFrame(0.473333299F, new Vector2(97F, 0F), LinearEasingFunction_0()); + // Frame 149. + result.InsertKeyFrame(0.99333334F, new Vector2(0F, 0F), LinearEasingFunction_0()); + return result; + } + + // Rectangle Path 1.RectangleGeometry + // Size + Vector2KeyFrameAnimation SizeVector2Animation_0() + { + // Frame 0. + var result = CreateVector2KeyFrameAnimation(0F, new Vector2(150F, 150F), HoldThenStepEasingFunction()); + // Frame 72. + result.InsertKeyFrame(0.479999989F, new Vector2(88F, 88F), LinearEasingFunction_0()); + // Frame 150. + result.InsertKeyFrame(1F, new Vector2(150F, 150F), LinearEasingFunction_0()); + return result; + } + + // Size + Vector2KeyFrameAnimation SizeVector2Animation_1() + { + // Frame 0. + if (_sizeVector2Animation_1 != null) { return _sizeVector2Animation_1; } + var result = _sizeVector2Animation_1 = CreateVector2KeyFrameAnimation(0F, new Vector2(150F, 150F), HoldThenStepEasingFunction()); + // Frame 71. + result.InsertKeyFrame(0.473333299F, new Vector2(228F, 228F), LinearEasingFunction_0()); + // Frame 149. + result.InsertKeyFrame(0.99333334F, new Vector2(150F, 150F), LinearEasingFunction_0()); + return result; + } + + // StartPointSource + Vector2KeyFrameAnimation StartPointSourceVector2Animation() + { + // Frame 0. + if (_startPointSourceVector2Animation != null) { return _startPointSourceVector2Animation; } + var result = _startPointSourceVector2Animation = CreateVector2KeyFrameAnimation(0F, new Vector2(-22F, -20F), HoldThenStepEasingFunction()); + // Frame 71. + result.InsertKeyFrame(0.473333299F, new Vector2(31F, -20F), LinearEasingFunction_0()); + // Frame 149. + result.InsertKeyFrame(0.99333334F, new Vector2(-22F, -20F), LinearEasingFunction_0()); + return result; + } + + internal CodeGen_AnimatedVisual( + Compositor compositor + ) + { + _c = compositor; + _reusableExpressionAnimation = compositor.CreateExpressionAnimation(); + Root(); + } + + public Visual RootVisual => _root; + public TimeSpan Duration => TimeSpan.FromTicks(c_durationTicks); + public Vector2 Size => new Vector2(1000F, 1000F); + void IDisposable.Dispose() => _root?.Dispose(); + + public void CreateAnimations() + { + StartProgressBoundAnimation(_linearGradientBrush_4, "StartPointSource", StartPointSourceVector2Animation(), RootProgress()); + StartProgressBoundAnimation(_linearGradientBrush_4, "EndPointSource", EndPointSourceVector2Animation(), RootProgress()); + StartProgressBoundAnimation(_linearGradientBrush_5, "StartPointSource", StartPointSourceVector2Animation(), RootProgress()); + StartProgressBoundAnimation(_linearGradientBrush_5, "EndPointSource", EndPointSourceVector2Animation(), RootProgress()); + StartProgressBoundAnimation(_rectangle_0, "Size", SizeVector2Animation_0(), RootProgress()); + StartProgressBoundAnimation(_rectangle_1, "Position", PositionVector2Animation_3(), RootProgress()); + StartProgressBoundAnimation(_rectangle_1, "Size", SizeVector2Animation_1(), RootProgress()); + StartProgressBoundAnimation(_rectangle_2, "Position", PositionVector2Animation_3(), RootProgress()); + StartProgressBoundAnimation(_rectangle_2, "Size", SizeVector2Animation_1(), RootProgress()); + StartProgressBoundAnimation(_rectangle_150_1, "Position", PositionVector2Animation_0(), RootProgress()); + StartProgressBoundAnimation(_roundedRectangle_150_1, "Position", PositionVector2Animation_1(), RootProgress()); + StartProgressBoundAnimation(_roundedRectangle_150_2, "Position", PositionVector2Animation_2(), RootProgress()); + StartProgressBoundAnimation(_spriteShape_06, "RotationAngleInDegrees", RotationAngleInDegreesScalarAnimation_9_to_9(), RootProgress()); + StartProgressBoundAnimation(_spriteShape_06, "Offset", OffsetVector2Animation_0(), RootProgress()); + StartProgressBoundAnimation(_spriteShape_07, "RotationAngleInDegrees", RotationAngleInDegreesScalarAnimation_9_to_9(), RootProgress()); + StartProgressBoundAnimation(_spriteShape_07, "Offset", OffsetVector2Animation_1(), RootProgress()); + } + + public void DestroyAnimations() + { + _linearGradientBrush_4.StopAnimation("StartPointSource"); + _linearGradientBrush_4.StopAnimation("EndPointSource"); + _linearGradientBrush_5.StopAnimation("StartPointSource"); + _linearGradientBrush_5.StopAnimation("EndPointSource"); + _rectangle_0.StopAnimation("Size"); + _rectangle_1.StopAnimation("Position"); + _rectangle_1.StopAnimation("Size"); + _rectangle_2.StopAnimation("Position"); + _rectangle_2.StopAnimation("Size"); + _rectangle_150_1.StopAnimation("Position"); + _roundedRectangle_150_1.StopAnimation("Position"); + _roundedRectangle_150_2.StopAnimation("Position"); + _spriteShape_06.StopAnimation("RotationAngleInDegrees"); + _spriteShape_06.StopAnimation("Offset"); + _spriteShape_07.StopAnimation("RotationAngleInDegrees"); + _spriteShape_07.StopAnimation("Offset"); + } + + internal static bool IsRuntimeCompatible() + { + return Windows.Foundation.Metadata.ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 12); + } + } + } +} diff --git a/LottieTest/Tests/Gradient/Frames/frame001.png b/LottieTest/Tests/Gradient/Frames/frame001.png new file mode 100644 index 00000000..06334aa7 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame001.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame006.png b/LottieTest/Tests/Gradient/Frames/frame006.png new file mode 100644 index 00000000..94d3bde3 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame006.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame011.png b/LottieTest/Tests/Gradient/Frames/frame011.png new file mode 100644 index 00000000..8f9ae012 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame011.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame016.png b/LottieTest/Tests/Gradient/Frames/frame016.png new file mode 100644 index 00000000..f6ba1a2f Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame016.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame021.png b/LottieTest/Tests/Gradient/Frames/frame021.png new file mode 100644 index 00000000..0857d693 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame021.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame026.png b/LottieTest/Tests/Gradient/Frames/frame026.png new file mode 100644 index 00000000..0c57c0c9 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame026.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame031.png b/LottieTest/Tests/Gradient/Frames/frame031.png new file mode 100644 index 00000000..57cd8f0b Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame031.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame036.png b/LottieTest/Tests/Gradient/Frames/frame036.png new file mode 100644 index 00000000..8eb3267c Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame036.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame041.png b/LottieTest/Tests/Gradient/Frames/frame041.png new file mode 100644 index 00000000..d2cac482 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame041.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame046.png b/LottieTest/Tests/Gradient/Frames/frame046.png new file mode 100644 index 00000000..5f9ce459 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame046.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame051.png b/LottieTest/Tests/Gradient/Frames/frame051.png new file mode 100644 index 00000000..a06fb022 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame051.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame056.png b/LottieTest/Tests/Gradient/Frames/frame056.png new file mode 100644 index 00000000..d4853283 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame056.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame061.png b/LottieTest/Tests/Gradient/Frames/frame061.png new file mode 100644 index 00000000..da595966 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame061.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame066.png b/LottieTest/Tests/Gradient/Frames/frame066.png new file mode 100644 index 00000000..63df9cdb Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame066.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame071.png b/LottieTest/Tests/Gradient/Frames/frame071.png new file mode 100644 index 00000000..66f6e610 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame071.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame076.png b/LottieTest/Tests/Gradient/Frames/frame076.png new file mode 100644 index 00000000..d1aab230 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame076.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame081.png b/LottieTest/Tests/Gradient/Frames/frame081.png new file mode 100644 index 00000000..168688b4 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame081.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame086.png b/LottieTest/Tests/Gradient/Frames/frame086.png new file mode 100644 index 00000000..2096f87c Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame086.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame091.png b/LottieTest/Tests/Gradient/Frames/frame091.png new file mode 100644 index 00000000..45f6e214 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame091.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame096.png b/LottieTest/Tests/Gradient/Frames/frame096.png new file mode 100644 index 00000000..89ab24c1 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame096.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame101.png b/LottieTest/Tests/Gradient/Frames/frame101.png new file mode 100644 index 00000000..997e4422 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame101.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame106.png b/LottieTest/Tests/Gradient/Frames/frame106.png new file mode 100644 index 00000000..0d328944 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame106.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame111.png b/LottieTest/Tests/Gradient/Frames/frame111.png new file mode 100644 index 00000000..e256f9e0 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame111.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame116.png b/LottieTest/Tests/Gradient/Frames/frame116.png new file mode 100644 index 00000000..7269b052 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame116.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame121.png b/LottieTest/Tests/Gradient/Frames/frame121.png new file mode 100644 index 00000000..59f40402 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame121.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame126.png b/LottieTest/Tests/Gradient/Frames/frame126.png new file mode 100644 index 00000000..b0e3feaf Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame126.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame131.png b/LottieTest/Tests/Gradient/Frames/frame131.png new file mode 100644 index 00000000..f68ef6ab Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame131.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame136.png b/LottieTest/Tests/Gradient/Frames/frame136.png new file mode 100644 index 00000000..e0a0923a Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame136.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame141.png b/LottieTest/Tests/Gradient/Frames/frame141.png new file mode 100644 index 00000000..218b4807 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame141.png differ diff --git a/LottieTest/Tests/Gradient/Frames/frame146.png b/LottieTest/Tests/Gradient/Frames/frame146.png new file mode 100644 index 00000000..47651663 Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame146.png differ diff --git a/LottieTest/Tests/Gradient/Lottie.json b/LottieTest/Tests/Gradient/Lottie.json new file mode 100644 index 00000000..45b4adcf --- /dev/null +++ b/LottieTest/Tests/Gradient/Lottie.json @@ -0,0 +1 @@ +{"v":"5.9.0","fr":29.9700012207031,"ip":0,"op":150.000006109625,"w":1000,"h":1000,"nm":"Comp 1","ddd":0,"assets":[{"id":"comp_0","nm":"Animated Rects","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[9]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":72,"s":[20]},{"t":150.000006109625,"s":[9]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[656,343,0],"to":[3.167,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":72,"s":[675,343,0],"to":[0,0,0],"ti":[3.167,0,0]},{"t":150.000006109625,"s":[656,343,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[150,150],"ix":2},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,20],"to":[0,-5],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":72,"s":[0,-10],"to":[0,0],"ti":[0,-5]},{"t":150.000006109625,"s":[0,20]}],"ix":3},"r":{"a":0,"k":25,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0,0,0.5,0.5,0.095,0.337,1,0,0.19,0.675],"ix":9}},"s":{"a":0,"k":[25,0],"ix":5},"e":{"a":0,"k":[75,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[9]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":72,"s":[20]},{"t":150.000006109625,"s":[9]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[478,343,0],"to":[2.333,5.333,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":72,"s":[492,375,0],"to":[0,0,0],"ti":[2.333,5.333,0]},{"t":150.000006109625,"s":[478,343,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[150,150],"ix":2},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,20],"to":[-6,-3.333],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":72,"s":[-36,0],"to":[0,0],"ti":[-6,-3.333]},{"t":150.000006109625,"s":[0,20]}],"ix":3},"r":{"a":0,"k":25,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0,0,0.5,0.5,0.095,0.337,1,0,0.19,0.675],"ix":9}},"s":{"a":0,"k":[-22,12],"ix":5},"e":{"a":0,"k":[20,51],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":9,"ix":10},"p":{"a":0,"k":[308,342,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[150,150]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":72,"s":[88,88]},{"t":150.000006109625,"s":[150,150]}],"ix":2},"p":{"a":0,"k":[0,20],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0,0,0.5,0.5,0.095,0.337,1,0,0.19,0.675],"ix":9}},"s":{"a":0,"k":[25,0],"ix":5},"e":{"a":0,"k":[75,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":9,"ix":10},"p":{"a":0,"k":[130,342,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[150,150],"ix":2},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,20],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":72,"s":[50,20],"to":[0,0],"ti":[0,0]},{"t":150.000006109625,"s":[0,20]}],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0,0,0.5,0.5,0.095,0.337,1,0,0.19,0.675],"ix":9}},"s":{"a":0,"k":[-22,12],"ix":5},"e":{"a":0,"k":[20,51],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0}]},{"id":"comp_1","nm":"Static Rects","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":9,"ix":10},"p":{"a":0,"k":[660,129,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[150,150],"ix":2},"p":{"a":0,"k":[0,20],"ix":3},"r":{"a":0,"k":25,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0,0,0.5,0.5,0.095,0.337,1,0,0.19,0.675],"ix":9}},"s":{"a":0,"k":[25,0],"ix":5},"e":{"a":0,"k":[75,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":9,"ix":10},"p":{"a":0,"k":[482,129,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[150,150],"ix":2},"p":{"a":0,"k":[0,20],"ix":3},"r":{"a":0,"k":25,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0,0,0.5,0.5,0.095,0.337,1,0,0.19,0.675],"ix":9}},"s":{"a":0,"k":[-22,12],"ix":5},"e":{"a":0,"k":[20,51],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":9,"ix":10},"p":{"a":0,"k":[312,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[150,150],"ix":2},"p":{"a":0,"k":[0,20],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0,0,0.5,0.5,0.095,0.337,1,0,0.19,0.675],"ix":9}},"s":{"a":0,"k":[25,0],"ix":5},"e":{"a":0,"k":[75,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":9,"ix":10},"p":{"a":0,"k":[134,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[150,150],"ix":2},"p":{"a":0,"k":[0,20],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0,0,0.5,0.5,0.095,0.337,1,0,0.19,0.675],"ix":9}},"s":{"a":0,"k":[-22,12],"ix":5},"e":{"a":0,"k":[20,51],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":9,"ix":10},"p":{"a":0,"k":[590,572,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-324.71,225.573],[-439.577,280.215],[-402.382,438.343],[-264.517,426.632],[-271.731,342.728],[-197.311,288.417]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0,0,0.5,0.5,0.095,0.337,1,0,0.19,0.675],"ix":9}},"s":{"a":0,"k":[54,276],"ix":5},"e":{"a":0,"k":[55,348],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Animated Gradient Linear 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":9,"ix":10},"p":{"a":0,"k":[628,736,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[162.735,166.354,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[150,150]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":71,"s":[228,228]},{"t":149.000006068894,"s":[150,150]}],"ix":2},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":71,"s":[97,0],"to":[0,0],"ti":[0,0]},{"t":149.000006068894,"s":[0,0]}],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,1,0,0,0.243,0.946,0.5,0.086,0.485,0.893,1,0.173,0.743,0.446,0.595,0.424,1,0,0.19,0.675],"ix":9}},"s":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[-22,-20],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":71,"s":[31,-20],"to":[0,0],"ti":[0,0]},{"t":149.000006068894,"s":[-22,-20]}],"ix":5},"e":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[20,20],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":71,"s":[20,106],"to":[0,0],"ti":[0,0]},{"t":149.000006068894,"s":[20,20]}],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Animated Gradient Linear","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":9,"ix":10},"p":{"a":0,"k":[192,596,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[150,150]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":71,"s":[228,228]},{"t":149.000006068894,"s":[150,150]}],"ix":2},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":71,"s":[97,0],"to":[0,0],"ti":[0,0]},{"t":149.000006068894,"s":[0,0]}],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0,0,0.5,0.5,0.095,0.337,1,0,0.19,0.675],"ix":9}},"s":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[-22,-20],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":71,"s":[31,-20],"to":[0,0],"ti":[0,0]},{"t":149.000006068894,"s":[-22,-20]}],"ix":5},"e":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[20,20],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":71,"s":[20,106],"to":[0,0],"ti":[0,0]},{"t":149.000006068894,"s":[20,20]}],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Animated Rects","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2,"l":2},"a":{"a":0,"k":[500,500,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":1000,"h":1000,"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Static Rects","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2,"l":2},"a":{"a":0,"k":[500,500,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":1000,"h":1000,"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":1,"nm":"White Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2,"l":2},"a":{"a":0,"k":[500,500,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":1000,"sh":1000,"sc":"#ffffff","ip":0,"op":900.000036657751,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/LottieTest/Tests/Gradient/Test.json b/LottieTest/Tests/Gradient/Test.json new file mode 100644 index 00000000..649463b4 --- /dev/null +++ b/LottieTest/Tests/Gradient/Test.json @@ -0,0 +1,5 @@ +{ + "duration": 5, + "frames-per-second": 30, + "number-of-frames": 150 +} \ No newline at end of file diff --git a/LottieTest/Tests/Gradient/Test.json.bak b/LottieTest/Tests/Gradient/Test.json.bak new file mode 100644 index 00000000..1efd2d33 --- /dev/null +++ b/LottieTest/Tests/Gradient/Test.json.bak @@ -0,0 +1,5 @@ +{ + "duration": "5", + "frames-per-second": "30", + "number-of-frames": "150" +} \ No newline at end of file diff --git a/LottieTest/Tests/Logo/Animation.gif b/LottieTest/Tests/Logo/Animation.gif new file mode 100644 index 00000000..087b44b4 Binary files /dev/null and b/LottieTest/Tests/Logo/Animation.gif differ diff --git a/LottieTest/Tests/Logo/Lottie.json b/LottieTest/Tests/Logo/Lottie.json new file mode 100644 index 00000000..02bc22b5 --- /dev/null +++ b/LottieTest/Tests/Logo/Lottie.json @@ -0,0 +1 @@ +{"v":"5.7.1","fr":60,"ip":0,"op":400,"w":1000,"h":1000,"nm":"LOTTIELOGO","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"TRACE Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[498.371,502.94,0],"ix":2},"a":{"a":0,"k":[447.459,446.918,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[32.302,-124.571],[26.403,-28.608],[34.582,17.876],[-3.936,29.805],[-36.198,2.687],[-25.818,-17.903],[-93.599,-33.983],[-61.912,17.62]],"o":[[-3.526,128.642],[-9.771,37.683],[-26.402,28.607],[-26.707,-13.806],[4.752,-35.986],[31.333,-2.325],[81.829,56.741],[61.157,22.204],[0,0]],"v":[[-51.509,-296.918],[-101.757,85.035],[-150.107,189.997],[-255.552,216.221],[-293.523,140.559],[-220.361,71.466],[-133.588,103.176],[109.281,274.714],[297.459,276.803]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":60,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[447.459,446.918],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":50,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":151,"s":[100]},{"t":250,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":151,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":250,"s":[0]},{"t":350,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":400,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 1 Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2},"a":{"a":0,"k":[500.25,500.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[14.179,-4.036],[32.865,-0.053],[0,0],[32.135,11.667],[51.155,43.278],[10.247,8.421],[12.825,-13.896],[23.342,-6.496],[22.098,11.423],[-5.523,41.832],[-18.133,17.124],[-23.606,1.752],[-25.677,-16.84],[-3.793,138.39],[-14.741,-0.407],[0.404,-14.736],[30.443,-117.402],[1.701,-5.986],[-14.817,-12.535],[-56.866,-20.646],[-62.349,17.746],[-4.036,-14.18]],"o":[[-34.576,9.84],[0,0],[-35.84,0],[-65.84,-23.905],[-9.989,-8.451],[-7.786,16.193],[-16.713,18.109],[-26.397,7.345],[-36.245,-18.735],[3.099,-23.468],[18.133,-17.125],[36.989,-2.739],[28.956,-112.666],[0.404,-14.737],[14.737,0.404],[-3.938,143.63],[-1.503,5.794],[15.546,12.372],[49.762,42.098],[51.624,18.746],[14.176,-4.032],[4.035,14.178]],"v":[[303.137,305.417],[201.501,320.326],[200.978,320.326],[98.543,302.745],[-71.349,190.811],[-101.708,165.375],[-132.12,211.04],[-194.235,249.196],[-269.438,242.873],[-321.615,140.005],[-288.69,77.059],[-223.965,47.786],[-128.494,78.447],[-79.821,-294.709],[-52.406,-320.661],[-26.454,-293.247],[-77.547,94.675],[-82.328,112.374],[-36.868,150.054],[116.762,252.563],[288.524,254.069],[321.504,272.437]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[276.143,0],[0,-276.143],[-276.142,0],[0,276.143]],"o":[[-276.142,0],[0,276.143],[276.143,0],[0,-276.143]],"v":[[0,-500],[-500,0],[0,500],[500,0]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.102000000898,0.102000000898,0.102000000898,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[500.25,500.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[23.255,0],[1.344,-0.099],[3.114,-23.585],[-16.097,-8.321],[-17.764,19.248],[-6.564,15.918],[1.748,1.212]],"o":[[-1.349,0],[-23.725,1.761],[-2.549,19.304],[23.987,12.399],[11.252,-12.191],[-1.741,-1.241],[-18.453,-12.796]],"v":[[-7.764,-53.485],[-11.798,-53.337],[-60.473,-7.37],[-36.709,41.086],[36.863,20.47],[63.022,-22.633],[57.788,-26.311]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.102000000898,0.102000000898,0.102000000898,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[292.035,654.613],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"TRACE Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500.031,499.827,0],"ix":2},"a":{"a":0,"k":[323.299,321.305,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[32.302,-124.571],[26.403,-28.608],[34.582,17.876],[-3.936,29.805],[-36.198,2.687],[-25.818,-17.903],[-93.599,-33.983],[-61.912,17.62]],"o":[[-3.526,128.642],[-9.771,37.683],[-26.402,28.607],[-26.707,-13.806],[4.752,-35.986],[31.333,-2.325],[81.829,56.741],[61.157,22.204],[0,0]],"v":[[-51.509,-296.918],[-101.757,85.035],[-150.107,189.997],[-255.552,216.221],[-293.523,140.559],[-220.361,71.466],[-133.588,103.176],[109.281,274.714],[297.459,276.803]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":55,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[321.639,324.418],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":50,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":151,"s":[100]},{"t":250,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":151,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":250,"s":[0]},{"t":350,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":422,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/LottieTest/Tests/Lolo/Animation.gif b/LottieTest/Tests/Lolo/Animation.gif new file mode 100644 index 00000000..4bd637dc Binary files /dev/null and b/LottieTest/Tests/Lolo/Animation.gif differ diff --git a/LottieTest/Tests/Lolo/Lottie.json b/LottieTest/Tests/Lolo/Lottie.json new file mode 100644 index 00000000..35132ca0 --- /dev/null +++ b/LottieTest/Tests/Lolo/Lottie.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 1.0.0","a":"","k":"","d":"","tc":""},"fr":24,"ip":12,"op":36,"w":1000,"h":1000,"nm":"Lolo_Walking","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Face_CTRL","parent":2,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":2,"s":[7]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":14,"s":[-7]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":26,"s":[7]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":38,"s":[-7]},{"t":50,"s":[7]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":2,"s":[20.648,-422.783,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,-384.518,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":14,"s":[-20.648,-422.783,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,-384.518,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":26,"s":[20.648,-422.783,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,-384.518,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":38,"s":[-20.648,-422.783,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,-384.518,0],"to":[0,0,0],"ti":[0,0,0]},{"t":50,"s":[20.648,-422.783,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Master_CTRL","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,798,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":12,"s":[95,105,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":18,"s":[105,95,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":24,"s":[95,105,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":30,"s":[105,95,100]},{"t":36,"s":[95,105,100]}],"ix":6}},"ao":0,"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Closed_Eyes 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.007,-24.801,0],"ix":2},"a":{"a":0,"k":[397.993,289.199,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-9.517,10.423],[-16.396,-14.97]],"o":[[14.97,-16.396],[12.678,11.576]],"v":[[-29.228,5.884],[29.228,5.884]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333340287,0.160784319043,0.184313729405,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":20,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[536.546,289.199],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-9.517,10.423],[-16.396,-14.97]],"o":[[14.97,-16.396],[12.678,11.576]],"v":[[-29.228,5.884],[29.228,5.884]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333340287,0.160784319043,0.184313729405,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":20,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[259.439,289.199],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":18,"op":21,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Eyes 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.122,-30.615,0],"ix":2},"a":{"a":0,"k":[397.878,283.385,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-13.569,0],[0,13.568],[13.566,0],[0,-13.568]],"o":[[13.566,0],[0,-13.568],[-13.569,0],[0,13.568]],"v":[[0.001,24.567],[24.566,0],[0.001,-24.567],[-24.566,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[536.546,283.385],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-13.566,0],[0,13.568],[13.569,0],[0,-13.568]],"o":[[13.569,0],[0,-13.568],[-13.566,0],[0,13.568]],"v":[[-0.001,24.567],[24.566,0],[-0.001,-24.567],[-24.566,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[259.21,283.385],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":21,"op":99,"st":3,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Eyes","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.122,-30.615,0],"ix":2},"a":{"a":0,"k":[397.878,283.385,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-13.569,0],[0,13.568],[13.566,0],[0,-13.568]],"o":[[13.566,0],[0,-13.568],[-13.569,0],[0,13.568]],"v":[[0.001,24.567],[24.566,0],[0.001,-24.567],[-24.566,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[536.546,283.385],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-13.566,0],[0,13.568],[13.569,0],[0,-13.568]],"o":[[13.569,0],[0,-13.568],[-13.566,0],[0,13.568]],"v":[[-0.001,24.567],[24.566,0],[-0.001,-24.567],[-24.566,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[259.21,283.385],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":18,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Mouth","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0.35,38.069,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-62.348,-41.943],[-52.911,31.724]],"o":[[52.277,35.168],[65.343,-39.178]],"v":[[-83.643,-12.551],[83.643,-12.551]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":28,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"R_Arm","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":-10,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":2,"s":[-84]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":26,"s":[-84]},{"t":38,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":2,"s":[-211.135,-279.663,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[-252.431,-279.663,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":26,"s":[-211.135,-279.663,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":38,"s":[-252.431,-279.663,0],"to":[0,0,0],"ti":[0,0,0]},{"t":50,"s":[-211.135,-279.663,0]}],"ix":2},"a":{"a":0,"k":[99.445,-97.888,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[52.441,12.175],[77.703,10.693]],"o":[[-67.01,-15.558],[-97.583,-13.429]],"v":[[99.445,-97.102],[-99.445,97.511]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[{"i":[[36.388,-39.676],[77.703,10.693]],"o":[[-87.122,94.995],[-97.583,-13.429]],"v":[[99.445,-97.102],[-152.853,21.126]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[{"i":[[48.198,-23.984],[38.337,-49.273]],"o":[[-89.268,44.421],[-60.488,77.743]],"v":[[99.445,-97.102],[-99.445,97.511]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[{"i":[[48.198,-23.984],[-19.967,-98.892]],"o":[[-89.268,44.421],[19.495,96.554]],"v":[[99.445,-97.102],[-64.753,122.307]],"c":false}]},{"t":36,"s":[{"i":[[52.441,12.175],[77.703,10.693]],"o":[[-67.01,-15.558],[-97.583,-13.429]],"v":[[99.445,-97.102],[-99.445,97.511]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":48,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Outline","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-298,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[19.419,-0.031],[0,0],[13.72,13.741],[0,19.419],[4.442,55.381],[13.845,75.65],[-12.578,14.795],[-19.354,1.584],[0,0],[-14.775,-12.602],[-7.811,-29.999],[-9.887,-136.734],[0,0],[13.719,-13.744]],"o":[[0,0],[-19.419,-0.031],[-13.72,-13.744],[0,0],[-4.442,-55.38],[-4.729,-25.841],[12.578,-14.795],[0,0],[19.36,-1.522],[14.774,12.601],[8.654,33.235],[11.614,160.614],[0,19.419],[-13.721,13.741]],"v":[[219.109,295.247],[-223.715,295.247],[-275.467,273.739],[-296.894,221.952],[-302.355,24.048],[-332.792,-210.031],[-318.733,-265.27],[-265.708,-288.943],[169.383,-333.874],[222.691,-316.571],[248.189,-266.663],[278.913,-28.329],[292.289,221.952],[270.863,273.739]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":18,"s":[{"i":[[19.419,-0.031],[0,0],[13.72,13.741],[0,19.419],[0,183.938],[0,0],[-13.72,13.742],[-19.419,0.031],[0,0],[-13.721,-13.742],[0,-19.419],[0,-142],[0,0],[13.719,-13.744]],"o":[[0,0],[-19.419,-0.031],[-13.72,-13.744],[0,0],[0,-119.22],[0,-19.419],[13.72,-13.742],[0,0],[19.419,0.031],[13.719,13.742],[0,0],[0,129.579],[0,19.419],[-13.721,13.741]],"v":[[219.109,295.247],[-223.715,295.247],[-275.467,273.739],[-300.703,221.952],[-312.132,0.378],[-300.703,-222.515],[-275.467,-274.302],[-223.715,-295.811],[219.109,-295.811],[270.863,-274.302],[292.289,-222.515],[307.527,12.632],[292.289,221.952],[270.863,273.739]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":24,"s":[{"i":[[19.419,-0.031],[0,0],[13.72,13.741],[0,19.419],[-13.398,159.271],[-15.538,65.76],[-14.476,12.944],[-19.39,-1.068],[0,0],[-12.921,-14.497],[1.069,-30.981],[10.013,-136.725],[0,0],[13.719,-13.744]],"o":[[0,0],[-19.419,-0.031],[-13.72,-13.744],[0,0],[8.524,-101.335],[6.041,-25.567],[14.476,-12.944],[0,0],[19.386,1.13],[12.92,14.496],[-1.069,30.981],[-7.801,106.524],[0,19.419],[-13.721,13.741]],"v":[[219.109,295.247],[-223.715,295.247],[-275.467,273.739],[-296.894,221.952],[-301.156,-19.712],[-266.568,-261.094],[-241.193,-313.49],[-189.36,-330.133],[252.755,-295.559],[306.368,-274.013],[321.672,-218.24],[299.576,19.388],[292.289,221.952],[270.863,273.739]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[19.419,-0.031],[0,0],[13.72,13.741],[0,19.419],[0,183.938],[0,0],[-13.72,13.742],[-19.419,0.031],[0,0],[-13.721,-13.742],[0,-19.419],[0,-142],[0,0],[13.719,-13.744]],"o":[[0,0],[-19.419,-0.031],[-13.72,-13.744],[0,0],[0,-119.22],[0,-19.419],[13.72,-13.742],[0,0],[19.419,0.031],[13.719,13.742],[0,0],[0,129.579],[0,19.419],[-13.721,13.741]],"v":[[219.109,295.247],[-223.715,295.247],[-275.467,273.739],[-300.703,221.952],[-312.132,0.378],[-300.703,-222.515],[-275.467,-274.302],[-223.715,-295.811],[219.109,-295.811],[270.863,-274.302],[292.289,-222.515],[307.527,12.632],[292.289,221.952],[270.863,273.739]],"c":true}]},{"t":36,"s":[{"i":[[19.419,-0.031],[0,0],[13.72,13.741],[0,19.419],[4.442,55.381],[13.845,75.65],[-12.578,14.795],[-19.354,1.584],[0,0],[-14.775,-12.602],[-7.811,-29.999],[-9.887,-136.734],[0,0],[13.719,-13.744]],"o":[[0,0],[-19.419,-0.031],[-13.72,-13.744],[0,0],[-4.442,-55.38],[-4.729,-25.841],[12.578,-14.795],[0,0],[19.36,-1.522],[14.774,12.601],[8.654,33.235],[11.614,160.614],[0,19.419],[-13.721,13.741]],"v":[[219.109,295.247],[-223.715,295.247],[-275.467,273.739],[-296.894,221.952],[-302.355,24.048],[-332.792,-210.031],[-318.733,-265.27],[-265.708,-288.943],[169.383,-333.874],[222.691,-316.571],[248.189,-266.663],[278.913,-28.329],[292.289,221.952],[270.863,273.739]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":20,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Fill","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-298,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[19.419,-0.031],[0,0],[13.72,13.741],[0,19.419],[4.442,55.381],[13.845,75.65],[-12.578,14.795],[-19.354,1.584],[0,0],[-14.775,-12.602],[-7.811,-29.999],[-9.887,-136.734],[0,0],[13.719,-13.744]],"o":[[0,0],[-19.419,-0.031],[-13.72,-13.744],[0,0],[-4.442,-55.38],[-4.729,-25.841],[12.578,-14.795],[0,0],[19.36,-1.522],[14.774,12.601],[8.654,33.235],[11.614,160.614],[0,19.419],[-13.721,13.741]],"v":[[219.109,295.247],[-223.715,295.247],[-275.467,273.739],[-296.894,221.952],[-302.355,24.048],[-332.792,-210.031],[-318.733,-265.27],[-265.708,-288.943],[169.383,-333.874],[222.691,-316.571],[248.189,-266.663],[278.913,-28.329],[292.289,221.952],[270.863,273.739]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":18,"s":[{"i":[[19.419,-0.031],[0,0],[13.72,13.741],[0,19.419],[0,183.938],[0,0],[-13.72,13.742],[-19.419,0.031],[0,0],[-13.721,-13.742],[0,-19.419],[0,-142],[0,0],[13.719,-13.744]],"o":[[0,0],[-19.419,-0.031],[-13.72,-13.744],[0,0],[0,-119.22],[0,-19.419],[13.72,-13.742],[0,0],[19.419,0.031],[13.719,13.742],[0,0],[0,129.579],[0,19.419],[-13.721,13.741]],"v":[[219.109,295.247],[-223.715,295.247],[-275.467,273.739],[-300.703,221.952],[-312.132,0.378],[-300.703,-222.515],[-275.467,-274.302],[-223.715,-295.811],[219.109,-295.811],[270.863,-274.302],[292.289,-222.515],[307.527,12.632],[292.289,221.952],[270.863,273.739]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":24,"s":[{"i":[[19.419,-0.031],[0,0],[13.72,13.741],[0,19.419],[-13.398,159.271],[-15.538,65.76],[-14.476,12.944],[-19.39,-1.068],[0,0],[-12.921,-14.497],[1.069,-30.981],[10.013,-136.725],[0,0],[13.719,-13.744]],"o":[[0,0],[-19.419,-0.031],[-13.72,-13.744],[0,0],[8.524,-101.335],[6.041,-25.567],[14.476,-12.944],[0,0],[19.386,1.13],[12.92,14.496],[-1.069,30.981],[-7.801,106.524],[0,19.419],[-13.721,13.741]],"v":[[219.109,295.247],[-223.715,295.247],[-275.467,273.739],[-296.894,221.952],[-301.156,-19.712],[-266.568,-261.094],[-241.193,-313.49],[-189.36,-330.133],[252.755,-295.559],[306.368,-274.013],[321.672,-218.24],[299.576,19.388],[292.289,221.952],[270.863,273.739]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[19.419,-0.031],[0,0],[13.72,13.741],[0,19.419],[0,183.938],[0,0],[-13.72,13.742],[-19.419,0.031],[0,0],[-13.721,-13.742],[0,-19.419],[0,-142],[0,0],[13.719,-13.744]],"o":[[0,0],[-19.419,-0.031],[-13.72,-13.744],[0,0],[0,-119.22],[0,-19.419],[13.72,-13.742],[0,0],[19.419,0.031],[13.719,13.742],[0,0],[0,129.579],[0,19.419],[-13.721,13.741]],"v":[[219.109,295.247],[-223.715,295.247],[-275.467,273.739],[-300.703,221.952],[-312.132,0.378],[-300.703,-222.515],[-275.467,-274.302],[-223.715,-295.811],[219.109,-295.811],[270.863,-274.302],[292.289,-222.515],[307.527,12.632],[292.289,221.952],[270.863,273.739]],"c":true}]},{"t":36,"s":[{"i":[[19.419,-0.031],[0,0],[13.72,13.741],[0,19.419],[4.442,55.381],[13.845,75.65],[-12.578,14.795],[-19.354,1.584],[0,0],[-14.775,-12.602],[-7.811,-29.999],[-9.887,-136.734],[0,0],[13.719,-13.744]],"o":[[0,0],[-19.419,-0.031],[-13.72,-13.744],[0,0],[-4.442,-55.38],[-4.729,-25.841],[12.578,-14.795],[0,0],[19.36,-1.522],[14.774,12.601],[8.654,33.235],[11.614,160.614],[0,19.419],[-13.721,13.741]],"v":[[219.109,295.247],[-223.715,295.247],[-275.467,273.739],[-296.894,221.952],[-302.355,24.048],[-332.792,-210.031],[-318.733,-265.27],[-265.708,-288.943],[169.383,-333.874],[222.691,-316.571],[248.189,-266.663],[278.913,-28.329],[292.289,221.952],[270.863,273.739]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.392156862745,0.854901960784,0.709803921569,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"L_Arm","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":2,"s":[88]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":14,"s":[4]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":26,"s":[88]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":38,"s":[4]},{"t":50,"s":[88]}],"ix":10},"p":{"a":0,"k":[210.973,-311.929,0],"ix":2},"a":{"a":0,"k":[-99.445,-97.888,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-52.441,12.175],[-77.703,10.693]],"o":[[67.01,-15.558],[97.583,-13.429]],"v":[[-99.445,-97.102],[99.445,97.511]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":48,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/LottieTest/Tests/MoveMultiple/AfterEffects.aep b/LottieTest/Tests/MoveMultiple/AfterEffects.aep new file mode 100644 index 00000000..0c02485f Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/AfterEffects.aep differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame001.png b/LottieTest/Tests/MoveMultiple/Frames/frame001.png new file mode 100644 index 00000000..9f569bba Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame001.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame007.png b/LottieTest/Tests/MoveMultiple/Frames/frame007.png new file mode 100644 index 00000000..b50b4331 Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame007.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame012.png b/LottieTest/Tests/MoveMultiple/Frames/frame012.png new file mode 100644 index 00000000..31ddf8ff Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame012.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame017.png b/LottieTest/Tests/MoveMultiple/Frames/frame017.png new file mode 100644 index 00000000..746465a8 Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame017.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame022.png b/LottieTest/Tests/MoveMultiple/Frames/frame022.png new file mode 100644 index 00000000..1e1967bb Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame022.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame027.png b/LottieTest/Tests/MoveMultiple/Frames/frame027.png new file mode 100644 index 00000000..d3603d10 Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame027.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame032.png b/LottieTest/Tests/MoveMultiple/Frames/frame032.png new file mode 100644 index 00000000..65dc4c57 Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame032.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame037.png b/LottieTest/Tests/MoveMultiple/Frames/frame037.png new file mode 100644 index 00000000..dd59f2a5 Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame037.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame042.png b/LottieTest/Tests/MoveMultiple/Frames/frame042.png new file mode 100644 index 00000000..a9c74f0a Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame042.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame047.png b/LottieTest/Tests/MoveMultiple/Frames/frame047.png new file mode 100644 index 00000000..8d2f4c25 Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame047.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame052.png b/LottieTest/Tests/MoveMultiple/Frames/frame052.png new file mode 100644 index 00000000..0ba6697c Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame052.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame057.png b/LottieTest/Tests/MoveMultiple/Frames/frame057.png new file mode 100644 index 00000000..6fe9848f Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame057.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame062.png b/LottieTest/Tests/MoveMultiple/Frames/frame062.png new file mode 100644 index 00000000..ae631a55 Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame062.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame067.png b/LottieTest/Tests/MoveMultiple/Frames/frame067.png new file mode 100644 index 00000000..07bf476a Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame067.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame072.png b/LottieTest/Tests/MoveMultiple/Frames/frame072.png new file mode 100644 index 00000000..d6787e4b Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame072.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame077.png b/LottieTest/Tests/MoveMultiple/Frames/frame077.png new file mode 100644 index 00000000..fedfa77a Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame077.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame082.png b/LottieTest/Tests/MoveMultiple/Frames/frame082.png new file mode 100644 index 00000000..8235b23d Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame082.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame087.png b/LottieTest/Tests/MoveMultiple/Frames/frame087.png new file mode 100644 index 00000000..6ceff771 Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame087.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame092.png b/LottieTest/Tests/MoveMultiple/Frames/frame092.png new file mode 100644 index 00000000..c27e1143 Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame092.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame097.png b/LottieTest/Tests/MoveMultiple/Frames/frame097.png new file mode 100644 index 00000000..e1e38abb Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame097.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame102.png b/LottieTest/Tests/MoveMultiple/Frames/frame102.png new file mode 100644 index 00000000..eac63071 Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame102.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame107.png b/LottieTest/Tests/MoveMultiple/Frames/frame107.png new file mode 100644 index 00000000..c4f7b2d2 Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame107.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame112.png b/LottieTest/Tests/MoveMultiple/Frames/frame112.png new file mode 100644 index 00000000..76c94d9a Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame112.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame117.png b/LottieTest/Tests/MoveMultiple/Frames/frame117.png new file mode 100644 index 00000000..5035fedf Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame117.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame122.png b/LottieTest/Tests/MoveMultiple/Frames/frame122.png new file mode 100644 index 00000000..00ad72f9 Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame122.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame127.png b/LottieTest/Tests/MoveMultiple/Frames/frame127.png new file mode 100644 index 00000000..7197e155 Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame127.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame132.png b/LottieTest/Tests/MoveMultiple/Frames/frame132.png new file mode 100644 index 00000000..e1e38abb Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame132.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame137.png b/LottieTest/Tests/MoveMultiple/Frames/frame137.png new file mode 100644 index 00000000..eac63071 Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame137.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame142.png b/LottieTest/Tests/MoveMultiple/Frames/frame142.png new file mode 100644 index 00000000..bf975082 Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame142.png differ diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame147.png b/LottieTest/Tests/MoveMultiple/Frames/frame147.png new file mode 100644 index 00000000..c47cb1c1 Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame147.png differ diff --git a/LottieTest/Tests/MoveMultiple/Lottie.json b/LottieTest/Tests/MoveMultiple/Lottie.json new file mode 100644 index 00000000..fd8c9644 --- /dev/null +++ b/LottieTest/Tests/MoveMultiple/Lottie.json @@ -0,0 +1 @@ +{"v":"5.9.0","fr":30,"ip":0,"op":150,"w":500,"h":500,"nm":"Main","ddd":0,"assets":[{"id":"comp_0","nm":"Shape Layer 1 Comp 3","fr":30,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[13]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[99]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":21,"s":[198]},{"t":43,"s":[360]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[109,66,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[78,299,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[244,410,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[409,306,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[409,403,0],"to":[0,0,0],"ti":[0,0,0]},{"t":43,"s":[109,66,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":26,"s":[100,100,100]},{"t":45,"s":[0,0,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":22,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.834509849548,0.172549009323,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":46,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[13]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[99]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[198]},{"t":71,"s":[360]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[109,66,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[78,299,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[244,410,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[409,306,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[409,403,0],"to":[0,0,0],"ti":[0,0,0]},{"t":71,"s":[109,66,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":22,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.172549009323,0.484059840441,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":28,"op":74,"st":28,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Shape Layer 1 Comp 3","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":500,"h":500,"ip":0,"op":46,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Shape Layer 1 Comp 3","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":500,"h":500,"ip":39,"op":85,"st":39,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Shape Layer 1 Comp 3","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":500,"h":500,"ip":69,"op":115,"st":69,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Shape Layer 1 Comp 3","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":500,"h":500,"ip":104,"op":150,"st":104,"bm":0},{"ddd":0,"ind":6,"ty":1,"nm":"White Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":500,"sh":500,"sc":"#ffffff","ip":0,"op":150,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/LottieTest/Tests/MoveMultiple/Test.json b/LottieTest/Tests/MoveMultiple/Test.json new file mode 100644 index 00000000..649463b4 --- /dev/null +++ b/LottieTest/Tests/MoveMultiple/Test.json @@ -0,0 +1,5 @@ +{ + "duration": 5, + "frames-per-second": 30, + "number-of-frames": 150 +} \ No newline at end of file diff --git a/LottieTest/Tests/MoveMultiple/Test.json.bak b/LottieTest/Tests/MoveMultiple/Test.json.bak new file mode 100644 index 00000000..1efd2d33 --- /dev/null +++ b/LottieTest/Tests/MoveMultiple/Test.json.bak @@ -0,0 +1,5 @@ +{ + "duration": "5", + "frames-per-second": "30", + "number-of-frames": "150" +} \ No newline at end of file diff --git a/LottieTest/Tests/RectJump/AfterEffects.aep b/LottieTest/Tests/RectJump/AfterEffects.aep new file mode 100644 index 00000000..c2e097f6 Binary files /dev/null and b/LottieTest/Tests/RectJump/AfterEffects.aep differ diff --git a/LottieTest/Tests/RectJump/Frames/frame001.png b/LottieTest/Tests/RectJump/Frames/frame001.png new file mode 100644 index 00000000..b44ff375 Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame001.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame006.png b/LottieTest/Tests/RectJump/Frames/frame006.png new file mode 100644 index 00000000..b44ff375 Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame006.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame011.png b/LottieTest/Tests/RectJump/Frames/frame011.png new file mode 100644 index 00000000..b44ff375 Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame011.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame016.png b/LottieTest/Tests/RectJump/Frames/frame016.png new file mode 100644 index 00000000..b44ff375 Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame016.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame021.png b/LottieTest/Tests/RectJump/Frames/frame021.png new file mode 100644 index 00000000..b44ff375 Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame021.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame026.png b/LottieTest/Tests/RectJump/Frames/frame026.png new file mode 100644 index 00000000..4178298b Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame026.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame031.png b/LottieTest/Tests/RectJump/Frames/frame031.png new file mode 100644 index 00000000..23cea3e1 Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame031.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame036.png b/LottieTest/Tests/RectJump/Frames/frame036.png new file mode 100644 index 00000000..23cea3e1 Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame036.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame041.png b/LottieTest/Tests/RectJump/Frames/frame041.png new file mode 100644 index 00000000..23cea3e1 Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame041.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame046.png b/LottieTest/Tests/RectJump/Frames/frame046.png new file mode 100644 index 00000000..23cea3e1 Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame046.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame051.png b/LottieTest/Tests/RectJump/Frames/frame051.png new file mode 100644 index 00000000..23cea3e1 Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame051.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame056.png b/LottieTest/Tests/RectJump/Frames/frame056.png new file mode 100644 index 00000000..c317292d Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame056.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame061.png b/LottieTest/Tests/RectJump/Frames/frame061.png new file mode 100644 index 00000000..c317292d Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame061.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame066.png b/LottieTest/Tests/RectJump/Frames/frame066.png new file mode 100644 index 00000000..c317292d Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame066.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame071.png b/LottieTest/Tests/RectJump/Frames/frame071.png new file mode 100644 index 00000000..c317292d Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame071.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame076.png b/LottieTest/Tests/RectJump/Frames/frame076.png new file mode 100644 index 00000000..c317292d Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame076.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame081.png b/LottieTest/Tests/RectJump/Frames/frame081.png new file mode 100644 index 00000000..c317292d Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame081.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame086.png b/LottieTest/Tests/RectJump/Frames/frame086.png new file mode 100644 index 00000000..09a8fbac Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame086.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame091.png b/LottieTest/Tests/RectJump/Frames/frame091.png new file mode 100644 index 00000000..2f09b113 Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame091.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame096.png b/LottieTest/Tests/RectJump/Frames/frame096.png new file mode 100644 index 00000000..902fc2ab Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame096.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame101.png b/LottieTest/Tests/RectJump/Frames/frame101.png new file mode 100644 index 00000000..dd7ed591 Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame101.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame106.png b/LottieTest/Tests/RectJump/Frames/frame106.png new file mode 100644 index 00000000..dd7ed591 Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame106.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame111.png b/LottieTest/Tests/RectJump/Frames/frame111.png new file mode 100644 index 00000000..dd7ed591 Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame111.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame116.png b/LottieTest/Tests/RectJump/Frames/frame116.png new file mode 100644 index 00000000..7000455f Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame116.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame121.png b/LottieTest/Tests/RectJump/Frames/frame121.png new file mode 100644 index 00000000..c9c33806 Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame121.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame126.png b/LottieTest/Tests/RectJump/Frames/frame126.png new file mode 100644 index 00000000..c9c33806 Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame126.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame131.png b/LottieTest/Tests/RectJump/Frames/frame131.png new file mode 100644 index 00000000..c9c33806 Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame131.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame136.png b/LottieTest/Tests/RectJump/Frames/frame136.png new file mode 100644 index 00000000..c9c33806 Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame136.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame141.png b/LottieTest/Tests/RectJump/Frames/frame141.png new file mode 100644 index 00000000..c9c33806 Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame141.png differ diff --git a/LottieTest/Tests/RectJump/Frames/frame146.png b/LottieTest/Tests/RectJump/Frames/frame146.png new file mode 100644 index 00000000..c9c33806 Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame146.png differ diff --git a/LottieTest/Tests/RectJump/Lottie.json b/LottieTest/Tests/RectJump/Lottie.json new file mode 100644 index 00000000..a2f8942a --- /dev/null +++ b/LottieTest/Tests/RectJump/Lottie.json @@ -0,0 +1 @@ +{"v":"5.9.0","fr":30,"ip":0,"op":150,"w":500,"h":500,"nm":"Main","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[82,70,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[82,70,0],"to":[0.5,56.5,0],"ti":[-0.5,-56.5,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[85,409,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[85,409,0],"to":[52.167,-0.5,0],"ti":[-52.167,0.5,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[398,406,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":85,"s":[398,406,0],"to":[-0.333,-54.833,0],"ti":[0.333,54.833,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":100,"s":[396,77,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":115,"s":[396,77,0],"to":[-52.333,-1,0],"ti":[52.333,1,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":116,"s":[82,71,0],"to":[0,0,0],"ti":[0,0,0]},{"t":149,"s":[82,71,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.551787614822,0.901960790157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":149,"op":150,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[82,70,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[82,70,0],"to":[0.5,56.5,0],"ti":[-0.5,-56.5,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[85,409,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[85,409,0],"to":[52.167,-0.5,0],"ti":[-52.167,0.5,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[398,406,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":85,"s":[398,406,0],"to":[-0.333,-54.833,0],"ti":[0.333,54.833,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":100,"s":[396,77,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":115,"s":[396,77,0],"to":[-52.333,-1,0],"ti":[52.333,1,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":116,"s":[82,71,0],"to":[0,0,0],"ti":[0,0,0]},{"t":149,"s":[82,71,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.551787614822,0.901960790157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":149,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":1,"nm":"White Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":500,"sh":500,"sc":"#ffffff","ip":0,"op":150,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/LottieTest/Tests/RectJump/Test.json b/LottieTest/Tests/RectJump/Test.json new file mode 100644 index 00000000..649463b4 --- /dev/null +++ b/LottieTest/Tests/RectJump/Test.json @@ -0,0 +1,5 @@ +{ + "duration": 5, + "frames-per-second": 30, + "number-of-frames": 150 +} \ No newline at end of file diff --git a/LottieTest/Tests/RectJump/Test.json.bak b/LottieTest/Tests/RectJump/Test.json.bak new file mode 100644 index 00000000..1efd2d33 --- /dev/null +++ b/LottieTest/Tests/RectJump/Test.json.bak @@ -0,0 +1,5 @@ +{ + "duration": "5", + "frames-per-second": "30", + "number-of-frames": "150" +} \ No newline at end of file diff --git a/LottieTest/Tests/RectJump2/AfterEffects.aep b/LottieTest/Tests/RectJump2/AfterEffects.aep new file mode 100644 index 00000000..bc03cca1 Binary files /dev/null and b/LottieTest/Tests/RectJump2/AfterEffects.aep differ diff --git a/LottieTest/Tests/RectJump2/Frames/frame001.png b/LottieTest/Tests/RectJump2/Frames/frame001.png new file mode 100644 index 00000000..6f823b28 Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame001.png differ diff --git a/LottieTest/Tests/RectJump2/Frames/frame075.png b/LottieTest/Tests/RectJump2/Frames/frame075.png new file mode 100644 index 00000000..33e00d01 Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame075.png differ diff --git a/LottieTest/Tests/RectJump2/Frames/frame212.png b/LottieTest/Tests/RectJump2/Frames/frame212.png new file mode 100644 index 00000000..cc5935c8 Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame212.png differ diff --git a/LottieTest/Tests/RectJump2/Frames/frame305.png b/LottieTest/Tests/RectJump2/Frames/frame305.png new file mode 100644 index 00000000..9986589d Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame305.png differ diff --git a/LottieTest/Tests/RectJump2/Frames/frame374.png b/LottieTest/Tests/RectJump2/Frames/frame374.png new file mode 100644 index 00000000..fea19da3 Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame374.png differ diff --git a/LottieTest/Tests/RectJump2/Frames/frame513.png b/LottieTest/Tests/RectJump2/Frames/frame513.png new file mode 100644 index 00000000..d9ce5942 Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame513.png differ diff --git a/LottieTest/Tests/RectJump2/Frames/frame641.png b/LottieTest/Tests/RectJump2/Frames/frame641.png new file mode 100644 index 00000000..949e9080 Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame641.png differ diff --git a/LottieTest/Tests/RectJump2/Frames/frame646.png b/LottieTest/Tests/RectJump2/Frames/frame646.png new file mode 100644 index 00000000..949e9080 Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame646.png differ diff --git a/LottieTest/Tests/RectJump2/Frames/frame651.png b/LottieTest/Tests/RectJump2/Frames/frame651.png new file mode 100644 index 00000000..949e9080 Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame651.png differ diff --git a/LottieTest/Tests/RectJump2/Frames/frame656.png b/LottieTest/Tests/RectJump2/Frames/frame656.png new file mode 100644 index 00000000..949e9080 Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame656.png differ diff --git a/LottieTest/Tests/RectJump2/Frames/frame661.png b/LottieTest/Tests/RectJump2/Frames/frame661.png new file mode 100644 index 00000000..949e9080 Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame661.png differ diff --git a/LottieTest/Tests/RectJump2/Lottie.json b/LottieTest/Tests/RectJump2/Lottie.json new file mode 100644 index 00000000..de25268a --- /dev/null +++ b/LottieTest/Tests/RectJump2/Lottie.json @@ -0,0 +1 @@ +{"v":"5.9.0","fr":30,"ip":0,"op":750,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":74,"s":[0]},{"t":75,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,155,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":750,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":210,"s":[360]}],"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":750,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[60,60,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":300,"s":[60,440,0],"to":[0,0,0],"ti":[-63.333,0,0]},{"t":600,"s":[440,440,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":14,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.813471615314,0.909803926945,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":750,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":1,"nm":"White Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":500,"sh":500,"sc":"#ffffff","ip":0,"op":750,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/LottieTest/Tests/RectJump2/Test.json b/LottieTest/Tests/RectJump2/Test.json new file mode 100644 index 00000000..2f215479 --- /dev/null +++ b/LottieTest/Tests/RectJump2/Test.json @@ -0,0 +1,5 @@ +{ + "duration": 25, + "frames-per-second": 30, + "number-of-frames": 750 +} \ No newline at end of file diff --git a/LottieTest/Tests/RectJump2/Test.json.bak b/LottieTest/Tests/RectJump2/Test.json.bak new file mode 100644 index 00000000..6c6abdd7 --- /dev/null +++ b/LottieTest/Tests/RectJump2/Test.json.bak @@ -0,0 +1,5 @@ +{ + "duration": "25", + "frames-per-second": "30", + "number-of-frames": "750" +} \ No newline at end of file diff --git a/LottieTest/Tests/Shadow/AfterEffects.aep b/LottieTest/Tests/Shadow/AfterEffects.aep new file mode 100644 index 00000000..26aa91df Binary files /dev/null and b/LottieTest/Tests/Shadow/AfterEffects.aep differ diff --git a/LottieTest/Tests/Shadow/Frames/frame001.png b/LottieTest/Tests/Shadow/Frames/frame001.png new file mode 100644 index 00000000..4866b4bd Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame001.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame006.png b/LottieTest/Tests/Shadow/Frames/frame006.png new file mode 100644 index 00000000..0df8c4cb Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame006.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame011.png b/LottieTest/Tests/Shadow/Frames/frame011.png new file mode 100644 index 00000000..88553c18 Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame011.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame016.png b/LottieTest/Tests/Shadow/Frames/frame016.png new file mode 100644 index 00000000..43d50eda Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame016.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame021.png b/LottieTest/Tests/Shadow/Frames/frame021.png new file mode 100644 index 00000000..28677c90 Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame021.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame026.png b/LottieTest/Tests/Shadow/Frames/frame026.png new file mode 100644 index 00000000..38c96da2 Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame026.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame031.png b/LottieTest/Tests/Shadow/Frames/frame031.png new file mode 100644 index 00000000..707490db Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame031.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame036.png b/LottieTest/Tests/Shadow/Frames/frame036.png new file mode 100644 index 00000000..ce5e22ac Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame036.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame041.png b/LottieTest/Tests/Shadow/Frames/frame041.png new file mode 100644 index 00000000..23f34831 Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame041.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame046.png b/LottieTest/Tests/Shadow/Frames/frame046.png new file mode 100644 index 00000000..67ecee46 Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame046.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame051.png b/LottieTest/Tests/Shadow/Frames/frame051.png new file mode 100644 index 00000000..12127bab Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame051.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame056.png b/LottieTest/Tests/Shadow/Frames/frame056.png new file mode 100644 index 00000000..8df1e56e Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame056.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame061.png b/LottieTest/Tests/Shadow/Frames/frame061.png new file mode 100644 index 00000000..3710efc0 Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame061.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame066.png b/LottieTest/Tests/Shadow/Frames/frame066.png new file mode 100644 index 00000000..04ec2f33 Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame066.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame071.png b/LottieTest/Tests/Shadow/Frames/frame071.png new file mode 100644 index 00000000..985973fc Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame071.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame076.png b/LottieTest/Tests/Shadow/Frames/frame076.png new file mode 100644 index 00000000..51735bb5 Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame076.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame081.png b/LottieTest/Tests/Shadow/Frames/frame081.png new file mode 100644 index 00000000..9f12f8df Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame081.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame086.png b/LottieTest/Tests/Shadow/Frames/frame086.png new file mode 100644 index 00000000..f4c8f67f Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame086.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame091.png b/LottieTest/Tests/Shadow/Frames/frame091.png new file mode 100644 index 00000000..6852e3dd Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame091.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame096.png b/LottieTest/Tests/Shadow/Frames/frame096.png new file mode 100644 index 00000000..d5f15b7b Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame096.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame101.png b/LottieTest/Tests/Shadow/Frames/frame101.png new file mode 100644 index 00000000..b5f11a35 Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame101.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame106.png b/LottieTest/Tests/Shadow/Frames/frame106.png new file mode 100644 index 00000000..a702cdf3 Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame106.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame111.png b/LottieTest/Tests/Shadow/Frames/frame111.png new file mode 100644 index 00000000..9660ac12 Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame111.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame116.png b/LottieTest/Tests/Shadow/Frames/frame116.png new file mode 100644 index 00000000..782cae94 Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame116.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame121.png b/LottieTest/Tests/Shadow/Frames/frame121.png new file mode 100644 index 00000000..8d2c0f0a Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame121.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame126.png b/LottieTest/Tests/Shadow/Frames/frame126.png new file mode 100644 index 00000000..b5d3094f Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame126.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame131.png b/LottieTest/Tests/Shadow/Frames/frame131.png new file mode 100644 index 00000000..cf576e97 Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame131.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame136.png b/LottieTest/Tests/Shadow/Frames/frame136.png new file mode 100644 index 00000000..4c26f327 Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame136.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame141.png b/LottieTest/Tests/Shadow/Frames/frame141.png new file mode 100644 index 00000000..c75092e2 Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame141.png differ diff --git a/LottieTest/Tests/Shadow/Frames/frame146.png b/LottieTest/Tests/Shadow/Frames/frame146.png new file mode 100644 index 00000000..aa255005 Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame146.png differ diff --git a/LottieTest/Tests/Shadow/Lottie.json b/LottieTest/Tests/Shadow/Lottie.json new file mode 100644 index 00000000..fe914cde --- /dev/null +++ b/LottieTest/Tests/Shadow/Lottie.json @@ -0,0 +1 @@ +{"v":"5.9.0","fr":30,"ip":0,"op":150,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"SimpleShadow 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[136.5,372,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[50.273,53.039,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0.061545558274,0.426726341248,0.68235296011,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":89.5,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":14,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":1,"ix":6}}]}],"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[75,-181],[-20,-75],[-76,-175],[-196,-174],[-198,15],[-35,7],[-79,181],[54,181],[36.043,64.625],[183,43],[34,-14],[158,-118]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.294117629528,0.742560505867,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"SoftShadowWithRotation","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":149,"s":[360]}],"ix":10},"p":{"a":0,"k":[352,361,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[50.273,53.039,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":127.5,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":20,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":10,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[75,-181],[-20,-75],[-76,-175],[-196,-174],[-198,15],[-35,7],[-79,181],[54,181],[36.043,64.625],[183,43],[34,-14],[158,-118]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.294117629528,0.742560505867,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"SimpleShadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[158,159,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[50.273,53.039,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":127.5,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":14,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[75,-181],[-20,-75],[-76,-175],[-196,-174],[-198,15],[-35,7],[-79,181],[54,181],[36.043,64.625],[183,43],[34,-14],[158,-118]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.294117629528,0.742560505867,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":1,"nm":"White Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":500,"sh":500,"sc":"#ffffff","ip":0,"op":150,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/LottieTest/Tests/Shadow/Test.json b/LottieTest/Tests/Shadow/Test.json new file mode 100644 index 00000000..649463b4 --- /dev/null +++ b/LottieTest/Tests/Shadow/Test.json @@ -0,0 +1,5 @@ +{ + "duration": 5, + "frames-per-second": 30, + "number-of-frames": 150 +} \ No newline at end of file diff --git a/LottieTest/Tests/Shadow/Test.json.bak b/LottieTest/Tests/Shadow/Test.json.bak new file mode 100644 index 00000000..1efd2d33 --- /dev/null +++ b/LottieTest/Tests/Shadow/Test.json.bak @@ -0,0 +1,5 @@ +{ + "duration": "5", + "frames-per-second": "30", + "number-of-frames": "150" +} \ No newline at end of file diff --git a/LottieTest/Tests/Smile/Animation.gif b/LottieTest/Tests/Smile/Animation.gif new file mode 100644 index 00000000..c4846cef Binary files /dev/null and b/LottieTest/Tests/Smile/Animation.gif differ diff --git a/LottieTest/Tests/Smile/Lottie.json b/LottieTest/Tests/Smile/Lottie.json new file mode 100644 index 00000000..c7289b86 --- /dev/null +++ b/LottieTest/Tests/Smile/Lottie.json @@ -0,0 +1 @@ +{"v":"5.5.5","fr":25,"ip":0,"op":95,"w":640,"h":640,"nm":"表情test","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"“eye-l/AEtest”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[237,275,0],"to":[9.583,-5,0],"ti":[-31.083,3,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":16,"s":[294.5,245,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":30,"s":[294.5,245,0],"to":[-62.833,11.667,0],"ti":[13.333,-11.667,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":45,"s":[214.5,315,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[214.5,315,0],"to":[3.75,-6.667,0],"ti":[-3.75,6.667,0]},{"t":85,"s":[237,275,0]}],"ix":2},"a":{"a":0,"k":[18.5,18.5,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.833]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":16,"s":[84,84,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":30,"s":[84,84,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":45,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":59,"s":[100,100,100]},{"t":85,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-9.941],[9.941,0],[0,9.941],[-9.941,0]],"o":[[0,9.941],[-9.941,0],[0,-9.941],[9.941,0]],"v":[[18,0],[0,18],[-18,0],[0,-18]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.067000003889,0.027000000898,0.008000000785,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[18.25,18.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"“eye-r/AEtest”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[403,275,0],"to":[-7.083,-38.25,0],"ti":[-3.417,15.25,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":16,"s":[414.5,201.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":30,"s":[414.5,201.5,0],"to":[-70.833,13,0],"ti":[6.833,-18.5,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":45,"s":[319.5,279.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[319.5,279.5,0],"to":[13.917,-0.75,0],"ti":[-13.917,0.75,0]},{"t":85,"s":[403,275,0]}],"ix":2},"a":{"a":0,"k":[18.5,18.5,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,-0.417]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":16,"s":[78,78,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":30,"s":[78,78,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":45,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":59,"s":[100,100,100]},{"t":85,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-9.941],[9.941,0],[0,9.941],[-9.94,0]],"o":[[0,9.941],[-9.94,0],[0,-9.941],[9.941,0]],"v":[[18,0],[0,18],[-18,0],[0,-18]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.067000003889,0.027000000898,0.008000000785,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[18.25,18.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"“mouth/AEtest”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":16,"s":[-25.438]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[-25.438]},{"t":85,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[320,400,0],"to":[12.833,-11.5,0],"ti":[-12.833,11.5,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":16,"s":[397,331,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":30,"s":[397,331,0],"to":[-64.667,3.333,0],"ti":[14.667,-9.333,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":45,"s":[309,387,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[309,387,0],"to":[1.833,2.167,0],"ti":[-1.833,-2.167,0]},{"t":85,"s":[320,400,0]}],"ix":2},"a":{"a":0,"k":[101.5,61.5,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":16,"s":[55.098,42.752,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":30,"s":[55.098,42.752,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":45,"s":[31.249,40.03,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":59,"s":[31.249,40.03,100]},{"t":85,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[32.292,0],[17.547,-22.161],[-31.667,0],[-18.503,22.82]],"o":[[-32.292,0],[18.503,22.82],[31.667,0],[-17.547,-22.161]],"v":[[0,-37],[-78.426,-0.41],[0,37],[78.426,-0.41]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.847000002394,0.234999997008,0.187999994615,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[101.169,85.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[28.346,-6.205],[0.005,-5.486],[0,0],[-55.736,0],[0,55.736],[0,0],[5.36,1.173],[32.378,0]],"o":[[-5.36,1.173],[0,0],[0,55.736],[55.736,0],[0,0],[-0.005,-5.486],[-28.346,-6.205],[-32.377,0]],"v":[[-91.644,-51.378],[-100.919,-40.015],[-100.919,-39.919],[0,61],[100.919,-39.919],[100.919,-40.015],[91.644,-51.378],[0,-61]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.067000003889,0.027000000898,0.008000000785,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[101.169,61.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"“face/AEtest”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[320,320,0],"ix":2},"a":{"a":0,"k":[170.5,170.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-93.888],[93.889,0],[0,93.889],[-93.888,0]],"o":[[0,93.889],[-93.888,0],[0,-93.888],[93.889,0]],"v":[[170,0],[0,170],[-170,0],[0,-170]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.870999983245,0.501999978458,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[170.25,170.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/LottieTest/Tests/TestPlan.json b/LottieTest/Tests/TestPlan.json new file mode 100644 index 00000000..f308d5b6 --- /dev/null +++ b/LottieTest/Tests/TestPlan.json @@ -0,0 +1,19 @@ +{ + "image-sequence-tests": [ + { "name": "Gradient", "threshold": 0.01, "avg-threshold": 0.005 }, + { "name": "Shadow", "threshold": 0.01, "avg-threshold": 0.01 }, + { "name": "MoveMultiple", "threshold": 0.01, "avg-threshold": 0.005 }, + { "name": "BlurOverlap", "threshold": 0.01, "avg-threshold": 0.005 }, + { "name": "RectJump2", "threshold": 0.01, "avg-threshold": 0.005 }, + { "name": "RectJump", "threshold": 0.04, "avg-threshold": 0.005 } + ], + "lottifiles-gif-tests": [ + { "name" : "Smile", "link": "https://lottiefiles.com/7194-smile", "threshold": 0.03, "avg-threshold": 0.01 }, + { "name" : "Earth", "link": "https://lottiefiles.com/102030-earth-love-earth-day", "threshold": 0.20, "avg-threshold": 0.03 }, + { "name" : "Banana", "link": "https://lottiefiles.com/106560-banana", "threshold": 0.06, "avg-threshold": 0.02 }, + { "name" : "Logo", "link": "https://lottiefiles.com/39206-lottie-logo", "threshold": 0.01, "avg-threshold": 0.01 }, + { "name" : "Lolo", "link": "https://lottiefiles.com/109272-lolo-new-branding", "threshold": 0.08, "avg-threshold": 0.04 } + ], + "lottiegen-tests": [ + ] +} \ No newline at end of file diff --git a/LottieTest/Tests/delete_frames.py b/LottieTest/Tests/delete_frames.py new file mode 100644 index 00000000..74f091e9 --- /dev/null +++ b/LottieTest/Tests/delete_frames.py @@ -0,0 +1,26 @@ +import os, shutil, re + +root = "." + +keep_each_kth_frame = 5 + +for directory in os.listdir("."): + directory = os.path.join(root, directory) + if not os.path.isdir(directory): + continue + for inner_directory in os.listdir(directory): + if inner_directory != 'FramesAll': + continue + original_directory = os.path.join(directory, inner_directory) + if not os.path.isdir(original_directory): + continue + + target_directory = os.path.join(directory, 'Frames') + + shutil.rmtree(target_directory) + os.makedirs(target_directory) + + frames = list(filter(lambda x: re.match(r'frame\d+.png', x), os.listdir(original_directory)))[1::keep_each_kth_frame] + + for frame in frames: + shutil.copyfile(os.path.join(original_directory, frame), os.path.join(target_directory, frame)) diff --git a/LottieTest/src/CanvasBitmapDiff.cs b/LottieTest/src/CanvasBitmapDiff.cs new file mode 100644 index 00000000..e17573a4 --- /dev/null +++ b/LottieTest/src/CanvasBitmapDiff.cs @@ -0,0 +1,140 @@ +using Microsoft.Graphics.Canvas; +using Microsoft.UI; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.UI; + +namespace LottieTest +{ + internal class CanvasBitmapDiff + { + private Color[] diff; + private float diffAccumulated; + private float diffMax; + private int width; + private int height; + + private CanvasBitmap first; + private CanvasBitmap second; + + private static Color ColorDiff(Color p, Color q) + { + byte r = (byte)Math.Abs(p.R - q.R); + byte g = (byte)Math.Abs(p.G - q.G); + byte b = (byte)Math.Abs(p.B - q.B); + return Color.FromArgb(255, r, g, b); + } + + public CanvasBitmapDiff(CanvasBitmap a, CanvasBitmap b) + { + first = a; + second = b; + + Color[] aColors = a.GetPixelColors(); + Color[] bColors = b.GetPixelColors(); + diff = new Color[aColors.Length]; + + diffAccumulated = 0; + diffMax = 0; + + for (int i = 0; i < diff.Length; i++) + { + diff[i] = ColorDiff(aColors[i], bColors[i]); + + diffAccumulated += diff[i].R; + diffAccumulated += diff[i].G; + diffAccumulated += diff[i].B; + + diffMax = Math.Max(diffMax, diff[i].R); + diffMax = Math.Max(diffMax, diff[i].G); + diffMax = Math.Max(diffMax, diff[i].B); + } + + width = (int)a.SizeInPixels.Width; + height = (int)a.SizeInPixels.Height; + } + + public float Average => diffAccumulated / diff.Length; + + public float Max => diffMax; + + public int GetNumberOfDifferentPixels(float maxDifference = 128) + { + int res = 0; + + for (int i = 0; i < diff.Length; i++) + { + float pixelDiff = (float)Math.Sqrt(diff[i].R * diff[i].R + diff[i].G * diff[i].G + diff[i].B * diff[i].B); + if (pixelDiff > maxDifference) + { + res++; + } + } + + return res; + } + + public int GetNumberOfBackgroundPixels() + { + int res = 0; + + var colors = first.GetPixelColors(); + var colorsB = second.GetPixelColors(); + Color background = colors[0]; + + for (int i = 0; i < colors.Length; i++) + { + var c = ColorDiff(background, colors[i]); + var cb = ColorDiff(background, colors[i]); + if ((float)Math.Sqrt(c.R * c.R + c.G * c.G + c.B * c.B) < 4.0f && (float)Math.Sqrt(cb.R * cb.R + cb.G * cb.G + cb.B * cb.B) < 4.0f) + { + res++; + } + } + + return res; + } + + public int GetNumberOfForegroundPixels() + { + return GetNumberOfPixels() - GetNumberOfBackgroundPixels(); + } + + public int GetNumberOfPixels() + { + return diff.Length; + } + + public CanvasBitmap GetDiffCanvas() + { + return CanvasBitmap.CreateFromColors(CanvasDevice.GetSharedDevice(), diff, width, height); + } + + public CanvasBitmap GetDiffCanvasExaggerated(float maxDifference = 128) + { + Color[] color = new Color[diff.Length]; + + for (int i = 0; i < diff.Length; i++) + { + float pixelDiff = (float)Math.Sqrt(diff[i].R * diff[i].R + diff[i].G * diff[i].G + diff[i].B * diff[i].B); + color[i] = (pixelDiff > maxDifference ? Colors.Pink : Colors.Black); + } + + return CanvasBitmap.CreateFromColors(CanvasDevice.GetSharedDevice(), color, width, height); + + } + + public CanvasBitmap GetFirstCanvas() + { + return first; + } + + public CanvasBitmap GetSecondCanvas() + { + return second; + } + } +} diff --git a/LottieTest/src/Comparators/LottieToGifComparator.cs b/LottieTest/src/Comparators/LottieToGifComparator.cs new file mode 100644 index 00000000..dfeede4b --- /dev/null +++ b/LottieTest/src/Comparators/LottieToGifComparator.cs @@ -0,0 +1,61 @@ +using Microsoft.Graphics.Canvas; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using LottieTest.Readers; +using Windows.Graphics; +using Windows.Media.Devices; +using Windows.Storage; + +namespace LottieTest.Comparators +{ + + static internal class LottieToGifComparator + { + private static IEnumerable FramesToCapture(int framesNumber, int samples) + { + for (int i = 0; i < framesNumber - 1; i += Math.Max(1, (framesNumber - 1) / (samples - 1))) + yield return i; + } + + private static IEnumerable ProgressToCapture(int framesNumber, int samples) + { + foreach (int frameIndex in FramesToCapture(framesNumber, samples)) + yield return (frameIndex) / (float)(framesNumber); + } + + public static async IAsyncEnumerable<(TFirst, TSecond)> Zip(this IAsyncEnumerable first, IAsyncEnumerable second) + { + await using var e1 = first.GetAsyncEnumerator(); + await using var e2 = second.GetAsyncEnumerator(); + + while (true) + { + var t1 = e1.MoveNextAsync().AsTask(); + var t2 = e2.MoveNextAsync().AsTask(); + await Task.WhenAll(t1, t2); + + if (!t1.Result || !t2.Result) + yield break; + + yield return (e1.Current, e2.Current); + } + } + + public static async IAsyncEnumerable Compare(StorageFile lottieFile, StorageFile gifFile, int samples = 10) + { + int numberOfFrames = await GifReader.ReadNumberOfFrames(gifFile); + var frameSize = await GifReader.ReadFrameSize(gifFile); + + var gifFrames = GifReader.ReadFrames(gifFile, FramesToCapture(numberOfFrames, samples)); + var lottieFrames = LottieReader.ReadFrames(lottieFile, ProgressToCapture(numberOfFrames, samples), frameSize); + + await foreach (var (gifFrame, lottieFrame) in Zip(gifFrames, lottieFrames)) + { + yield return new CanvasBitmapDiff(gifFrame, lottieFrame); + } + } + } +} diff --git a/LottieTest/src/Comparators/LottieToImageSeqenceComparator.cs b/LottieTest/src/Comparators/LottieToImageSeqenceComparator.cs new file mode 100644 index 00000000..6b286514 --- /dev/null +++ b/LottieTest/src/Comparators/LottieToImageSeqenceComparator.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using LottieTest.Readers; +using Windows.Storage; + +namespace LottieTest.Comparators +{ + static internal class LottieToImageSeqenceComparator + { + + private static IEnumerable ProgressToCapture(IEnumerable frames, int framesNumber) + { + foreach (int frameIndex in frames) + yield return ((float)frameIndex) / (float)(framesNumber); + } + + public static async IAsyncEnumerable<(TFirst, TSecond)> Zip(this IAsyncEnumerable first, IAsyncEnumerable second) + { + await using var e1 = first.GetAsyncEnumerator(); + await using var e2 = second.GetAsyncEnumerator(); + + while (true) + { + var t1 = e1.MoveNextAsync().AsTask(); + var t2 = e2.MoveNextAsync().AsTask(); + await Task.WhenAll(t1, t2); + + if (!t1.Result || !t2.Result) + yield break; + + yield return (e1.Current, e2.Current); + } + } + public static async IAsyncEnumerable Compare(StorageFile lottieFile, StorageFolder sequenceFolder, int numberOfFrames) + { + var frameSize = await ImageSequenceReader.ReadFrameSize(sequenceFolder); + + var frames = await ImageSequenceReader.ReadFrameIndices(sequenceFolder); + var gifFrames = ImageSequenceReader.ReadFrames(sequenceFolder, frames); + var lottieFrames = LottieReader.ReadFrames(lottieFile, ProgressToCapture(frames, numberOfFrames), frameSize); + + await foreach (var (gifFrame, lottieFrame) in Zip(gifFrames, lottieFrames)) + { + yield return new CanvasBitmapDiff(gifFrame, lottieFrame); + } + } + } +} diff --git a/LottieTest/src/Comparators/LottieToLottieGenComparator.cs b/LottieTest/src/Comparators/LottieToLottieGenComparator.cs new file mode 100644 index 00000000..0327be46 --- /dev/null +++ b/LottieTest/src/Comparators/LottieToLottieGenComparator.cs @@ -0,0 +1,59 @@ +using Microsoft.Graphics.Canvas; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using LottieTest.Readers; +using Windows.Graphics; +using Windows.Media.Devices; +using Windows.Storage; +using CommunityToolkit.WinUI.Lottie.LottieGen; + +namespace LottieTest.Comparators +{ + + static internal class LottieToLottieGenComparator + { + private static IEnumerable ProgressToCapture(int samples) + { + for (int i = 0; i < samples; i++) + yield return i / (float)(samples); + } + + public static async IAsyncEnumerable<(TFirst, TSecond)> Zip(this IAsyncEnumerable first, IAsyncEnumerable second) + { + await using var e1 = first.GetAsyncEnumerator(); + await using var e2 = second.GetAsyncEnumerator(); + + while (true) + { + var t1 = e1.MoveNextAsync().AsTask(); + var t2 = e2.MoveNextAsync().AsTask(); + await Task.WhenAll(t1, t2); + + if (!t1.Result || !t2.Result) + yield break; + + yield return (e1.Current, e2.Current); + } + } + + public static async IAsyncEnumerable Compare(StorageFile lottieFile, string folder, int samples = 10) + { + var options = CommandLineOptions.ParseCommandLine(new string[] { "-Language", "cs", "-MinimumUapVersion", "13", "-WinUIVersion", "2.7" }); + var reporter = new Reporter(TextWriter.Null, TextWriter.Null); + LottieJsonFileProcessor.ProcessLottieJsonFile(options, reporter, lottieFile.Path, lottieFile.Path, "CodeGen", File.OpenRead(lottieFile.Path), folder, DateTime.Now); + + var code = await StorageFile.GetFileFromPathAsync($@"{folder}CodeGen.cs"); + + var lottieFrames = LottieReader.ReadFrames(lottieFile, ProgressToCapture(samples), new SizeInt32 { Width = 512, Height = 512 }); + var lottieFrames2 = LottieReader.ReadFramesFromCode(code, ProgressToCapture(samples), new SizeInt32 { Width = 512, Height = 512 }); + + await foreach (var (lottieFrame, lottieFrame2) in Zip(lottieFrames, lottieFrames2)) + { + yield return new CanvasBitmapDiff(lottieFrame, lottieFrame2); + } + } + } +} diff --git a/LottieTest/src/LottieTest.cs b/LottieTest/src/LottieTest.cs new file mode 100644 index 00000000..53251eda --- /dev/null +++ b/LottieTest/src/LottieTest.cs @@ -0,0 +1,248 @@ +using Microsoft.Graphics.Canvas; +using Microsoft.Graphics.Canvas.UI.Composition; +using Microsoft.Graphics.DirectX; +using Microsoft.UI.Composition; +using Microsoft.UI.Dispatching; +using Microsoft.Windows.ApplicationModel.DynamicDependency; +using System.Numerics; +using System.Runtime.InteropServices; +using Windows.Graphics; +using Windows.UI; +using Windows.Win32.Foundation; +using Windows.Win32.UI.WindowsAndMessaging; +using Windows.Win32.System.WinRT.Direct3D11; +using Windows.Win32.Graphics.Direct3D11; +using WinRT; +using static Windows.Win32.PInvoke; +using System.Runtime.CompilerServices; +using Windows.Storage; +using LottieTest.Comparators; +using System.Text.Json; +using System.Text.Json.Nodes; +using System.Diagnostics; +using System.Net; + +namespace LottieTest +{ + internal class LottieTest + { + static string TEST_FILES_FOLDER = @"D:\LottieDev\Lottie-Windows\LottieTest\Tests\"; + + static async Task Main(string[] args) + { + Bootstrap.Initialize(0x00010000); + await RunTests(); + Bootstrap.Shutdown(); + } + + static async Task RunTests() + { + var workDirectory = @"D:\LottieDev\Lottie-Windows\LottieTest\Tests\"; + var testPlanFile = await StorageFile.GetFileFromPathAsync($"{workDirectory}TestPlan.json"); + var testPlanJson = JsonNode.Parse(new StreamReader((await testPlanFile.OpenReadAsync()).AsStreamForRead()).ReadToEnd())!; + + bool allPassed = true; + allPassed &= await RunImageSequenceTests(testPlanJson["image-sequence-tests"]!.AsArray()); + allPassed &= await RunLottieFilesGifTests(testPlanJson["lottifiles-gif-tests"]!.AsArray()); + //allPassed &= await RunLottieGenTests(testPlanJson["image-sequence-tests"]!.AsArray()); + return allPassed; + } + + static async Task RunImageSequenceTests(JsonArray tests) + { + Console.ForegroundColor = ConsoleColor.Yellow; + Console.WriteLine("======================================================="); + Console.WriteLine("= After Effects image sequence against Lottie-Windows ="); + Console.WriteLine("======================================================="); + + bool allPassed = true; + foreach (var test in tests) + { + var name = test!["name"]!.AsValue().GetValue(); + var threshold = test!["threshold"]!.AsValue().GetValue(); + var avgThreshold = test!["avg-threshold"]!.AsValue().GetValue(); + allPassed &= await RunImageToSequenceTest(name, threshold, avgThreshold); + } + return allPassed; + } + + static async Task RunLottieFilesGifTests(JsonArray tests) + { + Console.ForegroundColor = ConsoleColor.Yellow; + Console.WriteLine("======================================================="); + Console.WriteLine("= LottieFiles gifs against Lottie-Windows ="); + Console.WriteLine("======================================================="); + + bool allPassed = true; + foreach (var test in tests) + { + var name = test!["name"]!.AsValue().GetValue(); + var link = test!["link"]!.AsValue().GetValue(); + var threshold = test!["threshold"]!.AsValue().GetValue(); + var avgThreshold = test!["avg-threshold"]!.AsValue().GetValue(); + allPassed &= await RunLottieFilesGifTest(name, link, threshold, avgThreshold); + } + return allPassed; + } + + static async Task RunLottieGenTests(JsonArray tests) + { + Console.ForegroundColor = ConsoleColor.Yellow; + Console.WriteLine("======================================================="); + Console.WriteLine("= LottieGen against Lottie-Windows ="); + Console.WriteLine("======================================================="); + + bool allPassed = true; + foreach (var test in tests) + { + var name = test!["name"]!.AsValue().GetValue(); + var threshold = test!["threshold"]!.AsValue().GetValue(); + var avgThreshold = test!["avg-threshold"]!.AsValue().GetValue(); + allPassed &= await RunLottieGenTest(name, threshold, avgThreshold); + } + return allPassed; + } + + static async Task RunImageToSequenceTest(string name, float threshold, float avgThreshold) + { + Console.ForegroundColor = ConsoleColor.Blue; + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + string nameFormatted = String.Format("{0, -14}", name); + Console.WriteLine($"[Test Started][{nameFormatted}]"); + var test_folder = $@"{TEST_FILES_FOLDER}{name}\"; + + var sequenceFolder = await StorageFolder.GetFolderFromPathAsync($@"{test_folder}frames\"); + var lottieFile = await StorageFile.GetFileFromPathAsync($@"{test_folder}Lottie.json"); + var testFile = await StorageFile.GetFileFromPathAsync($@"{test_folder}Test.json"); + + var testJson = JsonNode.Parse(new StreamReader((await testFile.OpenReadAsync()).AsStreamForRead()).ReadToEnd())!; + + var results_folder = $@"{TEST_FILES_FOLDER}!Results\{name}\"; + + System.IO.Directory.CreateDirectory(results_folder); + + float maxScore = 0; + float averageScore = 0; + int i = 0; + + await foreach (var diffItem in LottieToImageSeqenceComparator.Compare(lottieFile, sequenceFolder, testJson["number-of-frames"]!.GetValue())) + { + /*await diffItem.GetDiffCanvasExaggerated(64).SaveAsync(results_folder + $@"diff-{i}.png"); + await diffItem.GetFirstCanvas().SaveAsync(results_folder + $@"f-{i}.png"); + await diffItem.GetSecondCanvas().SaveAsync(results_folder + $@"s-{i}.png");*/ + + await Task.Delay(1); + + float numerator = diffItem.GetNumberOfDifferentPixels(64); + float denumerator = diffItem.GetNumberOfForegroundPixels() + diffItem.GetNumberOfPixels() / 5; + float score = numerator / denumerator; + maxScore = (float)Math.Max(maxScore, score); + averageScore += score; + i++; + } + averageScore /= i; + + bool passed = maxScore < threshold && averageScore < avgThreshold; + + stopwatch.Stop(); + Console.ForegroundColor = (passed ? ConsoleColor.Green : ConsoleColor.Red); + Console.WriteLine($"[{(passed ? "Test Passed" : "Test Failed")} ][{nameFormatted}] Worst diff: {maxScore * 100:0.0}% | Avg diff: {averageScore * 100:0.0}% | {stopwatch.ElapsedMilliseconds / 1e3: 0.00}s"); + + return passed; + } + + static async Task RunLottieFilesGifTest(string name, string link, float threshold, float avgThreshold) + { + Console.ForegroundColor = ConsoleColor.Blue; + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + string nameFormatted = String.Format("{0, -14}", name); + Console.WriteLine($"[Test Started][{nameFormatted}]"); + + var test_folder = $@"{TEST_FILES_FOLDER}{name}\"; + + var gifFile = await StorageFile.GetFileFromPathAsync($@"{test_folder}Animation.gif"); + var lottieFile = await StorageFile.GetFileFromPathAsync($@"{test_folder}Lottie.json"); + + var results_folder = $@"{TEST_FILES_FOLDER}!Results\{name}\"; + + System.IO.Directory.CreateDirectory(results_folder); + + float maxScore = 0; + float averageScore = 0; + int i = 0; + + await foreach (var diffItem in LottieToGifComparator.Compare(lottieFile, gifFile, 30)) + { + /*await diffItem.GetDiffCanvasExaggerated(64).SaveAsync(results_folder + $@"diff-{i}.png"); + await diffItem.GetFirstCanvas().SaveAsync(results_folder + $@"f-{i}.png"); + await diffItem.GetSecondCanvas().SaveAsync(results_folder + $@"s-{i}.png");*/ + + await Task.Delay(1); + + float numerator = diffItem.GetNumberOfDifferentPixels(64); + float denumerator = diffItem.GetNumberOfForegroundPixels() + diffItem.GetNumberOfPixels() / 5; + float score = numerator / denumerator; + maxScore = (float)Math.Max(maxScore, score); + averageScore += score; + i++; + } + averageScore /= i; + + bool passed = maxScore < threshold && averageScore < avgThreshold; + + stopwatch.Stop(); + Console.ForegroundColor = (passed ? ConsoleColor.Green : ConsoleColor.Red); + Console.WriteLine($"[{(passed ? "Test Passed" : "Test Failed")} ][{nameFormatted}] Worst diff: {maxScore * 100:0.0}% | Avg diff: {averageScore * 100:0.0}% | {stopwatch.ElapsedMilliseconds / 1e3: 0.00}s"); + + return passed; + } + + static async Task RunLottieGenTest(string name, float threshold, float avgThreshold) + { + Console.ForegroundColor = ConsoleColor.Blue; + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + string nameFormatted = String.Format("{0, -14}", name); + Console.WriteLine($"[Test Started][{nameFormatted}]"); + + var test_folder = $@"{TEST_FILES_FOLDER}{name}\"; + + var lottieFile = await StorageFile.GetFileFromPathAsync($@"{test_folder}Lottie.json"); + + var results_folder = $@"{TEST_FILES_FOLDER}!Results\{name}\"; + + System.IO.Directory.CreateDirectory(results_folder); + + float maxScore = 0; + float averageScore = 0; + int i = 0; + + await foreach (var diffItem in LottieToLottieGenComparator.Compare(lottieFile, test_folder, 30)) + { + await diffItem.GetDiffCanvasExaggerated(64).SaveAsync(results_folder + $@"diff-{i}.png"); + await diffItem.GetFirstCanvas().SaveAsync(results_folder + $@"f-{i}.png"); + await diffItem.GetSecondCanvas().SaveAsync(results_folder + $@"s-{i}.png"); + + await Task.Delay(1); + + float numerator = diffItem.GetNumberOfDifferentPixels(64); + float denumerator = diffItem.GetNumberOfForegroundPixels() + diffItem.GetNumberOfPixels() / 5; + float score = numerator / denumerator; + maxScore = (float)Math.Max(maxScore, score); + averageScore += score; + i++; + } + averageScore /= i; + + bool passed = maxScore < threshold && averageScore < avgThreshold; + + stopwatch.Stop(); + Console.ForegroundColor = (passed ? ConsoleColor.Green : ConsoleColor.Red); + Console.WriteLine($"[{(passed ? "Test Passed" : "Test Failed")} ][{nameFormatted}] Worst diff: {maxScore * 100:0.0}% | Avg diff: {averageScore * 100:0.0}% | {stopwatch.ElapsedMilliseconds / 1e3: 0.00}s"); + + return passed; + } + } +} \ No newline at end of file diff --git a/LottieTest/src/Readers/GifReader.cs b/LottieTest/src/Readers/GifReader.cs new file mode 100644 index 00000000..ae6aa3ca --- /dev/null +++ b/LottieTest/src/Readers/GifReader.cs @@ -0,0 +1,119 @@ +using Microsoft.Graphics.Canvas; +using Microsoft.UI.Xaml; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.Graphics; +using Windows.Graphics.DirectX; +using Windows.Graphics.Imaging; +using Windows.Storage; +using Windows.UI.Input.Inking; + +namespace LottieTest.Readers +{ + static internal class GifReader + { + public static async IAsyncEnumerable ReadFrames(StorageFile file, IEnumerable frameIndices) + { + CanvasDevice _canvasDevice = CanvasDevice.GetSharedDevice(); + + using (var stream = await file.OpenReadAsync()) + { + var decoder = await BitmapDecoder.CreateAsync(BitmapDecoder.GifDecoderId, stream); + var width = decoder.PixelWidth; + var height = decoder.PixelHeight; + + var numFrames = decoder.FrameCount; + + var j = 0; + var bytes = new byte[width * height * 4]; + for (int i = 0; i < bytes.Length; i++) bytes[i] = 255; + foreach (int i in frameIndices) + { + while (j < i) + { + await DecodeBitmapFrameAsync(width, height, await decoder.GetFrameAsync((uint)j++), bytes); + } + await DecodeBitmapFrameAsync(width, height, await decoder.GetFrameAsync((uint)i), bytes); + yield return CanvasBitmap.CreateFromBytes(_canvasDevice, bytes, (int)width, (int)height, DirectXPixelFormat.B8G8R8A8UIntNormalized); + } + } + } + + private static async Task DecodeBitmapFrameAsync(uint width, uint height, BitmapFrame frame, byte[] bytes) + { + var properties = await frame.BitmapProperties.GetPropertiesAsync(new string[] + { + "/imgdesc/Left", + "/imgdesc/Top", + }); + + var frameLeft = (ushort)properties["/imgdesc/Left"].Value; + var frameTop = (ushort)properties["/imgdesc/Top"].Value; + + + var frameWidth = frame.PixelWidth; + var frameHeight = frame.PixelHeight; + var pixels = await frame.GetPixelDataAsync(); + var new_bytes = pixels.DetachPixelData(); + + var format = frame.BitmapPixelFormat; + switch (format) + { + case BitmapPixelFormat.Bgra8: + // Do nothing, it's in a format we like + break; + case BitmapPixelFormat.Rgba8: + // Swizzle the bits + for (var i = 0; i < new_bytes.Length; i += 4) + { + var r = new_bytes[i + 0]; + new_bytes[i + 0] = new_bytes[i + 2]; + new_bytes[i + 2] = r; + } + break; + default: + throw new Exception($"Unknown pixel format ({format})!"); + } + + for (int i = 0; i < frameWidth; i++) + { + for (int j = 0; j < frameHeight; j++) + { + int x = i + frameLeft; + int y = j + frameTop; + int from = j * (int)frameWidth + i; + int to = y * (int)width + x; + if (new_bytes[from * 4 + 3] == 255) + { + bytes[to * 4] = new_bytes[from * 4]; + bytes[to * 4 + 1] = new_bytes[from * 4 + 1]; + bytes[to * 4 + 2] = new_bytes[from * 4 + 2]; + } + } + } + } + + public static async Task ReadFrameSize(StorageFile file) + { + var frames = new List(); + using (var stream = await file.OpenReadAsync()) + { + var decoder = await BitmapDecoder.CreateAsync(BitmapDecoder.GifDecoderId, stream); + return new SizeInt32 { Width = (int)decoder.PixelWidth, Height = (int)decoder.PixelHeight }; + } + } + + public static async Task ReadNumberOfFrames(StorageFile file) + { + var frames = new List(); + using (var stream = await file.OpenReadAsync()) + { + var decoder = await BitmapDecoder.CreateAsync(BitmapDecoder.GifDecoderId, stream); + return (int)decoder.FrameCount; + } + } + } +} diff --git a/LottieTest/src/Readers/ImageSequenceReader.cs b/LottieTest/src/Readers/ImageSequenceReader.cs new file mode 100644 index 00000000..447c3246 --- /dev/null +++ b/LottieTest/src/Readers/ImageSequenceReader.cs @@ -0,0 +1,82 @@ +using Microsoft.Graphics.Canvas; +using Microsoft.UI.Xaml.Media.Imaging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Windows.Graphics; +using Windows.Storage; +using Windows.Storage.Streams; + +namespace LottieTest.Readers +{ + static internal class ImageSequenceReader + { + public static async IAsyncEnumerable ReadFrames(StorageFolder folder, IEnumerable frameIndices) + { + CanvasDevice _canvasDevice = CanvasDevice.GetSharedDevice(); + + int index = frameIndices.First(); + frameIndices = frameIndices.Skip(1); + + foreach (var file in await folder.GetFilesAsync()) + { + if (!CheckFileName(file) || index != GetFrameIndex(file)) + { + continue; + } + + if (frameIndices.Any()) + { + index = frameIndices.First(); + frameIndices = frameIndices.Skip(1); + } + + yield return await CanvasBitmap.LoadAsync(_canvasDevice, await file.OpenReadAsync()); + } + } + + public static async Task> ReadFrameIndices(StorageFolder folder) + { + var res = new List(); + foreach (var file in await folder.GetFilesAsync()) + { + if (!CheckFileName(file)) + { + continue; + } + + res.Add(GetFrameIndex(file)); + } + return res; + } + + public static async Task ReadFrameSize(StorageFolder folder) + { + CanvasDevice _canvasDevice = CanvasDevice.GetSharedDevice(); + + foreach (var file in await folder.GetFilesAsync()) + { + if (CheckFileName(file)) + { + var size = (await CanvasBitmap.LoadAsync(_canvasDevice, await file.OpenReadAsync())).SizeInPixels; + return new SizeInt32 { Width = (int)size.Width, Height = (int)size.Height }; + } + } + + return new SizeInt32 { Width = 512, Height = 512 }; + } + + private static bool CheckFileName(StorageFile file) + { + return Regex.Match(file.Name, @"frame\d+\.png").Success; + } + + private static int GetFrameIndex(StorageFile file) + { + return Int32.Parse(Regex.Match(file.Name, @"frame(\d+)\.png").Groups[1].Value); + } + } +} diff --git a/LottieTest/src/Readers/LottieReader.cs b/LottieTest/src/Readers/LottieReader.cs new file mode 100644 index 00000000..d43e6df3 --- /dev/null +++ b/LottieTest/src/Readers/LottieReader.cs @@ -0,0 +1,318 @@ +using Microsoft.Graphics.Canvas; +using Microsoft.UI.Xaml.Controls; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Windows.Foundation; +using Microsoft.Graphics; +using Microsoft.Graphics.DirectX; +using Windows.Storage; +using Microsoft.UI; +using Microsoft.UI.Composition; +using Microsoft.Graphics.Canvas.UI.Composition; +using MicrosoftToolkit.WinUI.Lottie; +using System.Runtime.InteropServices; +using Windows.Win32.Foundation; +using Windows.Win32.UI.WindowsAndMessaging; +using Windows.Win32.System.WinRT.Direct3D11; +using Windows.Win32.Graphics.Direct3D11; +using WinRT; +using System.Runtime.CompilerServices; +using Microsoft.UI.Dispatching; +using Microsoft.Windows.ApplicationModel.DynamicDependency; +using Windows.Graphics; +using Windows.UI; +using static Windows.Win32.PInvoke; +using Windows.ApplicationModel.UserDataTasks; + +using System.Reflection; + +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.Emit; + +namespace LottieTest.Readers +{ + static internal class LottieReader + { + + public static async IAsyncEnumerable ReadFrames(StorageFile file, IEnumerable progressValues, SizeInt32 size) + { + var frames = new List(); + + var source = new LottieVisualSourceDetached(); + + await source.SetSourceAsync(file); + + capture.SetSource(source, size); + + foreach (var progress in progressValues) + { + yield return await capture.GetFrame(progress); + } + } + + public static async IAsyncEnumerable ReadFramesFromCode(StorageFile code, IEnumerable progressValue, SizeInt32 size) + { + // define source code, then parse it (to the type used for compilation) + SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(File.ReadAllText(code.Path)); + + // define other necessary objects for compilation + string assemblyName = Path.GetRandomFileName(); + MetadataReference[] references = new MetadataReference[] + { + MetadataReference.CreateFromFile(typeof(object).Assembly.Location), + MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location), + MetadataReference.CreateFromFile(typeof(Compositor).Assembly.Location), + MetadataReference.CreateFromFile(typeof(Canvas).Assembly.Location), + MetadataReference.CreateFromFile(typeof(CompositionAnimation).Assembly.Location), + }; + + // analyse and generate IL code from syntax tree + CSharpCompilation compilation = CSharpCompilation.Create( + assemblyName, + syntaxTrees: new[] { syntaxTree }, + references: references, + options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); + + using (var ms = new MemoryStream()) + { + // write IL code into memory + EmitResult result = compilation.Emit(ms); + + if (!result.Success) + { + // handle exceptions + IEnumerable failures = result.Diagnostics.Where(diagnostic => + diagnostic.IsWarningAsError || + diagnostic.Severity == DiagnosticSeverity.Error); + + foreach (Diagnostic diagnostic in failures) + { + Console.Error.WriteLine("{0}: {1}", diagnostic.Id, diagnostic.GetMessage()); + } + } + else + { + // load this 'virtual' DLL so that we can use + ms.Seek(0, SeekOrigin.Begin); + Assembly assembly = Assembly.Load(ms.ToArray()); + + // create instance of the desired class and call the desired function + Type type = assembly.GetType("AnimatedVisuals.CodeGen")!; + object obj = Activator.CreateInstance(type)!; + type.InvokeMember("TryCreateAnimatedVisual", + BindingFlags.Default | BindingFlags.InvokeMethod, + null, + obj, + new object[]{capture.compositor!, + new object()}); + } + } + + await foreach (var v in ReadFrames(code, progressValue, size)) + { + yield return v; + } + } + + // This interface allows us to copy the texture + [ComImport] + [Guid("D4B71A65-3052-4ABE-9183-E98DE02A41A9")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [ComVisible(true)] + interface ICompositionDrawingSurfaceInterop2 + { + unsafe void BeginDraw([Optional] RECT* updateRect, global::System.Guid* iid, [MarshalAs(UnmanagedType.IUnknown)] out object updateObject, POINT* updateOffset); + void EndDraw(); + void Resize(SIZE sizePixels); + unsafe void Scroll([Optional] RECT* scrollRect, [Optional] RECT* clipRect, int offsetX, int offsetY); + void ResumeDraw(); + void SuspendDraw(); + unsafe void CopySurface([MarshalAs(UnmanagedType.IUnknown)] object destinationResource, int destinationOffsetX, int destinationOffsetY, [Optional] RECT* sourceRectangle); + } + + static T GetDXGIInterfaceFromObject(object obj) + { + var access = obj.As(); + object? result = null; + unsafe + { + var guid = typeof(T).GUID; + var guidPointer = (Guid*)Unsafe.AsPointer(ref guid); + access.GetInterface(guidPointer, out result); + } + return result.As(); + } + + class VisualCapture : IDisposable + { + private LottieVisualSourceDetached? visualSource; + private SizeInt32 size = new SizeInt32 { Width = 512, Height = 512 }; + public Compositor? compositor; + private bool sourceChanged = false; + + public VisualCapture() + { + Task.Run(() => Loop()); + } + + void IDisposable.Dispose() + { + compositor?.Dispose(); + } + + Tuple? GetVisual() + { + if (visualSource is null || compositor is null) + { + return null; + } + + var av = visualSource.TryCreateAnimatedVisual(compositor, out object? diag); + + var visual = av!.RootVisual; + var sourceSize = av!.Size; + + visual.BorderMode = CompositionBorderMode.Soft; + + ContainerVisual v = compositor.CreateContainerVisual(); + { + v.Size = new System.Numerics.Vector2(size.Width, size.Height); + var geometry = compositor.CreateRectangleGeometry(); + geometry.Size = v.Size; + geometry.Offset = new Vector2(0, 0); + + var shape = CreateSpriteShape(compositor, geometry, new Matrix3x2(1F, 0F, 0F, 1F, 0F, 0F), compositor.CreateColorBrush(Windows.UI.Color.FromArgb(255, 255, 255, 255))); + + var shapeVisual = compositor.CreateShapeVisual(); + shapeVisual.Shapes.Add(shape); + shapeVisual.Size = v.Size; + + v.Children.InsertAtTop(shapeVisual); + v.Children.InsertAtTop(visual); + + float scale = Math.Min(size.Width / sourceSize.X, size.Height / sourceSize.Y); + + visual.TransformMatrix = Matrix4x4.CreateTranslation(-sourceSize.X / 2, -sourceSize.Y / 2, 0) * Matrix4x4.CreateScale(scale) * Matrix4x4.CreateTranslation(size.Width / 2, size.Height / 2, 0); + } + + return Tuple.Create(v as Visual, visual); + } + + void Loop() + { + var dispatcherQueueController = DispatcherQueueController.CreateOnCurrentThread(); + var device = new CanvasDevice(); + compositor = new Compositor(); + + var compGraphics = CanvasComposition.CreateCompositionGraphicsDevice(compositor, device); + + // We can't block the thread that created the Compositor, + // or else the AsyncOperation will never be completed. Ask + // the dispatcher to enqueue this work and then pump messages. + + + while (!sourceChanged) + { + Task.Delay(1).Wait(); + } + + var res = GetVisual()!; + Visual lottieVisual = res.Item1; + Visual topVisual = res.Item2; + var renderTarget = new CanvasRenderTarget(device, size.Width, size.Height, 96); + var resultTexture = GetDXGIInterfaceFromObject(renderTarget); + + while (true) + { + while (taskCompletion == null || sourceChanged) + { + if (sourceChanged) + { + res = GetVisual()!; + lottieVisual = res.Item1; + topVisual = res.Item2; + renderTarget = new CanvasRenderTarget(device, size.Width, size.Height, 96); + resultTexture = GetDXGIInterfaceFromObject(renderTarget); + sourceChanged = false; + } + + Task.Delay(1).Wait(); + } + + topVisual.Properties.InsertScalar("Progress", progress); + + ICompositionSurface? surface = null; + dispatcherQueueController.DispatcherQueue.TryEnqueue(async () => + { + await compositor.RequestCommitAsync(); + surface = await compGraphics.CaptureAsync( + lottieVisual, + size, + DirectXPixelFormat.B8G8R8A8UIntNormalized, + DirectXAlphaMode.Premultiplied, 1.0f); + }); + + // Pump messages until the async operation has completed. + var msg = new MSG(); + while (GetMessage(out msg, new HWND(0), 0, 0) && surface == null) + { + TranslateMessage(msg); + DispatchMessage(msg); + } + + // Now we need to copy the underlying texture from the surface. + var interop = surface.As(); + unsafe + { + interop.CopySurface(resultTexture, 0, 0, null); + } + + lock (mutex) + { + taskCompletion?.SetResult(CanvasBitmap.CreateFromColors(device!, renderTarget.GetPixelColors(), (int)size.Width, (int)size.Height)); + taskCompletion = null; + } + } + } + + private object mutex = new object(); + + private float progress = 0.0f; + private TaskCompletionSource? taskCompletion = null; + + + public async Task GetFrame(float progress) + { + lock (mutex) + { + this.progress = progress; + taskCompletion = new TaskCompletionSource(); + } + return await taskCompletion.Task; + } + + public void SetSource(LottieVisualSourceDetached visualSource, SizeInt32 size) + { + this.visualSource = visualSource; + this.size = size; + this.sourceChanged = true; + } + } + + static VisualCapture capture = new VisualCapture(); + + static CompositionSpriteShape CreateSpriteShape(Compositor _c, CompositionGeometry geometry, Matrix3x2 transformMatrix, CompositionBrush fillBrush) + { + var result = _c.CreateSpriteShape(geometry); + result.TransformMatrix = transformMatrix; + result.FillBrush = fillBrush; + return result; + } + } +} diff --git a/dlls/LottieGen/LottieGen.dll.csproj b/dlls/LottieGen/LottieGen.dll.csproj new file mode 100644 index 00000000..92f61685 --- /dev/null +++ b/dlls/LottieGen/LottieGen.dll.csproj @@ -0,0 +1,27 @@ + + + + netcoreapp3.1 + Debug;Release + latest + PUBLIC_LottieGen + + + + + + + + + + + + + + + + + + + + diff --git a/source/DotLottie/DotLottieFile.cs b/source/DotLottie/DotLottieFile.cs index 78547193..0072a929 100644 --- a/source/DotLottie/DotLottieFile.cs +++ b/source/DotLottie/DotLottieFile.cs @@ -18,6 +18,9 @@ namespace CommunityToolkit.WinUI.Lottie.DotLottie /// Provides access to the contents of a .lottie file. /// See https://dotlottie.io. /// +#if PUBLIC_DotLottie + public +#endif sealed class DotLottieFile : IDisposable { readonly Manifest _manifest; diff --git a/source/DotLottie/DotLottieFileAnimation.cs b/source/DotLottie/DotLottieFileAnimation.cs index 5cb7a9a4..84d2a129 100644 --- a/source/DotLottie/DotLottieFileAnimation.cs +++ b/source/DotLottie/DotLottieFileAnimation.cs @@ -12,6 +12,9 @@ namespace CommunityToolkit.WinUI.Lottie.DotLottie /// Describes an animation in a .lottie file. Animations /// are Lottie .json files. /// +#if PUBLIC_DotLottie + public +#endif sealed class DotLottieFileAnimation { readonly DotLottieFile _owner; diff --git a/source/DotLottie/InvalidLottieFileException.cs b/source/DotLottie/InvalidLottieFileException.cs index ebc76f99..9a05b7f6 100644 --- a/source/DotLottie/InvalidLottieFileException.cs +++ b/source/DotLottie/InvalidLottieFileException.cs @@ -8,6 +8,9 @@ namespace CommunityToolkit.WinUI.Lottie.DotLottie { +#if PUBLIC_DotLottie + public +#endif sealed class InvalidLottieFileException : Exception { } diff --git a/source/Lottie/Lottie.projitems b/source/Lottie/Lottie.projitems index 3dab6596..6a9bbe26 100644 --- a/source/Lottie/Lottie.projitems +++ b/source/Lottie/Lottie.projitems @@ -17,6 +17,7 @@ + diff --git a/source/Lottie/LottieVisualSourceDetached.cs b/source/Lottie/LottieVisualSourceDetached.cs new file mode 100644 index 00000000..7c48e928 --- /dev/null +++ b/source/Lottie/LottieVisualSourceDetached.cs @@ -0,0 +1,202 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#nullable enable + +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices.WindowsRuntime; +using System.Threading.Tasks; +using CommunityToolkit.WinUI.Lottie; +using Microsoft.UI.Xaml.Controls; +using Windows.Foundation; +using Windows.Foundation.Metadata; +using Windows.Storage; +using Windows.Storage.Streams; + +#if WINAPPSDK +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +#else +using Windows.UI.Composition; +using Windows.UI.Xaml; +#endif + +#if WINAPPSDK +namespace MicrosoftToolkit.WinUI.Lottie +#else +namespace Microsoft.Toolkit.Uwp.UI.Lottie +#endif +{ + /// + /// An for a Lottie composition. + /// Does not inherit DependencyObject so you can use it in console applications. + /// + public sealed class LottieVisualSourceDetached : IAnimatedVisualSource + { + int _loadVersion; + Uri? _uriSource; + AnimatedVisualFactory? _animatedVisualFactory; + ImageAssetHandler? _imageAssetHandler; + + /// + /// Initializes a new instance of the class. + /// + public LottieVisualSourceDetached() + { + } + + /// + /// Gets or sets options for how the Lottie is loaded. + /// + public LottieVisualOptions Options { get; set; } + + /// + /// Gets or sets the Uniform Resource Identifier (URI) of the JSON source file for this . + /// + public Uri? UriSource + { + get => _uriSource; + set { _uriSource = value; } + } + + /// + /// Called by XAML to convert a string to an . + /// + /// The for the given url. + public static LottieVisualSourceDetached? CreateFromString(string uri) + { + var uriUri = Uris.StringToUri(uri); + if (uriUri is null) + { + return null; + } + + return new LottieVisualSourceDetached { UriSource = uriUri }; + } + + /// + /// Sets the source for the . + /// + /// A stream containing the text of a JSON Lottie file encoded as UTF-8. + /// An that completes when the load completes or fails. + [Overload("SetSourceStreamAsync")] + public IAsyncAction SetSourceAsync(IInputStream stream) + { + _uriSource = null; + return LoadAsync(InputStreamLoader.LoadAsync(_imageAssetHandler, stream, Options)).AsAsyncAction(); + } + + /// + /// Sets the source for the . + /// + /// A file that is a JSON Lottie file. + /// An that completes when the load completes or fails. + [Overload("SetSourceFileAsync")] + public IAsyncAction SetSourceAsync(StorageFile file) + { + _uriSource = null; + return LoadAsync(StorageFileLoader.LoadAsync(_imageAssetHandler, file, Options)).AsAsyncAction(); + } + + /// + /// Sets the source for the . + /// + /// A URI that refers to a JSON Lottie file. + /// An that completes when the load completes or fails. + [DefaultOverload] + [Overload("SetSourceUriAsync")] + public IAsyncAction SetSourceAsync(Uri sourceUri) + { + _uriSource = sourceUri; + + // Update the dependency property to keep it in sync with _uriSource. + // This will not trigger loading because it will be seen as no change + // from the current (just set) _uriSource value. + UriSource = sourceUri; + + return LoadAsync(UriLoader.LoadAsync(_imageAssetHandler, sourceUri, Options)).AsAsyncAction(); + } + + /// + /// Sets a delegate that returns an for the given image uri. + /// If this is null, no images will be loaded from references to external images. + /// + /// Most Lottie files do not reference external images, but those that do + /// will refer to the files via a uri. It is up to the user of + /// to manage the loading of the image, and return an for + /// that image. Alternatively the delegate may return null, and the image will not be + /// displayed. + public void SetImageAssetHandler(ImageAssetHandler? imageAssetHandler) + { + _imageAssetHandler = imageAssetHandler; + } + + /// + /// Implements . + /// + /// The that can be used as a factory for the resulting . + /// An optional object that may provide extra information about the result. + /// An . + // TODO: currently explicitly implemented interfaces are causing a problem with .NET Native. Make them implicit for now. + //bool IAnimatedVisualSource.TryCreateAnimatedVisual( + public IAnimatedVisual? TryCreateAnimatedVisual( + Compositor compositor, + out object? diagnostics) + { + if (_animatedVisualFactory is null) + { + // No content has been loaded yet. + // Return an IAnimatedVisual that produces nothing. + diagnostics = null; + return null; + } + else + { + // Some content was loaded. Ask the factory to produce an + // IAnimatedVisual. If it returns null, the player will treat it + // as an error. + return _animatedVisualFactory.TryCreateAnimatedVisual(compositor, out diagnostics); + } + } + + // Starts loading. Completes the returned task when the load completes or is replaced by another load. + async Task LoadAsync(Task loader) + { + var loadVersion = ++_loadVersion; + + var oldFactory = _animatedVisualFactory; + _animatedVisualFactory = null; + + // Disable the warning about the task possibly having being started in + // another context. There is no other context here. +#pragma warning disable VSTHRD003 + + // Wait for the loader to finish. + var factory = await loader; +#pragma warning restore VSTHRD003 + + if (loadVersion != _loadVersion) + { + // Another load request came in before this one completed. + return; + } + + if (factory is null) + { + // Load didn't produce anything. + return; + } + + // We are the the most recent load. Save the result. + _animatedVisualFactory = factory; + + if (!factory.CanInstantiate) + { + // The load did not produce any content. Throw an exception so the caller knows. + throw new ArgumentException("Failed to load animated visual."); + } + } + } +} \ No newline at end of file diff --git a/source/LottieGen/CommandLineOptions.cs b/source/LottieGen/CommandLineOptions.cs index 125efc44..46fa10af 100644 --- a/source/LottieGen/CommandLineOptions.cs +++ b/source/LottieGen/CommandLineOptions.cs @@ -9,6 +9,9 @@ namespace CommunityToolkit.WinUI.Lottie.LottieGen { +#if PUBLIC_LottieGen + public +#endif sealed class CommandLineOptions { readonly List _additionalInterfaces = new List(); @@ -202,7 +205,7 @@ enum Keyword } // Returns the parsed command line. If ErrorDescription is non-null, then the parse failed. - internal static CommandLineOptions ParseCommandLine(string[] args) + public static CommandLineOptions ParseCommandLine(string[] args) { var result = new CommandLineOptions(); result.ParseCommandLineStrings(args); diff --git a/source/LottieGen/LottieJsonFileProcessor.cs b/source/LottieGen/LottieJsonFileProcessor.cs index 3d6db369..d83a02b5 100644 --- a/source/LottieGen/LottieJsonFileProcessor.cs +++ b/source/LottieGen/LottieJsonFileProcessor.cs @@ -24,6 +24,9 @@ namespace CommunityToolkit.WinUI.Lottie.LottieGen /// /// Processes a single Lottie .json file to produce various generated outputs. /// +#if PUBLIC_LottieGen + public +#endif sealed class LottieJsonFileProcessor { readonly CommandLineOptions _options; @@ -49,7 +52,7 @@ IReadOnlyList _translationResults IReadOnlyList<(TranslationIssue issue, UapVersionRange versionRange)> _translationIssues = Array.Empty<(TranslationIssue, UapVersionRange)>(); - LottieJsonFileProcessor( + public LottieJsonFileProcessor( CommandLineOptions options, Reporter reporter, string sourceFilePath, @@ -84,7 +87,7 @@ IReadOnlyList _translationResults /// Where the output should be written. /// A timestamp used to indicate when the processing took place. /// true if the processing succeeded. - internal static bool ProcessLottieJsonFile( + public static bool ProcessLottieJsonFile( CommandLineOptions options, Reporter reporter, string sourceFilePath, diff --git a/source/LottieGen/Reporter.cs b/source/LottieGen/Reporter.cs index 6b2a9b75..6e44697e 100644 --- a/source/LottieGen/Reporter.cs +++ b/source/LottieGen/Reporter.cs @@ -10,6 +10,9 @@ namespace CommunityToolkit.WinUI.Lottie.LottieGen { +#if PUBLIC_LottieGen + public +#endif sealed class Reporter { // Lock to protect method and object that do not support multi-threaded access. Note that the @@ -19,7 +22,7 @@ sealed class Reporter readonly Dictionary _dataTables = new Dictionary(StringComparer.OrdinalIgnoreCase); - internal Reporter(TextWriter infoStream, TextWriter errorStream) + public Reporter(TextWriter infoStream, TextWriter errorStream) { InfoStream = new Writer(infoStream); ErrorStream = new Writer(errorStream); diff --git a/source/LottieReader/Serialization/Animatables.cs b/source/LottieReader/Serialization/Animatables.cs index eadbbae6..c5f4d588 100644 --- a/source/LottieReader/Serialization/Animatables.cs +++ b/source/LottieReader/Serialization/Animatables.cs @@ -680,7 +680,15 @@ IEnumerable> ReadKeyFrames( var cp1s = cp1Json.Value.AsVector2Array(); var cp2s = cp2Json.Value.AsVector2Array(); var cubicBeziers = cp1s.Zip(cp2s, (cp1, cp2) => new CubicBezier(cp1, cp2)); - easing = new CubicBezierEasing(cubicBeziers); + + if (cubicBeziers.All(x => x.IsLinear)) + { + easing = LinearEasing.Instance; + } + else + { + easing = new CubicBezierEasing(cubicBeziers); + } } else { diff --git a/source/LottieReader/Serialization/LottieCompositionReader.cs b/source/LottieReader/Serialization/LottieCompositionReader.cs index 795692b4..786bba8b 100644 --- a/source/LottieReader/Serialization/LottieCompositionReader.cs +++ b/source/LottieReader/Serialization/LottieCompositionReader.cs @@ -22,7 +22,7 @@ namespace CommunityToolkit.WinUI.Lottie.LottieData.Serialization { // See: https://github.com/airbnb/lottie-web/tree/master/docs/json for the (usually out-of-date) schema. // See: https://helpx.adobe.com/pdf/after_effects_reference.pdf for the After Effects semantics. -#if PUBLIC +#if PUBLIC_LottieReader public #endif #pragma warning disable SA1205 // Partial elements should declare access diff --git a/source/LottieToWinComp/LottieToMultiVersionWinCompTranslator.cs b/source/LottieToWinComp/LottieToMultiVersionWinCompTranslator.cs index 83e3b86b..b2ec1f58 100644 --- a/source/LottieToWinComp/LottieToMultiVersionWinCompTranslator.cs +++ b/source/LottieToWinComp/LottieToMultiVersionWinCompTranslator.cs @@ -9,7 +9,7 @@ namespace CommunityToolkit.WinUI.Lottie.LottieToWinComp { -#if PUBLIC +#if PUBLIC_LottieToWinComp public #endif sealed class LottieToMultiVersionWinCompTranslator diff --git a/source/LottieToWinComp/MultiVersionTranslationResult.cs b/source/LottieToWinComp/MultiVersionTranslationResult.cs index 3cfef36e..92a07159 100644 --- a/source/LottieToWinComp/MultiVersionTranslationResult.cs +++ b/source/LottieToWinComp/MultiVersionTranslationResult.cs @@ -7,7 +7,7 @@ namespace CommunityToolkit.WinUI.Lottie.LottieToWinComp { -#if PUBLIC +#if PUBLIC_LottieToWinComp public #endif sealed class MultiVersionTranslationResult diff --git a/source/LottieToWinComp/Rectangles.cs b/source/LottieToWinComp/Rectangles.cs index 4d7a2c86..d6675dd5 100644 --- a/source/LottieToWinComp/Rectangles.cs +++ b/source/LottieToWinComp/Rectangles.cs @@ -428,11 +428,16 @@ static OriginOffsetContainer GetOriginOffsetContainer( in TrimmedAnimatable size, in TrimmedAnimatable position) { + if (geometry.IsRoundedRectangle) + { + return new OriginOffsetContainer(geometry, Sn.Vector2.Zero); + } + // Note: Current implementation of Windows Composition API behaves differently for Rounded Rectangle and regular Rectangle geometry. // In first case we need to offset the inner content (e.g. gradient) by position only, and in second case by position and half the size (total offset). return size.IsAnimated || position.IsAnimated ? - new OriginOffsetContainer(geometry, -(geometry.IsRoundedRectangle ? ExpressionFactory.GeometryPosition : ExpressionFactory.GeometryOffset)) : - new OriginOffsetContainer(geometry, -(geometry.IsRoundedRectangle ? ConvertTo.Vector2(position.InitialValue) : InitialOffset(size, position))); + new OriginOffsetContainer(geometry, -ExpressionFactory.GeometryOffset) : + new OriginOffsetContainer(geometry, -InitialOffset(size, position)); } static OriginOffsetContainer GetOriginOffsetContainerXY( @@ -441,11 +446,16 @@ static OriginOffsetContainer GetOriginOffsetContainerXY( in TrimmedAnimatable height, in TrimmedAnimatable position) { + if (geometry.IsRoundedRectangle) + { + return new OriginOffsetContainer(geometry, Sn.Vector2.Zero); + } + // Note: Current implementation of Windows Composition API behaves differently for Rounded Rectangle and regular Rectangle geometry. // In first case we need to offset the inner content (e.g. gradient) by position only, and in second case by position and half the size (total offset). return width.IsAnimated || height.IsAnimated || position.IsAnimated ? - new OriginOffsetContainer(geometry, -(geometry.IsRoundedRectangle ? ExpressionFactory.GeometryPosition : ExpressionFactory.GeometryOffset)) : - new OriginOffsetContainer(geometry, -(geometry.IsRoundedRectangle ? ConvertTo.Vector2(position.InitialValue) : InitialOffset(width, height, position))); + new OriginOffsetContainer(geometry, -ExpressionFactory.GeometryOffset) : + new OriginOffsetContainer(geometry, -InitialOffset(width, height, position)); } public static CanvasGeometry CreateWin2dRectangleGeometry( diff --git a/source/LottieToWinComp/TranslationIssue.cs b/source/LottieToWinComp/TranslationIssue.cs index 524364c1..567ea579 100644 --- a/source/LottieToWinComp/TranslationIssue.cs +++ b/source/LottieToWinComp/TranslationIssue.cs @@ -11,7 +11,7 @@ namespace CommunityToolkit.WinUI.Lottie.LottieToWinComp /// The gives more detail about the particular /// instance of the issue. /// -#if PUBLIC +#if PUBLIC_LottieToWinComp public #endif struct TranslationIssue diff --git a/source/LottieToWinComp/TranslationResult.cs b/source/LottieToWinComp/TranslationResult.cs index 042ea87a..457b0d51 100644 --- a/source/LottieToWinComp/TranslationResult.cs +++ b/source/LottieToWinComp/TranslationResult.cs @@ -14,7 +14,7 @@ namespace CommunityToolkit.WinUI.Lottie.LottieToWinComp /// /// The result of translating a Lottie animation into an equivalent WinCompData form. /// -#if PUBLIC +#if PUBLIC_LottieToWinComp public #endif sealed class TranslationResult @@ -52,7 +52,7 @@ internal TranslationResult( public uint MinimumRequiredUapVersion { get; } // Returns a TranslationResult with the same contents as this but a different root visual. - internal TranslationResult WithDifferentRoot(Visual rootVisual) + public TranslationResult WithDifferentRoot(Visual rootVisual) => new TranslationResult(rootVisual, TranslationIssues, MinimumRequiredUapVersion, SourceMetadata); } } diff --git a/source/LottieToWinComp/TranslatorConfiguration.cs b/source/LottieToWinComp/TranslatorConfiguration.cs index ca626803..77ee7fe1 100644 --- a/source/LottieToWinComp/TranslatorConfiguration.cs +++ b/source/LottieToWinComp/TranslatorConfiguration.cs @@ -7,6 +7,9 @@ namespace CommunityToolkit.WinUI.Lottie.LottieToWinComp /// /// Describes a configuration of the . /// +#if PUBLIC_LottieToWinComp + public +#endif struct TranslatorConfiguration { #pragma warning disable 0649 diff --git a/source/LottieToWinComp/UapVersionRange.cs b/source/LottieToWinComp/UapVersionRange.cs index ec3f8748..fa05e912 100644 --- a/source/LottieToWinComp/UapVersionRange.cs +++ b/source/LottieToWinComp/UapVersionRange.cs @@ -11,7 +11,7 @@ namespace CommunityToolkit.WinUI.Lottie.LottieToWinComp /// than or equal to the value. Both values being null /// indicates all versions. /// -#if PUBLIC +#if PUBLIC_LottieToWinComp public #endif struct UapVersionRange @@ -61,7 +61,7 @@ public override string ToString() // that we support up to End". If we didn't do that, then (minimumVersion, n) and (null, n) // would effectively mean the same thing but it would be confusing to express // it in 2 different ways. - internal void NormalizeForMinimumVersion(uint minimumVersion) + public void NormalizeForMinimumVersion(uint minimumVersion) { // A Start of minimumVersion is the same as all versions up to End. if (Start == minimumVersion && (End is null || End > minimumVersion)) diff --git a/source/UIDataCodeGen/Serialization/CompositionObjectDgmlSerializer.cs b/source/UIDataCodeGen/Serialization/CompositionObjectDgmlSerializer.cs index d57f924f..a90e0554 100644 --- a/source/UIDataCodeGen/Serialization/CompositionObjectDgmlSerializer.cs +++ b/source/UIDataCodeGen/Serialization/CompositionObjectDgmlSerializer.cs @@ -15,6 +15,9 @@ namespace CommunityToolkit.WinUI.Lottie.UIData.CodeGen /// /// Serializes a graph into DGML format. /// +#if PUBLIC_UIDataCodeGen + public +#endif sealed class CompositionObjectDgmlSerializer { // The categories of each node in the DGML graph. The category determines the appearance in the graph.