384b5832 by Michael Jones

Merge branch 'BF-11979' into 'master'

Bf 11979

See merge request !2
2 parents 3169a2e4 312f9bfe
...@@ -13,6 +13,7 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -13,6 +13,7 @@ along with this software (see the LICENSE.md file). If not, see
13 <http://creativecommons.org/publicdomain/zero/1.0/>. 13 <http://creativecommons.org/publicdomain/zero/1.0/>.
14 --> 14 -->
15 <entity-facade-xml type="seed"> 15 <entity-facade-xml type="seed">
16 <!-- ========= Screen Theme Resource for GrapesJs / mjml -->
16 <moqui.basic.Enumeration description="Mjml Theme Type" enumId="STT_MJML" enumTypeId="ScreenThemeType"/> 17 <moqui.basic.Enumeration description="Mjml Theme Type" enumId="STT_MJML" enumTypeId="ScreenThemeType"/>
17 <moqui.screen.ScreenTheme screenThemeId="MJML_DEFAULT" screenThemeTypeEnumId="STT_MJML" 18 <moqui.screen.ScreenTheme screenThemeId="MJML_DEFAULT" screenThemeTypeEnumId="STT_MJML"
18 description="Mjml Default Theme"/> 19 description="Mjml Default Theme"/>
...@@ -26,6 +27,7 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -26,6 +27,7 @@ along with this software (see the LICENSE.md file). If not, see
26 <moqui.screen.ScreenThemeResource screenThemeId="MJML_DEFAULT" sequenceNum="110" resourceTypeEnumId="STRT_HEADER_TITLE" 27 <moqui.screen.ScreenThemeResource screenThemeId="MJML_DEFAULT" sequenceNum="110" resourceTypeEnumId="STRT_HEADER_TITLE"
27 resourceValue="Email Editor"/> 28 resourceValue="Email Editor"/>
28 29
30 <!-- ========= DB Resource for storing project and template files -->
29 <moqui.resource.DbResource resourceId="GRAPESJS" filename="grapesjs" isFile="N"/> 31 <moqui.resource.DbResource resourceId="GRAPESJS" filename="grapesjs" isFile="N"/>
30 <moqui.resource.DbResource resourceId="GRAPESJS_PROJECT" filename="project" isFile="N" parentResourceId="GRAPESJS"/> 32 <moqui.resource.DbResource resourceId="GRAPESJS_PROJECT" filename="project" isFile="N" parentResourceId="GRAPESJS"/>
31 <moqui.resource.DbResource resourceId="GRAPESJS_TEMPLATE" filename="template" isFile="N" parentResourceId="GRAPESJS"/> 33 <moqui.resource.DbResource resourceId="GRAPESJS_TEMPLATE" filename="template" isFile="N" parentResourceId="GRAPESJS"/>
...@@ -35,4 +37,10 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -35,4 +37,10 @@ along with this software (see the LICENSE.md file). If not, see
35 <fileData><![CDATA[eyJhc3NldHMiOltdLCJzdHlsZXMiOlt7InNlbGVjdG9ycyI6W10sInNlbGVjdG9yc0FkZCI6IiNvdXRsb29rIGEiLCJzdHlsZSI6eyJwYWRkaW5nLXRvcCI6IjBweCIsInBhZGRpbmctcmlnaHQiOiIwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjBweCIsInBhZGRpbmctbGVmdCI6IjBweCJ9fSx7InNlbGVjdG9ycyI6W10sInNlbGVjdG9yc0FkZCI6ImJvZHkiLCJzdHlsZSI6eyJtYXJnaW4tdG9wIjoiMHB4IiwibWFyZ2luLXJpZ2h0IjoiMHB4IiwibWFyZ2luLWJvdHRvbSI6IjBweCIsIm1hcmdpbi1sZWZ0IjoiMHB4IiwicGFkZGluZy10b3AiOiIwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMHB4IiwicGFkZGluZy1ib3R0b20iOiIwcHgiLCJwYWRkaW5nLWxlZnQiOiIwcHgiLCJ0ZXh0LXNpemUtYWRqdXN0IjoiMTAwJSJ9fSx7InNlbGVjdG9ycyI6W10sInNlbGVjdG9yc0FkZCI6InRhYmxlLCB0ZCIsInN0eWxlIjp7ImJvcmRlci1jb2xsYXBzZSI6ImNvbGxhcHNlIn19LHsic2VsZWN0b3JzIjpbXSwic2VsZWN0b3JzQWRkIjoiaW1nIiwic3R5bGUiOnsiYm9yZGVyLXRvcC13aWR0aCI6IjBweCIsImJvcmRlci1yaWdodC13aWR0aCI6IjBweCIsImJvcmRlci1ib3R0b20td2lkdGgiOiIwcHgiLCJib3JkZXItbGVmdC13aWR0aCI6IjBweCIsImJvcmRlci10b3Atc3R5bGUiOiJpbml0aWFsIiwiYm9yZGVyLXJpZ2h0LXN0eWxlIjoiaW5pdGlhbCIsImJvcmRlci1ib3R0b20tc3R5bGUiOiJpbml0aWFsIiwiYm9yZGVyLWxlZnQtc3R5bGUiOiJpbml0aWFsIiwiYm9yZGVyLXRvcC1jb2xvciI6ImluaXRpYWwiLCJib3JkZXItcmlnaHQtY29sb3IiOiJpbml0aWFsIiwiYm9yZGVyLWJvdHRvbS1jb2xvciI6ImluaXRpYWwiLCJib3JkZXItbGVmdC1jb2xvciI6ImluaXRpYWwiLCJib3JkZXItaW1hZ2Utc291cmNlIjoiaW5pdGlhbCIsImJvcmRlci1pbWFnZS1zbGljZSI6ImluaXRpYWwiLCJib3JkZXItaW1hZ2Utd2lkdGgiOiJpbml0aWFsIiwiYm9yZGVyLWltYWdlLW91dHNldCI6ImluaXRpYWwiLCJib3JkZXItaW1hZ2UtcmVwZWF0IjoiaW5pdGlhbCIsImhlaWdodCI6ImF1dG8iLCJsaW5lLWhlaWdodCI6IjEwMCUiLCJvdXRsaW5lLWNvbG9yIjoiaW5pdGlhbCIsIm91dGxpbmUtc3R5bGUiOiJub25lIiwib3V0bGluZS13aWR0aCI6ImluaXRpYWwiLCJ0ZXh0LWRlY29yYXRpb24tbGluZSI6Im5vbmUiLCJ0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzIjoiaW5pdGlhbCIsInRleHQtZGVjb3JhdGlvbi1zdHlsZSI6ImluaXRpYWwiLCJ0ZXh0LWRlY29yYXRpb24tY29sb3IiOiJpbml0aWFsIn19LHsic2VsZWN0b3JzIjpbXSwic2VsZWN0b3JzQWRkIjoicCIsInN0eWxlIjp7ImRpc3BsYXkiOiJibG9jayIsIm1hcmdpbi10b3AiOiIxM3B4IiwibWFyZ2luLXJpZ2h0IjoiMHB4IiwibWFyZ2luLWJvdHRvbSI6IjEzcHgiLCJtYXJnaW4tbGVmdCI6IjBweCJ9fSx7InNlbGVjdG9ycyI6WyJtai1jb2x1bW4tcGVyLTEwMCJdLCJzdHlsZSI6eyJ3aWR0aCI6IjEwMCUgIWltcG9ydGFudCIsIm1heC13aWR0aCI6IjEwMCUifSwibWVkaWFUZXh0Ijoib25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDQ4MHB4KSIsImF0UnVsZVR5cGUiOiJtZWRpYSJ9LHsic2VsZWN0b3JzIjpbXSwic2VsZWN0b3JzQWRkIjoiLm1vei10ZXh0LWh0bWwgLm1qLWNvbHVtbi1wZXItMTAwIiwic3R5bGUiOnsid2lkdGgiOiIxMDAlICFpbXBvcnRhbnQiLCJtYXgtd2lkdGgiOiIxMDAlIn19LHsic2VsZWN0b3JzIjpbIm1qLWNvbHVtbi1wZXItNTAiXSwic3R5bGUiOnsid2lkdGgiOiI1MCUgIWltcG9ydGFudCIsIm1heC13aWR0aCI6IjUwJSJ9LCJtZWRpYVRleHQiOiJvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNDgwcHgpIiwiYXRSdWxlVHlwZSI6Im1lZGlhIn0seyJzZWxlY3RvcnMiOltdLCJzZWxlY3RvcnNBZGQiOiIubW96LXRleHQtaHRtbCAubWotY29sdW1uLXBlci01MCIsInN0eWxlIjp7IndpZHRoIjoiNTAlICFpbXBvcnRhbnQiLCJtYXgtd2lkdGgiOiI1MCUifX0seyJzZWxlY3RvcnMiOlsibWotY29sdW1uLXBlci0zMy0zMzMzMzMzMzMzMzMzMzYiXSwic3R5bGUiOnsid2lkdGgiOiIzMy4zMzMzJSAhaW1wb3J0YW50IiwibWF4LXdpZHRoIjoiMzMuMzMzMyUifSwibWVkaWFUZXh0Ijoib25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDQ4MHB4KSIsImF0UnVsZVR5cGUiOiJtZWRpYSJ9LHsic2VsZWN0b3JzIjpbXSwic2VsZWN0b3JzQWRkIjoiLm1vei10ZXh0LWh0bWwgLm1qLWNvbHVtbi1wZXItMzMtMzMzMzMzMzMzMzMzMzM2Iiwic3R5bGUiOnsid2lkdGgiOiIzMy4zMzMzJSAhaW1wb3J0YW50IiwibWF4LXdpZHRoIjoiMzMuMzMzMyUifX1dLCJwYWdlcyI6W3siZnJhbWVzIjpbeyJjb21wb25lbnQiOnsidHlwZSI6IndyYXBwZXIiLCJzdHlsYWJsZSI6WyJiYWNrZ3JvdW5kIiwiYmFja2dyb3VuZC1jb2xvciIsImJhY2tncm91bmQtaW1hZ2UiLCJiYWNrZ3JvdW5kLXJlcGVhdCIsImJhY2tncm91bmQtYXR0YWNobWVudCIsImJhY2tncm91bmQtcG9zaXRpb24iLCJiYWNrZ3JvdW5kLXNpemUiXSwiY29tcG9uZW50cyI6W3sidGFnTmFtZSI6Im1qbWwiLCJ0eXBlIjoibWptbCIsImNvbXBvbmVudHMiOlt7InRhZ05hbWUiOiJtai1oZWFkIiwidHlwZSI6Im1qLWhlYWQiLCJjb21wb25lbnRzIjpbeyJ0YWdOYW1lIjoibWotZm9udCIsInR5cGUiOiJtai1mb250Iiwic3R5bGUiOnsibmFtZSI6IkJhcmxvdyIsImhyZWYiOiJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9QmFybG93In0sImF0dHJpYnV0ZXMiOnsibmFtZSI6IkJhcmxvdyIsImhyZWYiOiJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9QmFybG93Iiwic3R5bGUiOiJuYW1lOkJhcmxvdztocmVmOmh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1CYXJsb3c7In19LHsidGFnTmFtZSI6Im1qLXN0eWxlIiwidHlwZSI6Im1qLXN0eWxlIiwiY29tcG9uZW50cyI6W3sidHlwZSI6InRleHRub2RlIiwiY29udGVudCI6IlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zbG9nYW4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICMwMDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgIn1dfV19LHsidGFnTmFtZSI6Im1qLWJvZHkiLCJ0eXBlIjoibWotYm9keSIsInN0eWxlIjp7IndpZHRoIjoiNjAwcHgifSwiYXR0cmlidXRlcyI6eyJ3aWR0aCI6IjYwMHB4Iiwic3R5bGUiOiJ3aWR0aDo2MDBweDsifSwiY29tcG9uZW50cyI6W3sidHlwZSI6ImNvbW1lbnQiLCJjb250ZW50IjoiIENvbXBhbnkgSGVhZGVyICJ9LHsidGFnTmFtZSI6Im1qLXNlY3Rpb24iLCJ0eXBlIjoibWotc2VjdGlvbiIsInN0eWxlIjp7ImJhY2tncm91bmQtY29sb3IiOiIjZjBmMGYwIiwicGFkZGluZy1sZWZ0IjoiMHB4IiwicGFkZGluZy1yaWdodCI6IjBweCIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInRleHQtYWxpZ24iOiJjZW50ZXIifSwiYXR0cmlidXRlcyI6eyJiYWNrZ3JvdW5kLWNvbG9yIjoiI2YwZjBmMCIsInBhZGRpbmctbGVmdCI6IjBweCIsInBhZGRpbmctcmlnaHQiOiIwcHgiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJ0ZXh0LWFsaWduIjoiY2VudGVyIiwic3R5bGUiOiJiYWNrZ3JvdW5kLWNvbG9yOiNmMGYwZjA7cGFkZGluZy1sZWZ0OjBweDtwYWRkaW5nLXJpZ2h0OjBweDtwYWRkaW5nLXRvcDoxMHB4O3BhZGRpbmctYm90dG9tOjEwcHg7dGV4dC1hbGlnbjpjZW50ZXI7In0sImNvbXBvbmVudHMiOlt7InRhZ05hbWUiOiJtai1jb2x1bW4iLCJ0eXBlIjoibWotY29sdW1uIiwic3R5bGUiOnsiYm9yZGVyIjoiMTBweCBzb2xpZCAjRjQ1RTQzIiwidmVydGljYWwtYWxpZ24iOiJ0b3AifSwiYXR0cmlidXRlcyI6eyJib3JkZXIiOiIxMHB4IHNvbGlkICNGNDVFNDMiLCJ2ZXJ0aWNhbC1hbGlnbiI6InRvcCIsInN0eWxlIjoiYm9yZGVyOjEwcHggc29saWQgI0Y0NUU0Mzt2ZXJ0aWNhbC1hbGlnbjp0b3A7In0sImNvbXBvbmVudHMiOlt7InRhZ05hbWUiOiJtai10ZXh0IiwidHlwZSI6Im1qLXRleHQiLCJzdHlsZSI6eyJmb250LWZhbWlseSI6IkJhcmxvdyIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInBhZGRpbmctcmlnaHQiOiIyNXB4IiwicGFkZGluZy1sZWZ0IjoiMjVweCIsImZvbnQtc2l6ZSI6IjEzcHgiLCJsaW5lLWhlaWdodCI6IjIycHgiLCJhbGlnbiI6ImxlZnQifSwiYXR0cmlidXRlcyI6eyJmb250LWZhbWlseSI6IkJhcmxvdyIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInBhZGRpbmctcmlnaHQiOiIyNXB4IiwicGFkZGluZy1sZWZ0IjoiMjVweCIsImZvbnQtc2l6ZSI6IjEzcHgiLCJsaW5lLWhlaWdodCI6IjIycHgiLCJhbGlnbiI6ImxlZnQiLCJzdHlsZSI6ImZvbnQtZmFtaWx5OkJhcmxvdztwYWRkaW5nLXRvcDoxMHB4O3BhZGRpbmctYm90dG9tOjEwcHg7cGFkZGluZy1yaWdodDoyNXB4O3BhZGRpbmctbGVmdDoyNXB4O2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjIycHg7YWxpZ246bGVmdDsifSwiY29tcG9uZW50cyI6W3sidHlwZSI6InRleHRub2RlIiwiY29udGVudCI6IkEgZmlyc3QgbGluZSBvZiB0ZXh0In1dfSx7InRhZ05hbWUiOiJtai1zcGFjZXIiLCJ0eXBlIjoibWotc3BhY2VyIiwic3R5bGUiOnsiaGVpZ2h0IjoiNTBweCJ9LCJhdHRyaWJ1dGVzIjp7ImhlaWdodCI6IjUwcHgiLCJzdHlsZSI6ImhlaWdodDo1MHB4OyJ9LCJjb21wb25lbnRzIjpbeyJ0eXBlIjoidGV4dG5vZGUiLCJjb250ZW50IjoiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1dfV19XX0seyJ0eXBlIjoiY29tbWVudCIsImNvbnRlbnQiOiIgSW1hZ2UgSGVhZGVyICJ9LHsidGFnTmFtZSI6Im1qLXNlY3Rpb24iLCJ0eXBlIjoibWotc2VjdGlvbiIsInN0eWxlIjp7ImJhY2tncm91bmQtdXJsIjoiaHR0cDovLzEuYnAuYmxvZ3Nwb3QuY29tLy1UUHJmaHhiWXBEWS9VaDNSZWZ6azAySS9BQUFBQUFBQUx3OC81c1VKMFVVR1l1dy9zMTYwMC9OZXcrWW9yaytpbitUaGUrMTk2MCdzKy0rNzAncysoMikuanBnIiwiYmFja2dyb3VuZC1zaXplIjoiY292ZXIiLCJiYWNrZ3JvdW5kLXJlcGVhdCI6Im5vLXJlcGVhdCIsInBhZGRpbmctbGVmdCI6IjBweCIsInBhZGRpbmctcmlnaHQiOiIwcHgiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJ0ZXh0LWFsaWduIjoiY2VudGVyIn0sImF0dHJpYnV0ZXMiOnsiYmFja2dyb3VuZC11cmwiOiJodHRwOi8vMS5icC5ibG9nc3BvdC5jb20vLVRQcmZoeGJZcERZL1VoM1JlZnprMDJJL0FBQUFBQUFBTHc4LzVzVUowVVVHWXV3L3MxNjAwL05ldytZb3JrK2luK1RoZSsxOTYwJ3MrLSs3MCdzKygyKS5qcGciLCJiYWNrZ3JvdW5kLXNpemUiOiJjb3ZlciIsImJhY2tncm91bmQtcmVwZWF0Ijoibm8tcmVwZWF0IiwicGFkZGluZy1sZWZ0IjoiMHB4IiwicGFkZGluZy1yaWdodCI6IjBweCIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInRleHQtYWxpZ24iOiJjZW50ZXIiLCJzdHlsZSI6ImJhY2tncm91bmQtdXJsOmh0dHA6Ly8xLmJwLmJsb2dzcG90LmNvbS8tVFByZmh4YllwRFkvVWgzUmVmemswMkkvQUFBQUFBQUFMdzgvNXNVSjBVVUdZdXcvczE2MDAvTmV3K1lvcmsraW4rVGhlKzE5NjAncystKzcwJ3MrKDIpLmpwZztiYWNrZ3JvdW5kLXNpemU6Y292ZXI7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O3BhZGRpbmctbGVmdDowcHg7cGFkZGluZy1yaWdodDowcHg7cGFkZGluZy10b3A6MTBweDtwYWRkaW5nLWJvdHRvbToxMHB4O3RleHQtYWxpZ246Y2VudGVyOyJ9LCJjb21wb25lbnRzIjpbeyJ0YWdOYW1lIjoibWotY29sdW1uIiwidHlwZSI6Im1qLWNvbHVtbiIsInN0eWxlIjp7InZlcnRpY2FsLWFsaWduIjoidG9wIn0sImF0dHJpYnV0ZXMiOnsidmVydGljYWwtYWxpZ24iOiJ0b3AiLCJzdHlsZSI6InZlcnRpY2FsLWFsaWduOnRvcDsifSwiY29tcG9uZW50cyI6W3sidGFnTmFtZSI6Im1qLXRleHQiLCJ0eXBlIjoibWotdGV4dCIsInN0eWxlIjp7ImNzcy1jbGFzcyI6InNsb2dhbiIsImFsaWduIjoiY2VudGVyIiwiY29sb3IiOiIjZmZmIiwiZm9udC1zaXplIjoiNDBweCIsImZvbnQtZmFtaWx5IjoiSGVsdmV0aWNhIE5ldWUiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMjVweCIsInBhZGRpbmctbGVmdCI6IjI1cHgiLCJsaW5lLWhlaWdodCI6IjIycHgifSwiYXR0cmlidXRlcyI6eyJjc3MtY2xhc3MiOiJzbG9nYW4iLCJhbGlnbiI6ImNlbnRlciIsImNvbG9yIjoiI2ZmZiIsImZvbnQtc2l6ZSI6IjQwcHgiLCJmb250LWZhbWlseSI6IkhlbHZldGljYSBOZXVlIiwicGFkZGluZy10b3AiOiIxMHB4IiwicGFkZGluZy1ib3R0b20iOiIxMHB4IiwicGFkZGluZy1yaWdodCI6IjI1cHgiLCJwYWRkaW5nLWxlZnQiOiIyNXB4IiwibGluZS1oZWlnaHQiOiIyMnB4Iiwic3R5bGUiOiJjc3MtY2xhc3M6c2xvZ2FuO2FsaWduOmNlbnRlcjtjb2xvcjojZmZmO2ZvbnQtc2l6ZTo0MHB4O2ZvbnQtZmFtaWx5OkhlbHZldGljYSBOZXVlO3BhZGRpbmctdG9wOjEwcHg7cGFkZGluZy1ib3R0b206MTBweDtwYWRkaW5nLXJpZ2h0OjI1cHg7cGFkZGluZy1sZWZ0OjI1cHg7bGluZS1oZWlnaHQ6MjJweDsifSwiY29tcG9uZW50cyI6W3sidHlwZSI6InRleHRub2RlIiwiY29udGVudCI6IlNsb2dhbiBoZXJlIn1dfV19XX0seyJ0eXBlIjoiY29tbWVudCIsImNvbnRlbnQiOiIgSW50cm8gdGV4dCAifSx7InRhZ05hbWUiOiJtai13cmFwcGVyIiwidHlwZSI6Im1qLXdyYXBwZXIiLCJzdHlsZSI6eyJiYWNrZ3JvdW5kLWNvbG9yIjoiI2ZmZTlmNyIsInBhZGRpbmciOiIxMHB4In0sImF0dHJpYnV0ZXMiOnsiYmFja2dyb3VuZC1jb2xvciI6IiNmZmU5ZjciLCJwYWRkaW5nIjoiMTBweCIsInN0eWxlIjoiYmFja2dyb3VuZC1jb2xvcjojZmZlOWY3O3BhZGRpbmc6MTBweDsifSwiY29tcG9uZW50cyI6W3sidGFnTmFtZSI6Im1qLXNlY3Rpb24iLCJ0eXBlIjoibWotc2VjdGlvbiIsInN0eWxlIjp7ImJhY2tncm91bmQtY29sb3IiOiIjZWFlZmZhIiwicGFkZGluZy1sZWZ0IjoiMHB4IiwicGFkZGluZy1yaWdodCI6IjBweCIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInRleHQtYWxpZ24iOiJjZW50ZXIifSwiYXR0cmlidXRlcyI6eyJiYWNrZ3JvdW5kLWNvbG9yIjoiI2VhZWZmYSIsInBhZGRpbmctbGVmdCI6IjBweCIsInBhZGRpbmctcmlnaHQiOiIwcHgiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJ0ZXh0LWFsaWduIjoiY2VudGVyIiwic3R5bGUiOiJiYWNrZ3JvdW5kLWNvbG9yOiNlYWVmZmE7cGFkZGluZy1sZWZ0OjBweDtwYWRkaW5nLXJpZ2h0OjBweDtwYWRkaW5nLXRvcDoxMHB4O3BhZGRpbmctYm90dG9tOjEwcHg7dGV4dC1hbGlnbjpjZW50ZXI7In0sImNvbXBvbmVudHMiOlt7InRhZ05hbWUiOiJtai1ncm91cCIsInR5cGUiOiJtai1ncm91cCIsInN0eWxlIjp7ImJhY2tncm91bmQtY29sb3IiOiIjZmZmYWRkIiwidmVydGljYWwtYWxpZ24iOiJ0b3AifSwiYXR0cmlidXRlcyI6eyJiYWNrZ3JvdW5kLWNvbG9yIjoiI2ZmZmFkZCIsInZlcnRpY2FsLWFsaWduIjoidG9wIiwic3R5bGUiOiJiYWNrZ3JvdW5kLWNvbG9yOiNmZmZhZGQ7dmVydGljYWwtYWxpZ246dG9wOyJ9LCJjb21wb25lbnRzIjpbeyJ0YWdOYW1lIjoibWotY29sdW1uIiwidHlwZSI6Im1qLWNvbHVtbiIsInN0eWxlIjp7InZlcnRpY2FsLWFsaWduIjoidG9wIn0sImF0dHJpYnV0ZXMiOnsidmVydGljYWwtYWxpZ24iOiJ0b3AiLCJzdHlsZSI6InZlcnRpY2FsLWFsaWduOnRvcDsifSwiY29tcG9uZW50cyI6W3sidGFnTmFtZSI6Im1qLXRleHQiLCJ0eXBlIjoibWotdGV4dCIsInN0eWxlIjp7ImZvbnQtc3R5bGUiOiJpdGFsaWMiLCJmb250LXNpemUiOiIyMHB4IiwiZm9udC1mYW1pbHkiOiJIZWx2ZXRpY2EgTmV1ZSIsImNvbG9yIjoiIzYyNjI2MiIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInBhZGRpbmctcmlnaHQiOiIyNXB4IiwicGFkZGluZy1sZWZ0IjoiMjVweCIsImxpbmUtaGVpZ2h0IjoiMjJweCIsImFsaWduIjoibGVmdCJ9LCJhdHRyaWJ1dGVzIjp7ImZvbnQtc3R5bGUiOiJpdGFsaWMiLCJmb250LXNpemUiOiIyMHB4IiwiZm9udC1mYW1pbHkiOiJIZWx2ZXRpY2EgTmV1ZSIsImNvbG9yIjoiIzYyNjI2MiIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInBhZGRpbmctcmlnaHQiOiIyNXB4IiwicGFkZGluZy1sZWZ0IjoiMjVweCIsImxpbmUtaGVpZ2h0IjoiMjJweCIsImFsaWduIjoibGVmdCIsInN0eWxlIjoiZm9udC1zdHlsZTppdGFsaWM7Zm9udC1zaXplOjIwcHg7Zm9udC1mYW1pbHk6SGVsdmV0aWNhIE5ldWU7Y29sb3I6IzYyNjI2MjtwYWRkaW5nLXRvcDoxMHB4O3BhZGRpbmctYm90dG9tOjEwcHg7cGFkZGluZy1yaWdodDoyNXB4O3BhZGRpbmctbGVmdDoyNXB4O2xpbmUtaGVpZ2h0OjIycHg7YWxpZ246bGVmdDsifSwiY29tcG9uZW50cyI6W3sidHlwZSI6InRleHRub2RlIiwiY29udGVudCI6Ik15IEF3ZXNvbWUgVGV4dCJ9XX0seyJ0YWdOYW1lIjoibWotdGV4dCIsInR5cGUiOiJtai10ZXh0Iiwic3R5bGUiOnsiY29sb3IiOiIjNTI1MjUyIiwicGFkZGluZy10b3AiOiIxMHB4IiwicGFkZGluZy1ib3R0b20iOiIxMHB4IiwicGFkZGluZy1yaWdodCI6IjI1cHgiLCJwYWRkaW5nLWxlZnQiOiIyNXB4IiwiZm9udC1zaXplIjoiMTNweCIsImxpbmUtaGVpZ2h0IjoiMjJweCIsImFsaWduIjoibGVmdCJ9LCJhdHRyaWJ1dGVzIjp7ImNvbG9yIjoiIzUyNTI1MiIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInBhZGRpbmctcmlnaHQiOiIyNXB4IiwicGFkZGluZy1sZWZ0IjoiMjVweCIsImZvbnQtc2l6ZSI6IjEzcHgiLCJsaW5lLWhlaWdodCI6IjIycHgiLCJhbGlnbiI6ImxlZnQiLCJzdHlsZSI6ImNvbG9yOiM1MjUyNTI7cGFkZGluZy10b3A6MTBweDtwYWRkaW5nLWJvdHRvbToxMHB4O3BhZGRpbmctcmlnaHQ6MjVweDtwYWRkaW5nLWxlZnQ6MjVweDtmb250LXNpemU6MTNweDtsaW5lLWhlaWdodDoyMnB4O2FsaWduOmxlZnQ7In0sImNvbXBvbmVudHMiOlt7InR5cGUiOiJ0ZXh0bm9kZSIsImNvbnRlbnQiOiJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gUHJvaW4gcnV0cnVtIGVuaW0gZWdldCBtYWduYSBlZmZpY2l0dXIsIGV1IHNlbXBlciBhdWd1ZSBzZW1wZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaXF1YW0gZXJhdCB2b2x1dHBhdC4gQ3JhcyBpZCBkdWkgbGVjdHVzLiBWZXN0aWJ1bHVtIHNlZCBmaW5pYnVzIGxlY3R1cywgc2l0IGFtZXQgc3VzY2lwaXQgbmliaC4gUHJvaW4gbmVjXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vZG8gcHVydXMuIFNlZCBlZ2V0IG51bGxhIGVsaXQuIE51bGxhIGFsaXF1ZXQgbW9sbGlzIGZhdWNpYnVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XX0seyJ0YWdOYW1lIjoibWotYnV0dG9uIiwidHlwZSI6Im1qLWJ1dHRvbiIsInN0eWxlIjp7ImJhY2tncm91bmQtY29sb3IiOiIjRjQ1RTQzIiwiaHJlZiI6IiMiLCJib3JkZXItcmFkaXVzIjoiM3B4IiwiZm9udC1zaXplIjoiMTNweCIsImZvbnQtd2VpZ2h0IjoiNDAwIiwiY29sb3IiOiIjZmZmZmZmIiwidmVydGljYWwtYWxpZ24iOiJtaWRkbGUiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMjVweCIsInBhZGRpbmctbGVmdCI6IjI1cHgiLCJhbGlnbiI6ImNlbnRlciJ9LCJhdHRyaWJ1dGVzIjp7ImJhY2tncm91bmQtY29sb3IiOiIjRjQ1RTQzIiwiaHJlZiI6IiMiLCJib3JkZXItcmFkaXVzIjoiM3B4IiwiZm9udC1zaXplIjoiMTNweCIsImZvbnQtd2VpZ2h0IjoiNDAwIiwiY29sb3IiOiIjZmZmZmZmIiwidmVydGljYWwtYWxpZ24iOiJtaWRkbGUiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMjVweCIsInBhZGRpbmctbGVmdCI6IjI1cHgiLCJhbGlnbiI6ImNlbnRlciIsInN0eWxlIjoiYmFja2dyb3VuZC1jb2xvcjojRjQ1RTQzO2hyZWY6Iztib3JkZXItcmFkaXVzOjNweDtmb250LXNpemU6MTNweDtmb250LXdlaWdodDo0MDA7Y29sb3I6I2ZmZmZmZjt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7cGFkZGluZy10b3A6MTBweDtwYWRkaW5nLWJvdHRvbToxMHB4O3BhZGRpbmctcmlnaHQ6MjVweDtwYWRkaW5nLWxlZnQ6MjVweDthbGlnbjpjZW50ZXI7In0sImNvbXBvbmVudHMiOlt7InR5cGUiOiJ0ZXh0bm9kZSIsImNvbnRlbnQiOiJMZWFybiBtb3JlIn1dfV19XX1dfV19LHsidHlwZSI6ImNvbW1lbnQiLCJjb250ZW50IjoiIFNpZGUgaW1hZ2UgIn0seyJ0YWdOYW1lIjoibWotc2VjdGlvbiIsInR5cGUiOiJtai1zZWN0aW9uIiwic3R5bGUiOnsiYmFja2dyb3VuZC1jb2xvciI6IndoaXRlIiwicGFkZGluZy1sZWZ0IjoiMHB4IiwicGFkZGluZy1yaWdodCI6IjBweCIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInRleHQtYWxpZ24iOiJjZW50ZXIifSwiYXR0cmlidXRlcyI6eyJiYWNrZ3JvdW5kLWNvbG9yIjoid2hpdGUiLCJwYWRkaW5nLWxlZnQiOiIwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMHB4IiwicGFkZGluZy10b3AiOiIxMHB4IiwicGFkZGluZy1ib3R0b20iOiIxMHB4IiwidGV4dC1hbGlnbiI6ImNlbnRlciIsInN0eWxlIjoiYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTtwYWRkaW5nLWxlZnQ6MHB4O3BhZGRpbmctcmlnaHQ6MHB4O3BhZGRpbmctdG9wOjEwcHg7cGFkZGluZy1ib3R0b206MTBweDt0ZXh0LWFsaWduOmNlbnRlcjsifSwiY29tcG9uZW50cyI6W3sidGFnTmFtZSI6Im1qLWNvbHVtbiIsInR5cGUiOiJtai1jb2x1bW4iLCJzdHlsZSI6eyJ2ZXJ0aWNhbC1hbGlnbiI6InRvcCJ9LCJhdHRyaWJ1dGVzIjp7InZlcnRpY2FsLWFsaWduIjoidG9wIiwic3R5bGUiOiJ2ZXJ0aWNhbC1hbGlnbjp0b3A7In0sImNvbXBvbmVudHMiOlt7InRhZ05hbWUiOiJtai1pbWFnZSIsInR5cGUiOiJtai1pbWFnZSIsInN0eWxlIjp7IndpZHRoIjoiMjAwcHgiLCJzcmMiOiJodHRwczovL2Rlc2lnbnNwZWxsLmZpbGVzLndvcmRwcmVzcy5jb20vMjAxMi8wMS9zY2lvbGluby1wYXJpcy1idy5qcGciLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMjVweCIsInBhZGRpbmctbGVmdCI6IjI1cHgiLCJhbGlnbiI6ImNlbnRlciJ9LCJhdHRyaWJ1dGVzIjp7IndpZHRoIjoiMjAwcHgiLCJzcmMiOiJodHRwczovL2Rlc2lnbnNwZWxsLmZpbGVzLndvcmRwcmVzcy5jb20vMjAxMi8wMS9zY2lvbGluby1wYXJpcy1idy5qcGciLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMjVweCIsInBhZGRpbmctbGVmdCI6IjI1cHgiLCJhbGlnbiI6ImNlbnRlciIsInN0eWxlIjoid2lkdGg6MjAwcHg7c3JjOmh0dHBzOi8vZGVzaWduc3BlbGwuZmlsZXMud29yZHByZXNzLmNvbS8yMDEyLzAxL3NjaW9saW5vLXBhcmlzLWJ3LmpwZztwYWRkaW5nLXRvcDoxMHB4O3BhZGRpbmctYm90dG9tOjEwcHg7cGFkZGluZy1yaWdodDoyNXB4O3BhZGRpbmctbGVmdDoyNXB4O2FsaWduOmNlbnRlcjsifSwiY29tcG9uZW50cyI6W3sidHlwZSI6InRleHRub2RlIiwiY29udGVudCI6IlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XX1dfSx7InRhZ05hbWUiOiJtai1jb2x1bW4iLCJ0eXBlIjoibWotY29sdW1uIiwic3R5bGUiOnsidmVydGljYWwtYWxpZ24iOiJ0b3AifSwiYXR0cmlidXRlcyI6eyJ2ZXJ0aWNhbC1hbGlnbiI6InRvcCIsInN0eWxlIjoidmVydGljYWwtYWxpZ246dG9wOyJ9LCJjb21wb25lbnRzIjpbeyJ0YWdOYW1lIjoibWotdGV4dCIsInR5cGUiOiJtai10ZXh0Iiwic3R5bGUiOnsiZm9udC1zdHlsZSI6Iml0YWxpYyIsImZvbnQtc2l6ZSI6IjIwcHgiLCJmb250LWZhbWlseSI6IkhlbHZldGljYSBOZXVlIiwiY29sb3IiOiIjNjI2MjYyIiwicGFkZGluZy10b3AiOiIxMHB4IiwicGFkZGluZy1ib3R0b20iOiIxMHB4IiwicGFkZGluZy1yaWdodCI6IjI1cHgiLCJwYWRkaW5nLWxlZnQiOiIyNXB4IiwibGluZS1oZWlnaHQiOiIyMnB4IiwiYWxpZ24iOiJsZWZ0In0sImF0dHJpYnV0ZXMiOnsiZm9udC1zdHlsZSI6Iml0YWxpYyIsImZvbnQtc2l6ZSI6IjIwcHgiLCJmb250LWZhbWlseSI6IkhlbHZldGljYSBOZXVlIiwiY29sb3IiOiIjNjI2MjYyIiwicGFkZGluZy10b3AiOiIxMHB4IiwicGFkZGluZy1ib3R0b20iOiIxMHB4IiwicGFkZGluZy1yaWdodCI6IjI1cHgiLCJwYWRkaW5nLWxlZnQiOiIyNXB4IiwibGluZS1oZWlnaHQiOiIyMnB4IiwiYWxpZ24iOiJsZWZ0Iiwic3R5bGUiOiJmb250LXN0eWxlOml0YWxpYztmb250LXNpemU6MjBweDtmb250LWZhbWlseTpIZWx2ZXRpY2EgTmV1ZTtjb2xvcjojNjI2MjYyO3BhZGRpbmctdG9wOjEwcHg7cGFkZGluZy1ib3R0b206MTBweDtwYWRkaW5nLXJpZ2h0OjI1cHg7cGFkZGluZy1sZWZ0OjI1cHg7bGluZS1oZWlnaHQ6MjJweDthbGlnbjpsZWZ0OyJ9LCJjb21wb25lbnRzIjpbeyJ0eXBlIjoidGV4dG5vZGUiLCJjb250ZW50IjoiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5kIGFtYXppbmcgcGxhY2VzIC4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifV19LHsidGFnTmFtZSI6Im1qLXRleHQiLCJ0eXBlIjoibWotdGV4dCIsInN0eWxlIjp7ImNvbG9yIjoiIzUyNTI1MiIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInBhZGRpbmctcmlnaHQiOiIyNXB4IiwicGFkZGluZy1sZWZ0IjoiMjVweCIsImZvbnQtc2l6ZSI6IjEzcHgiLCJsaW5lLWhlaWdodCI6IjIycHgiLCJhbGlnbiI6ImxlZnQifSwiYXR0cmlidXRlcyI6eyJjb2xvciI6IiM1MjUyNTIiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMjVweCIsInBhZGRpbmctbGVmdCI6IjI1cHgiLCJmb250LXNpemUiOiIxM3B4IiwibGluZS1oZWlnaHQiOiIyMnB4IiwiYWxpZ24iOiJsZWZ0Iiwic3R5bGUiOiJjb2xvcjojNTI1MjUyO3BhZGRpbmctdG9wOjEwcHg7cGFkZGluZy1ib3R0b206MTBweDtwYWRkaW5nLXJpZ2h0OjI1cHg7cGFkZGluZy1sZWZ0OjI1cHg7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MjJweDthbGlnbjpsZWZ0OyJ9LCJjb21wb25lbnRzIjpbeyJ0eXBlIjoidGV4dG5vZGUiLCJjb250ZW50IjoiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LiBQcm9pbiBydXRydW0gZW5pbSBlZ2V0IG1hZ25hIGVmZmljaXR1ciwgZXUgc2VtcGVyIGF1Z3VlIHNlbXBlci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaXF1YW0gZXJhdCB2b2x1dHBhdC4gQ3JhcyBpZCBkdWkgbGVjdHVzLiBWZXN0aWJ1bHVtIHNlZCBmaW5pYnVzIGxlY3R1cy4ifV19XX1dfSx7InRhZ05hbWUiOiJtai1zZWN0aW9uIiwidHlwZSI6Im1qLXNlY3Rpb24iLCJzdHlsZSI6eyJwYWRkaW5nLWxlZnQiOiIwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMHB4IiwicGFkZGluZy10b3AiOiIxMHB4IiwicGFkZGluZy1ib3R0b20iOiIxMHB4IiwidGV4dC1hbGlnbiI6ImNlbnRlciJ9LCJhdHRyaWJ1dGVzIjp7InBhZGRpbmctbGVmdCI6IjBweCIsInBhZGRpbmctcmlnaHQiOiIwcHgiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJ0ZXh0LWFsaWduIjoiY2VudGVyIiwic3R5bGUiOiJwYWRkaW5nLWxlZnQ6MHB4O3BhZGRpbmctcmlnaHQ6MHB4O3BhZGRpbmctdG9wOjEwcHg7cGFkZGluZy1ib3R0b206MTBweDt0ZXh0LWFsaWduOmNlbnRlcjsifSwiY29tcG9uZW50cyI6W3sidGFnTmFtZSI6Im1qLWNvbHVtbiIsInR5cGUiOiJtai1jb2x1bW4iLCJzdHlsZSI6eyJ2ZXJ0aWNhbC1hbGlnbiI6InRvcCJ9LCJhdHRyaWJ1dGVzIjp7InZlcnRpY2FsLWFsaWduIjoidG9wIiwic3R5bGUiOiJ2ZXJ0aWNhbC1hbGlnbjp0b3A7In0sImNvbXBvbmVudHMiOlt7InRhZ05hbWUiOiJtai10ZXh0IiwidHlwZSI6Im1qLXRleHQiLCJzdHlsZSI6eyJmb250LXN0eWxlIjoiaXRhbGljIiwiZm9udC1zaXplIjoiMjBweCIsImZvbnQtZmFtaWx5IjoiSGVsdmV0aWNhIE5ldWUiLCJjb2xvciI6IiM2MjYyNjIiLCJhbGlnbiI6ImNlbnRlciIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInBhZGRpbmctcmlnaHQiOiIyNXB4IiwicGFkZGluZy1sZWZ0IjoiMjVweCIsImxpbmUtaGVpZ2h0IjoiMjJweCJ9LCJhdHRyaWJ1dGVzIjp7ImZvbnQtc3R5bGUiOiJpdGFsaWMiLCJmb250LXNpemUiOiIyMHB4IiwiZm9udC1mYW1pbHkiOiJIZWx2ZXRpY2EgTmV1ZSIsImNvbG9yIjoiIzYyNjI2MiIsImFsaWduIjoiY2VudGVyIiwicGFkZGluZy10b3AiOiIxMHB4IiwicGFkZGluZy1ib3R0b20iOiIxMHB4IiwicGFkZGluZy1yaWdodCI6IjI1cHgiLCJwYWRkaW5nLWxlZnQiOiIyNXB4IiwibGluZS1oZWlnaHQiOiIyMnB4Iiwic3R5bGUiOiJmb250LXN0eWxlOml0YWxpYztmb250LXNpemU6MjBweDtmb250LWZhbWlseTpIZWx2ZXRpY2EgTmV1ZTtjb2xvcjojNjI2MjYyO2FsaWduOmNlbnRlcjtwYWRkaW5nLXRvcDoxMHB4O3BhZGRpbmctYm90dG9tOjEwcHg7cGFkZGluZy1yaWdodDoyNXB4O3BhZGRpbmctbGVmdDoyNXB4O2xpbmUtaGVpZ2h0OjIycHg7In0sImNvbXBvbmVudHMiOlt7InR5cGUiOiJ0ZXh0bm9kZSIsImNvbnRlbnQiOiJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiB3aXRoIHJlYWwtbGlmZSBpbWFnZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1dfV19XX0seyJ0YWdOYW1lIjoibWotcmF3IiwidHlwZSI6Im1qLXJhdyIsImNvbXBvbmVudHMiOlt7ImNsYXNzZXMiOlsiY29udGFpbmVyIl0sImNvbXBvbmVudHMiOlt7InR5cGUiOiJpbWFnZSIsInJlc2l6YWJsZSI6eyJyYXRpb0RlZmF1bHQiOjF9LCJjbGFzc2VzIjpbIml0ZW0iXSwiYXR0cmlidXRlcyI6eyJzcmMiOiJodHRwczovL3NvdXJjZS51bnNwbGFzaC5jb20vcmFuZG9tLzIwMHgxNDE/cmFuZG9tIiwiYWx0IjoiRXhhbXBsZSBpbWFnZSJ9fSx7InR5cGUiOiJpbWFnZSIsInJlc2l6YWJsZSI6eyJyYXRpb0RlZmF1bHQiOjF9LCJjbGFzc2VzIjpbIml0ZW0iXSwiYXR0cmlidXRlcyI6eyJzcmMiOiJodHRwczovL3NvdXJjZS51bnNwbGFzaC5jb20vcmFuZG9tLzIwMHgxNDI/cmFuZG9tIiwiYWx0IjoiRXhhbXBsZSBpbWFnZSJ9fSx7InR5cGUiOiJpbWFnZSIsInJlc2l6YWJsZSI6eyJyYXRpb0RlZmF1bHQiOjF9LCJjbGFzc2VzIjpbIml0ZW0iXSwiYXR0cmlidXRlcyI6eyJzcmMiOiJodHRwczovL3NvdXJjZS51bnNwbGFzaC5jb20vcmFuZG9tLzIwMHgxNDM/cmFuZG9tIiwiYWx0IjoiRXhhbXBsZSBpbWFnZSJ9fSx7InR5cGUiOiJpbWFnZSIsInJlc2l6YWJsZSI6eyJyYXRpb0RlZmF1bHQiOjF9LCJjbGFzc2VzIjpbIml0ZW0iXSwiYXR0cmlidXRlcyI6eyJzcmMiOiJodHRwczovL3NvdXJjZS51bnNwbGFzaC5jb20vcmFuZG9tLzIwMHgxNDQ/cmFuZG9tIiwiYWx0IjoiRXhhbXBsZSBpbWFnZSJ9fSx7InR5cGUiOiJpbWFnZSIsInJlc2l6YWJsZSI6eyJyYXRpb0RlZmF1bHQiOjF9LCJjbGFzc2VzIjpbIml0ZW0iXSwiYXR0cmlidXRlcyI6eyJzcmMiOiJodHRwczovL3NvdXJjZS51bnNwbGFzaC5jb20vcmFuZG9tLzIwMHgxNDU/cmFuZG9tIiwiYWx0IjoiRXhhbXBsZSBpbWFnZSJ9fSx7InR5cGUiOiJpbWFnZSIsInJlc2l6YWJsZSI6eyJyYXRpb0RlZmF1bHQiOjF9LCJjbGFzc2VzIjpbIml0ZW0iXSwiYXR0cmlidXRlcyI6eyJzcmMiOiJodHRwczovL3NvdXJjZS51bnNwbGFzaC5jb20vcmFuZG9tLzIwMHgxNDY/cmFuZG9tIiwiYWx0IjoiRXhhbXBsZSBpbWFnZSJ9fV19XX0seyJ0eXBlIjoiY29tbWVudCIsImNvbnRlbnQiOiIgSWNvbnMgIn0seyJ0YWdOYW1lIjoibWotc2VjdGlvbiIsInR5cGUiOiJtai1zZWN0aW9uIiwic3R5bGUiOnsiYmFja2dyb3VuZC1jb2xvciI6IiNmYmZiZmIiLCJwYWRkaW5nLWxlZnQiOiIwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMHB4IiwicGFkZGluZy10b3AiOiIxMHB4IiwicGFkZGluZy1ib3R0b20iOiIxMHB4IiwidGV4dC1hbGlnbiI6ImNlbnRlciJ9LCJhdHRyaWJ1dGVzIjp7ImJhY2tncm91bmQtY29sb3IiOiIjZmJmYmZiIiwicGFkZGluZy1sZWZ0IjoiMHB4IiwicGFkZGluZy1yaWdodCI6IjBweCIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInRleHQtYWxpZ24iOiJjZW50ZXIiLCJzdHlsZSI6ImJhY2tncm91bmQtY29sb3I6I2ZiZmJmYjtwYWRkaW5nLWxlZnQ6MHB4O3BhZGRpbmctcmlnaHQ6MHB4O3BhZGRpbmctdG9wOjEwcHg7cGFkZGluZy1ib3R0b206MTBweDt0ZXh0LWFsaWduOmNlbnRlcjsifSwiY29tcG9uZW50cyI6W3sidGFnTmFtZSI6Im1qLWNvbHVtbiIsInR5cGUiOiJtai1jb2x1bW4iLCJzdHlsZSI6eyJ2ZXJ0aWNhbC1hbGlnbiI6InRvcCJ9LCJhdHRyaWJ1dGVzIjp7InZlcnRpY2FsLWFsaWduIjoidG9wIiwic3R5bGUiOiJ2ZXJ0aWNhbC1hbGlnbjp0b3A7In0sImNvbXBvbmVudHMiOlt7InRhZ05hbWUiOiJtai1pbWFnZSIsInR5cGUiOiJtai1pbWFnZSIsInN0eWxlIjp7IndpZHRoIjoiMTAwcHgiLCJzcmMiOiJodHRwOi8vMTkxbi5tai5hbS9pbWcvMTkxbi8zcy94MGwucG5nIiwicGFkZGluZy10b3AiOiIxMHB4IiwicGFkZGluZy1ib3R0b20iOiIxMHB4IiwicGFkZGluZy1yaWdodCI6IjI1cHgiLCJwYWRkaW5nLWxlZnQiOiIyNXB4IiwiYWxpZ24iOiJjZW50ZXIifSwiYXR0cmlidXRlcyI6eyJ3aWR0aCI6IjEwMHB4Iiwic3JjIjoiaHR0cDovLzE5MW4ubWouYW0vaW1nLzE5MW4vM3MveDBsLnBuZyIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInBhZGRpbmctcmlnaHQiOiIyNXB4IiwicGFkZGluZy1sZWZ0IjoiMjVweCIsImFsaWduIjoiY2VudGVyIiwic3R5bGUiOiJ3aWR0aDoxMDBweDtzcmM6aHR0cDovLzE5MW4ubWouYW0vaW1nLzE5MW4vM3MveDBsLnBuZztwYWRkaW5nLXRvcDoxMHB4O3BhZGRpbmctYm90dG9tOjEwcHg7cGFkZGluZy1yaWdodDoyNXB4O3BhZGRpbmctbGVmdDoyNXB4O2FsaWduOmNlbnRlcjsifSwiY29tcG9uZW50cyI6W3sidHlwZSI6InRleHRub2RlIiwiY29udGVudCI6IlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XX1dfSx7InRhZ05hbWUiOiJtai1jb2x1bW4iLCJ0eXBlIjoibWotY29sdW1uIiwic3R5bGUiOnsidmVydGljYWwtYWxpZ24iOiJ0b3AifSwiYXR0cmlidXRlcyI6eyJ2ZXJ0aWNhbC1hbGlnbiI6InRvcCIsInN0eWxlIjoidmVydGljYWwtYWxpZ246dG9wOyJ9LCJjb21wb25lbnRzIjpbeyJ0YWdOYW1lIjoibWotaW1hZ2UiLCJ0eXBlIjoibWotaW1hZ2UiLCJzdHlsZSI6eyJ3aWR0aCI6IjEwMHB4Iiwic3JjIjoiaHR0cDovLzE5MW4ubWouYW0vaW1nLzE5MW4vM3MveDAxLnBuZyIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInBhZGRpbmctcmlnaHQiOiIyNXB4IiwicGFkZGluZy1sZWZ0IjoiMjVweCIsImFsaWduIjoiY2VudGVyIn0sImF0dHJpYnV0ZXMiOnsid2lkdGgiOiIxMDBweCIsInNyYyI6Imh0dHA6Ly8xOTFuLm1qLmFtL2ltZy8xOTFuLzNzL3gwMS5wbmciLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMjVweCIsInBhZGRpbmctbGVmdCI6IjI1cHgiLCJhbGlnbiI6ImNlbnRlciIsInN0eWxlIjoid2lkdGg6MTAwcHg7c3JjOmh0dHA6Ly8xOTFuLm1qLmFtL2ltZy8xOTFuLzNzL3gwMS5wbmc7cGFkZGluZy10b3A6MTBweDtwYWRkaW5nLWJvdHRvbToxMHB4O3BhZGRpbmctcmlnaHQ6MjVweDtwYWRkaW5nLWxlZnQ6MjVweDthbGlnbjpjZW50ZXI7In0sImNvbXBvbmVudHMiOlt7InR5cGUiOiJ0ZXh0bm9kZSIsImNvbnRlbnQiOiJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAifV19XX0seyJ0YWdOYW1lIjoibWotY29sdW1uIiwidHlwZSI6Im1qLWNvbHVtbiIsInN0eWxlIjp7InZlcnRpY2FsLWFsaWduIjoidG9wIn0sImF0dHJpYnV0ZXMiOnsidmVydGljYWwtYWxpZ24iOiJ0b3AiLCJzdHlsZSI6InZlcnRpY2FsLWFsaWduOnRvcDsifSwiY29tcG9uZW50cyI6W3sidGFnTmFtZSI6Im1qLWltYWdlIiwidHlwZSI6Im1qLWltYWdlIiwic3R5bGUiOnsid2lkdGgiOiIxMDBweCIsInNyYyI6Imh0dHA6Ly8xOTFuLm1qLmFtL2ltZy8xOTFuLzNzL3gwcy5wbmciLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMjVweCIsInBhZGRpbmctbGVmdCI6IjI1cHgiLCJhbGlnbiI6ImNlbnRlciJ9LCJhdHRyaWJ1dGVzIjp7IndpZHRoIjoiMTAwcHgiLCJzcmMiOiJodHRwOi8vMTkxbi5tai5hbS9pbWcvMTkxbi8zcy94MHMucG5nIiwicGFkZGluZy10b3AiOiIxMHB4IiwicGFkZGluZy1ib3R0b20iOiIxMHB4IiwicGFkZGluZy1yaWdodCI6IjI1cHgiLCJwYWRkaW5nLWxlZnQiOiIyNXB4IiwiYWxpZ24iOiJjZW50ZXIiLCJzdHlsZSI6IndpZHRoOjEwMHB4O3NyYzpodHRwOi8vMTkxbi5tai5hbS9pbWcvMTkxbi8zcy94MHMucG5nO3BhZGRpbmctdG9wOjEwcHg7cGFkZGluZy1ib3R0b206MTBweDtwYWRkaW5nLXJpZ2h0OjI1cHg7cGFkZGluZy1sZWZ0OjI1cHg7YWxpZ246Y2VudGVyOyJ9LCJjb21wb25lbnRzIjpbeyJ0eXBlIjoidGV4dG5vZGUiLCJjb250ZW50IjoiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1dfV19XX0seyJ0eXBlIjoiY29tbWVudCIsImNvbnRlbnQiOiIgRm9vdGVyICJ9LHsidGFnTmFtZSI6Im1qLXNlY3Rpb24iLCJ0eXBlIjoibWotc2VjdGlvbiIsInN0eWxlIjp7ImJhY2tncm91bmQtY29sb3IiOiIjZTdlN2U3IiwicGFkZGluZy1sZWZ0IjoiMHB4IiwicGFkZGluZy1yaWdodCI6IjBweCIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInRleHQtYWxpZ24iOiJjZW50ZXIifSwiYXR0cmlidXRlcyI6eyJiYWNrZ3JvdW5kLWNvbG9yIjoiI2U3ZTdlNyIsInBhZGRpbmctbGVmdCI6IjBweCIsInBhZGRpbmctcmlnaHQiOiIwcHgiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJ0ZXh0LWFsaWduIjoiY2VudGVyIiwic3R5bGUiOiJiYWNrZ3JvdW5kLWNvbG9yOiNlN2U3ZTc7cGFkZGluZy1sZWZ0OjBweDtwYWRkaW5nLXJpZ2h0OjBweDtwYWRkaW5nLXRvcDoxMHB4O3BhZGRpbmctYm90dG9tOjEwcHg7dGV4dC1hbGlnbjpjZW50ZXI7In0sImNvbXBvbmVudHMiOlt7InRhZ05hbWUiOiJtai1jb2x1bW4iLCJ0eXBlIjoibWotY29sdW1uIiwic3R5bGUiOnsidmVydGljYWwtYWxpZ24iOiJ0b3AifSwiYXR0cmlidXRlcyI6eyJ2ZXJ0aWNhbC1hbGlnbiI6InRvcCIsInN0eWxlIjoidmVydGljYWwtYWxpZ246dG9wOyJ9LCJjb21wb25lbnRzIjpbeyJ0YWdOYW1lIjoibWotYnV0dG9uIiwidHlwZSI6Im1qLWJ1dHRvbiIsInN0eWxlIjp7ImhyZWYiOiIjIiwiYmFja2dyb3VuZC1jb2xvciI6IiM0MTQxNDEiLCJib3JkZXItcmFkaXVzIjoiM3B4IiwiZm9udC1zaXplIjoiMTNweCIsImZvbnQtd2VpZ2h0IjoiNDAwIiwiY29sb3IiOiIjZmZmZmZmIiwidmVydGljYWwtYWxpZ24iOiJtaWRkbGUiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMjVweCIsInBhZGRpbmctbGVmdCI6IjI1cHgiLCJhbGlnbiI6ImNlbnRlciJ9LCJhdHRyaWJ1dGVzIjp7ImhyZWYiOiIjIiwiYmFja2dyb3VuZC1jb2xvciI6IiM0MTQxNDEiLCJib3JkZXItcmFkaXVzIjoiM3B4IiwiZm9udC1zaXplIjoiMTNweCIsImZvbnQtd2VpZ2h0IjoiNDAwIiwiY29sb3IiOiIjZmZmZmZmIiwidmVydGljYWwtYWxpZ24iOiJtaWRkbGUiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMjVweCIsInBhZGRpbmctbGVmdCI6IjI1cHgiLCJhbGlnbiI6ImNlbnRlciIsInN0eWxlIjoiaHJlZjojO2JhY2tncm91bmQtY29sb3I6IzQxNDE0MTtib3JkZXItcmFkaXVzOjNweDtmb250LXNpemU6MTNweDtmb250LXdlaWdodDo0MDA7Y29sb3I6I2ZmZmZmZjt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7cGFkZGluZy10b3A6MTBweDtwYWRkaW5nLWJvdHRvbToxMHB4O3BhZGRpbmctcmlnaHQ6MjVweDtwYWRkaW5nLWxlZnQ6MjVweDthbGlnbjpjZW50ZXI7In0sImNvbXBvbmVudHMiOlt7InR5cGUiOiJ0ZXh0bm9kZSIsImNvbnRlbnQiOiJIZWxsbyBUaGVyZSEifV19LHsidGFnTmFtZSI6Im1qLXNvY2lhbCIsInR5cGUiOiJtai1zb2NpYWwiLCJzdHlsZSI6eyJmb250LXNpemUiOiIxNXB4IiwiaWNvbi1zaXplIjoiMzBweCIsIm1vZGUiOiJob3Jpem9udGFsIiwiYWxpZ24iOiJjZW50ZXIiLCJsaW5lLWhlaWdodCI6IjIycHgifSwiYXR0cmlidXRlcyI6eyJmb250LXNpemUiOiIxNXB4IiwiaWNvbi1zaXplIjoiMzBweCIsIm1vZGUiOiJob3Jpem9udGFsIiwiYWxpZ24iOiJjZW50ZXIiLCJsaW5lLWhlaWdodCI6IjIycHgiLCJzdHlsZSI6ImZvbnQtc2l6ZToxNXB4O2ljb24tc2l6ZTozMHB4O21vZGU6aG9yaXpvbnRhbDthbGlnbjpjZW50ZXI7bGluZS1oZWlnaHQ6MjJweDsifSwiY29tcG9uZW50cyI6W3sidGFnTmFtZSI6Im1qLXNvY2lhbC1lbGVtZW50IiwidHlwZSI6Im1qLXNvY2lhbC1lbGVtZW50Iiwic3R5bGUiOnsibmFtZSI6ImZhY2Vib29rIiwiaHJlZiI6Imh0dHBzOi8vbWptbC5pby8iLCJhbGlnbiI6ImNlbnRlciIsImZvbnQtc2l6ZSI6IjEzcHgiLCJsaW5lLWhlaWdodCI6IjIycHgiLCJ2ZXJ0aWNhbC1hbGlnbiI6Im1pZGRsZSJ9LCJhdHRyaWJ1dGVzIjp7Im5hbWUiOiJmYWNlYm9vayIsImhyZWYiOiJodHRwczovL21qbWwuaW8vIiwiYWxpZ24iOiJjZW50ZXIiLCJmb250LXNpemUiOiIxM3B4IiwibGluZS1oZWlnaHQiOiIyMnB4IiwidmVydGljYWwtYWxpZ24iOiJtaWRkbGUiLCJzdHlsZSI6Im5hbWU6ZmFjZWJvb2s7aHJlZjpodHRwczovL21qbWwuaW8vO2FsaWduOmNlbnRlcjtmb250LXNpemU6MTNweDtsaW5lLWhlaWdodDoyMnB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTsifSwiY29tcG9uZW50cyI6W3sidHlwZSI6InRleHRub2RlIiwiY29udGVudCI6IlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2Vib29rXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifV19LHsidGFnTmFtZSI6Im1qLXNvY2lhbC1lbGVtZW50IiwidHlwZSI6Im1qLXNvY2lhbC1lbGVtZW50Iiwic3R5bGUiOnsibmFtZSI6Imdvb2dsZSIsImhyZWYiOiJodHRwczovL21qbWwuaW8vIiwiYWxpZ24iOiJjZW50ZXIiLCJmb250LXNpemUiOiIxM3B4IiwibGluZS1oZWlnaHQiOiIyMnB4IiwidmVydGljYWwtYWxpZ24iOiJtaWRkbGUifSwiYXR0cmlidXRlcyI6eyJuYW1lIjoiZ29vZ2xlIiwiaHJlZiI6Imh0dHBzOi8vbWptbC5pby8iLCJhbGlnbiI6ImNlbnRlciIsImZvbnQtc2l6ZSI6IjEzcHgiLCJsaW5lLWhlaWdodCI6IjIycHgiLCJ2ZXJ0aWNhbC1hbGlnbiI6Im1pZGRsZSIsInN0eWxlIjoibmFtZTpnb29nbGU7aHJlZjpodHRwczovL21qbWwuaW8vO2FsaWduOmNlbnRlcjtmb250LXNpemU6MTNweDtsaW5lLWhlaWdodDoyMnB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTsifSwiY29tcG9uZW50cyI6W3sidHlwZSI6InRleHRub2RlIiwiY29udGVudCI6IlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdvb2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1dfSx7InRhZ05hbWUiOiJtai1zb2NpYWwtZWxlbWVudCIsInR5cGUiOiJtai1zb2NpYWwtZWxlbWVudCIsInN0eWxlIjp7Im5hbWUiOiJ0d2l0dGVyIiwiaHJlZiI6Imh0dHBzOi8vbWptbC5pby8iLCJhbGlnbiI6ImNlbnRlciIsImZvbnQtc2l6ZSI6IjEzcHgiLCJsaW5lLWhlaWdodCI6IjIycHgiLCJ2ZXJ0aWNhbC1hbGlnbiI6Im1pZGRsZSJ9LCJhdHRyaWJ1dGVzIjp7Im5hbWUiOiJ0d2l0dGVyIiwiaHJlZiI6Imh0dHBzOi8vbWptbC5pby8iLCJhbGlnbiI6ImNlbnRlciIsImZvbnQtc2l6ZSI6IjEzcHgiLCJsaW5lLWhlaWdodCI6IjIycHgiLCJ2ZXJ0aWNhbC1hbGlnbiI6Im1pZGRsZSIsInN0eWxlIjoibmFtZTp0d2l0dGVyO2hyZWY6aHR0cHM6Ly9tam1sLmlvLzthbGlnbjpjZW50ZXI7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MjJweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7In0sImNvbXBvbmVudHMiOlt7InR5cGUiOiJ0ZXh0bm9kZSIsImNvbnRlbnQiOiJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUd2l0dGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifV19XX1dfV19LHsidHlwZSI6ImNvbW1lbnQiLCJjb250ZW50IjoiIEZvb3RlciAifV19XX1dfSwiaWQiOiI3cERSTzdjS1R3V2hXSXJ4In1dLCJpZCI6IjU2czJHNlVkVVhHMlpidngifV19]]></fileData> 37 <fileData><![CDATA[eyJhc3NldHMiOltdLCJzdHlsZXMiOlt7InNlbGVjdG9ycyI6W10sInNlbGVjdG9yc0FkZCI6IiNvdXRsb29rIGEiLCJzdHlsZSI6eyJwYWRkaW5nLXRvcCI6IjBweCIsInBhZGRpbmctcmlnaHQiOiIwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjBweCIsInBhZGRpbmctbGVmdCI6IjBweCJ9fSx7InNlbGVjdG9ycyI6W10sInNlbGVjdG9yc0FkZCI6ImJvZHkiLCJzdHlsZSI6eyJtYXJnaW4tdG9wIjoiMHB4IiwibWFyZ2luLXJpZ2h0IjoiMHB4IiwibWFyZ2luLWJvdHRvbSI6IjBweCIsIm1hcmdpbi1sZWZ0IjoiMHB4IiwicGFkZGluZy10b3AiOiIwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMHB4IiwicGFkZGluZy1ib3R0b20iOiIwcHgiLCJwYWRkaW5nLWxlZnQiOiIwcHgiLCJ0ZXh0LXNpemUtYWRqdXN0IjoiMTAwJSJ9fSx7InNlbGVjdG9ycyI6W10sInNlbGVjdG9yc0FkZCI6InRhYmxlLCB0ZCIsInN0eWxlIjp7ImJvcmRlci1jb2xsYXBzZSI6ImNvbGxhcHNlIn19LHsic2VsZWN0b3JzIjpbXSwic2VsZWN0b3JzQWRkIjoiaW1nIiwic3R5bGUiOnsiYm9yZGVyLXRvcC13aWR0aCI6IjBweCIsImJvcmRlci1yaWdodC13aWR0aCI6IjBweCIsImJvcmRlci1ib3R0b20td2lkdGgiOiIwcHgiLCJib3JkZXItbGVmdC13aWR0aCI6IjBweCIsImJvcmRlci10b3Atc3R5bGUiOiJpbml0aWFsIiwiYm9yZGVyLXJpZ2h0LXN0eWxlIjoiaW5pdGlhbCIsImJvcmRlci1ib3R0b20tc3R5bGUiOiJpbml0aWFsIiwiYm9yZGVyLWxlZnQtc3R5bGUiOiJpbml0aWFsIiwiYm9yZGVyLXRvcC1jb2xvciI6ImluaXRpYWwiLCJib3JkZXItcmlnaHQtY29sb3IiOiJpbml0aWFsIiwiYm9yZGVyLWJvdHRvbS1jb2xvciI6ImluaXRpYWwiLCJib3JkZXItbGVmdC1jb2xvciI6ImluaXRpYWwiLCJib3JkZXItaW1hZ2Utc291cmNlIjoiaW5pdGlhbCIsImJvcmRlci1pbWFnZS1zbGljZSI6ImluaXRpYWwiLCJib3JkZXItaW1hZ2Utd2lkdGgiOiJpbml0aWFsIiwiYm9yZGVyLWltYWdlLW91dHNldCI6ImluaXRpYWwiLCJib3JkZXItaW1hZ2UtcmVwZWF0IjoiaW5pdGlhbCIsImhlaWdodCI6ImF1dG8iLCJsaW5lLWhlaWdodCI6IjEwMCUiLCJvdXRsaW5lLWNvbG9yIjoiaW5pdGlhbCIsIm91dGxpbmUtc3R5bGUiOiJub25lIiwib3V0bGluZS13aWR0aCI6ImluaXRpYWwiLCJ0ZXh0LWRlY29yYXRpb24tbGluZSI6Im5vbmUiLCJ0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzIjoiaW5pdGlhbCIsInRleHQtZGVjb3JhdGlvbi1zdHlsZSI6ImluaXRpYWwiLCJ0ZXh0LWRlY29yYXRpb24tY29sb3IiOiJpbml0aWFsIn19LHsic2VsZWN0b3JzIjpbXSwic2VsZWN0b3JzQWRkIjoicCIsInN0eWxlIjp7ImRpc3BsYXkiOiJibG9jayIsIm1hcmdpbi10b3AiOiIxM3B4IiwibWFyZ2luLXJpZ2h0IjoiMHB4IiwibWFyZ2luLWJvdHRvbSI6IjEzcHgiLCJtYXJnaW4tbGVmdCI6IjBweCJ9fSx7InNlbGVjdG9ycyI6WyJtai1jb2x1bW4tcGVyLTEwMCJdLCJzdHlsZSI6eyJ3aWR0aCI6IjEwMCUgIWltcG9ydGFudCIsIm1heC13aWR0aCI6IjEwMCUifSwibWVkaWFUZXh0Ijoib25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDQ4MHB4KSIsImF0UnVsZVR5cGUiOiJtZWRpYSJ9LHsic2VsZWN0b3JzIjpbXSwic2VsZWN0b3JzQWRkIjoiLm1vei10ZXh0LWh0bWwgLm1qLWNvbHVtbi1wZXItMTAwIiwic3R5bGUiOnsid2lkdGgiOiIxMDAlICFpbXBvcnRhbnQiLCJtYXgtd2lkdGgiOiIxMDAlIn19LHsic2VsZWN0b3JzIjpbIm1qLWNvbHVtbi1wZXItNTAiXSwic3R5bGUiOnsid2lkdGgiOiI1MCUgIWltcG9ydGFudCIsIm1heC13aWR0aCI6IjUwJSJ9LCJtZWRpYVRleHQiOiJvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNDgwcHgpIiwiYXRSdWxlVHlwZSI6Im1lZGlhIn0seyJzZWxlY3RvcnMiOltdLCJzZWxlY3RvcnNBZGQiOiIubW96LXRleHQtaHRtbCAubWotY29sdW1uLXBlci01MCIsInN0eWxlIjp7IndpZHRoIjoiNTAlICFpbXBvcnRhbnQiLCJtYXgtd2lkdGgiOiI1MCUifX0seyJzZWxlY3RvcnMiOlsibWotY29sdW1uLXBlci0zMy0zMzMzMzMzMzMzMzMzMzYiXSwic3R5bGUiOnsid2lkdGgiOiIzMy4zMzMzJSAhaW1wb3J0YW50IiwibWF4LXdpZHRoIjoiMzMuMzMzMyUifSwibWVkaWFUZXh0Ijoib25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDQ4MHB4KSIsImF0UnVsZVR5cGUiOiJtZWRpYSJ9LHsic2VsZWN0b3JzIjpbXSwic2VsZWN0b3JzQWRkIjoiLm1vei10ZXh0LWh0bWwgLm1qLWNvbHVtbi1wZXItMzMtMzMzMzMzMzMzMzMzMzM2Iiwic3R5bGUiOnsid2lkdGgiOiIzMy4zMzMzJSAhaW1wb3J0YW50IiwibWF4LXdpZHRoIjoiMzMuMzMzMyUifX1dLCJwYWdlcyI6W3siZnJhbWVzIjpbeyJjb21wb25lbnQiOnsidHlwZSI6IndyYXBwZXIiLCJzdHlsYWJsZSI6WyJiYWNrZ3JvdW5kIiwiYmFja2dyb3VuZC1jb2xvciIsImJhY2tncm91bmQtaW1hZ2UiLCJiYWNrZ3JvdW5kLXJlcGVhdCIsImJhY2tncm91bmQtYXR0YWNobWVudCIsImJhY2tncm91bmQtcG9zaXRpb24iLCJiYWNrZ3JvdW5kLXNpemUiXSwiY29tcG9uZW50cyI6W3sidGFnTmFtZSI6Im1qbWwiLCJ0eXBlIjoibWptbCIsImNvbXBvbmVudHMiOlt7InRhZ05hbWUiOiJtai1oZWFkIiwidHlwZSI6Im1qLWhlYWQiLCJjb21wb25lbnRzIjpbeyJ0YWdOYW1lIjoibWotZm9udCIsInR5cGUiOiJtai1mb250Iiwic3R5bGUiOnsibmFtZSI6IkJhcmxvdyIsImhyZWYiOiJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9QmFybG93In0sImF0dHJpYnV0ZXMiOnsibmFtZSI6IkJhcmxvdyIsImhyZWYiOiJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9QmFybG93Iiwic3R5bGUiOiJuYW1lOkJhcmxvdztocmVmOmh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1CYXJsb3c7In19LHsidGFnTmFtZSI6Im1qLXN0eWxlIiwidHlwZSI6Im1qLXN0eWxlIiwiY29tcG9uZW50cyI6W3sidHlwZSI6InRleHRub2RlIiwiY29udGVudCI6IlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zbG9nYW4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICMwMDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgIn1dfV19LHsidGFnTmFtZSI6Im1qLWJvZHkiLCJ0eXBlIjoibWotYm9keSIsInN0eWxlIjp7IndpZHRoIjoiNjAwcHgifSwiYXR0cmlidXRlcyI6eyJ3aWR0aCI6IjYwMHB4Iiwic3R5bGUiOiJ3aWR0aDo2MDBweDsifSwiY29tcG9uZW50cyI6W3sidHlwZSI6ImNvbW1lbnQiLCJjb250ZW50IjoiIENvbXBhbnkgSGVhZGVyICJ9LHsidGFnTmFtZSI6Im1qLXNlY3Rpb24iLCJ0eXBlIjoibWotc2VjdGlvbiIsInN0eWxlIjp7ImJhY2tncm91bmQtY29sb3IiOiIjZjBmMGYwIiwicGFkZGluZy1sZWZ0IjoiMHB4IiwicGFkZGluZy1yaWdodCI6IjBweCIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInRleHQtYWxpZ24iOiJjZW50ZXIifSwiYXR0cmlidXRlcyI6eyJiYWNrZ3JvdW5kLWNvbG9yIjoiI2YwZjBmMCIsInBhZGRpbmctbGVmdCI6IjBweCIsInBhZGRpbmctcmlnaHQiOiIwcHgiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJ0ZXh0LWFsaWduIjoiY2VudGVyIiwic3R5bGUiOiJiYWNrZ3JvdW5kLWNvbG9yOiNmMGYwZjA7cGFkZGluZy1sZWZ0OjBweDtwYWRkaW5nLXJpZ2h0OjBweDtwYWRkaW5nLXRvcDoxMHB4O3BhZGRpbmctYm90dG9tOjEwcHg7dGV4dC1hbGlnbjpjZW50ZXI7In0sImNvbXBvbmVudHMiOlt7InRhZ05hbWUiOiJtai1jb2x1bW4iLCJ0eXBlIjoibWotY29sdW1uIiwic3R5bGUiOnsiYm9yZGVyIjoiMTBweCBzb2xpZCAjRjQ1RTQzIiwidmVydGljYWwtYWxpZ24iOiJ0b3AifSwiYXR0cmlidXRlcyI6eyJib3JkZXIiOiIxMHB4IHNvbGlkICNGNDVFNDMiLCJ2ZXJ0aWNhbC1hbGlnbiI6InRvcCIsInN0eWxlIjoiYm9yZGVyOjEwcHggc29saWQgI0Y0NUU0Mzt2ZXJ0aWNhbC1hbGlnbjp0b3A7In0sImNvbXBvbmVudHMiOlt7InRhZ05hbWUiOiJtai10ZXh0IiwidHlwZSI6Im1qLXRleHQiLCJzdHlsZSI6eyJmb250LWZhbWlseSI6IkJhcmxvdyIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInBhZGRpbmctcmlnaHQiOiIyNXB4IiwicGFkZGluZy1sZWZ0IjoiMjVweCIsImZvbnQtc2l6ZSI6IjEzcHgiLCJsaW5lLWhlaWdodCI6IjIycHgiLCJhbGlnbiI6ImxlZnQifSwiYXR0cmlidXRlcyI6eyJmb250LWZhbWlseSI6IkJhcmxvdyIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInBhZGRpbmctcmlnaHQiOiIyNXB4IiwicGFkZGluZy1sZWZ0IjoiMjVweCIsImZvbnQtc2l6ZSI6IjEzcHgiLCJsaW5lLWhlaWdodCI6IjIycHgiLCJhbGlnbiI6ImxlZnQiLCJzdHlsZSI6ImZvbnQtZmFtaWx5OkJhcmxvdztwYWRkaW5nLXRvcDoxMHB4O3BhZGRpbmctYm90dG9tOjEwcHg7cGFkZGluZy1yaWdodDoyNXB4O3BhZGRpbmctbGVmdDoyNXB4O2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjIycHg7YWxpZ246bGVmdDsifSwiY29tcG9uZW50cyI6W3sidHlwZSI6InRleHRub2RlIiwiY29udGVudCI6IkEgZmlyc3QgbGluZSBvZiB0ZXh0In1dfSx7InRhZ05hbWUiOiJtai1zcGFjZXIiLCJ0eXBlIjoibWotc3BhY2VyIiwic3R5bGUiOnsiaGVpZ2h0IjoiNTBweCJ9LCJhdHRyaWJ1dGVzIjp7ImhlaWdodCI6IjUwcHgiLCJzdHlsZSI6ImhlaWdodDo1MHB4OyJ9LCJjb21wb25lbnRzIjpbeyJ0eXBlIjoidGV4dG5vZGUiLCJjb250ZW50IjoiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1dfV19XX0seyJ0eXBlIjoiY29tbWVudCIsImNvbnRlbnQiOiIgSW1hZ2UgSGVhZGVyICJ9LHsidGFnTmFtZSI6Im1qLXNlY3Rpb24iLCJ0eXBlIjoibWotc2VjdGlvbiIsInN0eWxlIjp7ImJhY2tncm91bmQtdXJsIjoiaHR0cDovLzEuYnAuYmxvZ3Nwb3QuY29tLy1UUHJmaHhiWXBEWS9VaDNSZWZ6azAySS9BQUFBQUFBQUx3OC81c1VKMFVVR1l1dy9zMTYwMC9OZXcrWW9yaytpbitUaGUrMTk2MCdzKy0rNzAncysoMikuanBnIiwiYmFja2dyb3VuZC1zaXplIjoiY292ZXIiLCJiYWNrZ3JvdW5kLXJlcGVhdCI6Im5vLXJlcGVhdCIsInBhZGRpbmctbGVmdCI6IjBweCIsInBhZGRpbmctcmlnaHQiOiIwcHgiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJ0ZXh0LWFsaWduIjoiY2VudGVyIn0sImF0dHJpYnV0ZXMiOnsiYmFja2dyb3VuZC11cmwiOiJodHRwOi8vMS5icC5ibG9nc3BvdC5jb20vLVRQcmZoeGJZcERZL1VoM1JlZnprMDJJL0FBQUFBQUFBTHc4LzVzVUowVVVHWXV3L3MxNjAwL05ldytZb3JrK2luK1RoZSsxOTYwJ3MrLSs3MCdzKygyKS5qcGciLCJiYWNrZ3JvdW5kLXNpemUiOiJjb3ZlciIsImJhY2tncm91bmQtcmVwZWF0Ijoibm8tcmVwZWF0IiwicGFkZGluZy1sZWZ0IjoiMHB4IiwicGFkZGluZy1yaWdodCI6IjBweCIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInRleHQtYWxpZ24iOiJjZW50ZXIiLCJzdHlsZSI6ImJhY2tncm91bmQtdXJsOmh0dHA6Ly8xLmJwLmJsb2dzcG90LmNvbS8tVFByZmh4YllwRFkvVWgzUmVmemswMkkvQUFBQUFBQUFMdzgvNXNVSjBVVUdZdXcvczE2MDAvTmV3K1lvcmsraW4rVGhlKzE5NjAncystKzcwJ3MrKDIpLmpwZztiYWNrZ3JvdW5kLXNpemU6Y292ZXI7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O3BhZGRpbmctbGVmdDowcHg7cGFkZGluZy1yaWdodDowcHg7cGFkZGluZy10b3A6MTBweDtwYWRkaW5nLWJvdHRvbToxMHB4O3RleHQtYWxpZ246Y2VudGVyOyJ9LCJjb21wb25lbnRzIjpbeyJ0YWdOYW1lIjoibWotY29sdW1uIiwidHlwZSI6Im1qLWNvbHVtbiIsInN0eWxlIjp7InZlcnRpY2FsLWFsaWduIjoidG9wIn0sImF0dHJpYnV0ZXMiOnsidmVydGljYWwtYWxpZ24iOiJ0b3AiLCJzdHlsZSI6InZlcnRpY2FsLWFsaWduOnRvcDsifSwiY29tcG9uZW50cyI6W3sidGFnTmFtZSI6Im1qLXRleHQiLCJ0eXBlIjoibWotdGV4dCIsInN0eWxlIjp7ImNzcy1jbGFzcyI6InNsb2dhbiIsImFsaWduIjoiY2VudGVyIiwiY29sb3IiOiIjZmZmIiwiZm9udC1zaXplIjoiNDBweCIsImZvbnQtZmFtaWx5IjoiSGVsdmV0aWNhIE5ldWUiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMjVweCIsInBhZGRpbmctbGVmdCI6IjI1cHgiLCJsaW5lLWhlaWdodCI6IjIycHgifSwiYXR0cmlidXRlcyI6eyJjc3MtY2xhc3MiOiJzbG9nYW4iLCJhbGlnbiI6ImNlbnRlciIsImNvbG9yIjoiI2ZmZiIsImZvbnQtc2l6ZSI6IjQwcHgiLCJmb250LWZhbWlseSI6IkhlbHZldGljYSBOZXVlIiwicGFkZGluZy10b3AiOiIxMHB4IiwicGFkZGluZy1ib3R0b20iOiIxMHB4IiwicGFkZGluZy1yaWdodCI6IjI1cHgiLCJwYWRkaW5nLWxlZnQiOiIyNXB4IiwibGluZS1oZWlnaHQiOiIyMnB4Iiwic3R5bGUiOiJjc3MtY2xhc3M6c2xvZ2FuO2FsaWduOmNlbnRlcjtjb2xvcjojZmZmO2ZvbnQtc2l6ZTo0MHB4O2ZvbnQtZmFtaWx5OkhlbHZldGljYSBOZXVlO3BhZGRpbmctdG9wOjEwcHg7cGFkZGluZy1ib3R0b206MTBweDtwYWRkaW5nLXJpZ2h0OjI1cHg7cGFkZGluZy1sZWZ0OjI1cHg7bGluZS1oZWlnaHQ6MjJweDsifSwiY29tcG9uZW50cyI6W3sidHlwZSI6InRleHRub2RlIiwiY29udGVudCI6IlNsb2dhbiBoZXJlIn1dfV19XX0seyJ0eXBlIjoiY29tbWVudCIsImNvbnRlbnQiOiIgSW50cm8gdGV4dCAifSx7InRhZ05hbWUiOiJtai13cmFwcGVyIiwidHlwZSI6Im1qLXdyYXBwZXIiLCJzdHlsZSI6eyJiYWNrZ3JvdW5kLWNvbG9yIjoiI2ZmZTlmNyIsInBhZGRpbmciOiIxMHB4In0sImF0dHJpYnV0ZXMiOnsiYmFja2dyb3VuZC1jb2xvciI6IiNmZmU5ZjciLCJwYWRkaW5nIjoiMTBweCIsInN0eWxlIjoiYmFja2dyb3VuZC1jb2xvcjojZmZlOWY3O3BhZGRpbmc6MTBweDsifSwiY29tcG9uZW50cyI6W3sidGFnTmFtZSI6Im1qLXNlY3Rpb24iLCJ0eXBlIjoibWotc2VjdGlvbiIsInN0eWxlIjp7ImJhY2tncm91bmQtY29sb3IiOiIjZWFlZmZhIiwicGFkZGluZy1sZWZ0IjoiMHB4IiwicGFkZGluZy1yaWdodCI6IjBweCIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInRleHQtYWxpZ24iOiJjZW50ZXIifSwiYXR0cmlidXRlcyI6eyJiYWNrZ3JvdW5kLWNvbG9yIjoiI2VhZWZmYSIsInBhZGRpbmctbGVmdCI6IjBweCIsInBhZGRpbmctcmlnaHQiOiIwcHgiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJ0ZXh0LWFsaWduIjoiY2VudGVyIiwic3R5bGUiOiJiYWNrZ3JvdW5kLWNvbG9yOiNlYWVmZmE7cGFkZGluZy1sZWZ0OjBweDtwYWRkaW5nLXJpZ2h0OjBweDtwYWRkaW5nLXRvcDoxMHB4O3BhZGRpbmctYm90dG9tOjEwcHg7dGV4dC1hbGlnbjpjZW50ZXI7In0sImNvbXBvbmVudHMiOlt7InRhZ05hbWUiOiJtai1ncm91cCIsInR5cGUiOiJtai1ncm91cCIsInN0eWxlIjp7ImJhY2tncm91bmQtY29sb3IiOiIjZmZmYWRkIiwidmVydGljYWwtYWxpZ24iOiJ0b3AifSwiYXR0cmlidXRlcyI6eyJiYWNrZ3JvdW5kLWNvbG9yIjoiI2ZmZmFkZCIsInZlcnRpY2FsLWFsaWduIjoidG9wIiwic3R5bGUiOiJiYWNrZ3JvdW5kLWNvbG9yOiNmZmZhZGQ7dmVydGljYWwtYWxpZ246dG9wOyJ9LCJjb21wb25lbnRzIjpbeyJ0YWdOYW1lIjoibWotY29sdW1uIiwidHlwZSI6Im1qLWNvbHVtbiIsInN0eWxlIjp7InZlcnRpY2FsLWFsaWduIjoidG9wIn0sImF0dHJpYnV0ZXMiOnsidmVydGljYWwtYWxpZ24iOiJ0b3AiLCJzdHlsZSI6InZlcnRpY2FsLWFsaWduOnRvcDsifSwiY29tcG9uZW50cyI6W3sidGFnTmFtZSI6Im1qLXRleHQiLCJ0eXBlIjoibWotdGV4dCIsInN0eWxlIjp7ImZvbnQtc3R5bGUiOiJpdGFsaWMiLCJmb250LXNpemUiOiIyMHB4IiwiZm9udC1mYW1pbHkiOiJIZWx2ZXRpY2EgTmV1ZSIsImNvbG9yIjoiIzYyNjI2MiIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInBhZGRpbmctcmlnaHQiOiIyNXB4IiwicGFkZGluZy1sZWZ0IjoiMjVweCIsImxpbmUtaGVpZ2h0IjoiMjJweCIsImFsaWduIjoibGVmdCJ9LCJhdHRyaWJ1dGVzIjp7ImZvbnQtc3R5bGUiOiJpdGFsaWMiLCJmb250LXNpemUiOiIyMHB4IiwiZm9udC1mYW1pbHkiOiJIZWx2ZXRpY2EgTmV1ZSIsImNvbG9yIjoiIzYyNjI2MiIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInBhZGRpbmctcmlnaHQiOiIyNXB4IiwicGFkZGluZy1sZWZ0IjoiMjVweCIsImxpbmUtaGVpZ2h0IjoiMjJweCIsImFsaWduIjoibGVmdCIsInN0eWxlIjoiZm9udC1zdHlsZTppdGFsaWM7Zm9udC1zaXplOjIwcHg7Zm9udC1mYW1pbHk6SGVsdmV0aWNhIE5ldWU7Y29sb3I6IzYyNjI2MjtwYWRkaW5nLXRvcDoxMHB4O3BhZGRpbmctYm90dG9tOjEwcHg7cGFkZGluZy1yaWdodDoyNXB4O3BhZGRpbmctbGVmdDoyNXB4O2xpbmUtaGVpZ2h0OjIycHg7YWxpZ246bGVmdDsifSwiY29tcG9uZW50cyI6W3sidHlwZSI6InRleHRub2RlIiwiY29udGVudCI6Ik15IEF3ZXNvbWUgVGV4dCJ9XX0seyJ0YWdOYW1lIjoibWotdGV4dCIsInR5cGUiOiJtai10ZXh0Iiwic3R5bGUiOnsiY29sb3IiOiIjNTI1MjUyIiwicGFkZGluZy10b3AiOiIxMHB4IiwicGFkZGluZy1ib3R0b20iOiIxMHB4IiwicGFkZGluZy1yaWdodCI6IjI1cHgiLCJwYWRkaW5nLWxlZnQiOiIyNXB4IiwiZm9udC1zaXplIjoiMTNweCIsImxpbmUtaGVpZ2h0IjoiMjJweCIsImFsaWduIjoibGVmdCJ9LCJhdHRyaWJ1dGVzIjp7ImNvbG9yIjoiIzUyNTI1MiIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInBhZGRpbmctcmlnaHQiOiIyNXB4IiwicGFkZGluZy1sZWZ0IjoiMjVweCIsImZvbnQtc2l6ZSI6IjEzcHgiLCJsaW5lLWhlaWdodCI6IjIycHgiLCJhbGlnbiI6ImxlZnQiLCJzdHlsZSI6ImNvbG9yOiM1MjUyNTI7cGFkZGluZy10b3A6MTBweDtwYWRkaW5nLWJvdHRvbToxMHB4O3BhZGRpbmctcmlnaHQ6MjVweDtwYWRkaW5nLWxlZnQ6MjVweDtmb250LXNpemU6MTNweDtsaW5lLWhlaWdodDoyMnB4O2FsaWduOmxlZnQ7In0sImNvbXBvbmVudHMiOlt7InR5cGUiOiJ0ZXh0bm9kZSIsImNvbnRlbnQiOiJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gUHJvaW4gcnV0cnVtIGVuaW0gZWdldCBtYWduYSBlZmZpY2l0dXIsIGV1IHNlbXBlciBhdWd1ZSBzZW1wZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaXF1YW0gZXJhdCB2b2x1dHBhdC4gQ3JhcyBpZCBkdWkgbGVjdHVzLiBWZXN0aWJ1bHVtIHNlZCBmaW5pYnVzIGxlY3R1cywgc2l0IGFtZXQgc3VzY2lwaXQgbmliaC4gUHJvaW4gbmVjXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vZG8gcHVydXMuIFNlZCBlZ2V0IG51bGxhIGVsaXQuIE51bGxhIGFsaXF1ZXQgbW9sbGlzIGZhdWNpYnVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XX0seyJ0YWdOYW1lIjoibWotYnV0dG9uIiwidHlwZSI6Im1qLWJ1dHRvbiIsInN0eWxlIjp7ImJhY2tncm91bmQtY29sb3IiOiIjRjQ1RTQzIiwiaHJlZiI6IiMiLCJib3JkZXItcmFkaXVzIjoiM3B4IiwiZm9udC1zaXplIjoiMTNweCIsImZvbnQtd2VpZ2h0IjoiNDAwIiwiY29sb3IiOiIjZmZmZmZmIiwidmVydGljYWwtYWxpZ24iOiJtaWRkbGUiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMjVweCIsInBhZGRpbmctbGVmdCI6IjI1cHgiLCJhbGlnbiI6ImNlbnRlciJ9LCJhdHRyaWJ1dGVzIjp7ImJhY2tncm91bmQtY29sb3IiOiIjRjQ1RTQzIiwiaHJlZiI6IiMiLCJib3JkZXItcmFkaXVzIjoiM3B4IiwiZm9udC1zaXplIjoiMTNweCIsImZvbnQtd2VpZ2h0IjoiNDAwIiwiY29sb3IiOiIjZmZmZmZmIiwidmVydGljYWwtYWxpZ24iOiJtaWRkbGUiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMjVweCIsInBhZGRpbmctbGVmdCI6IjI1cHgiLCJhbGlnbiI6ImNlbnRlciIsInN0eWxlIjoiYmFja2dyb3VuZC1jb2xvcjojRjQ1RTQzO2hyZWY6Iztib3JkZXItcmFkaXVzOjNweDtmb250LXNpemU6MTNweDtmb250LXdlaWdodDo0MDA7Y29sb3I6I2ZmZmZmZjt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7cGFkZGluZy10b3A6MTBweDtwYWRkaW5nLWJvdHRvbToxMHB4O3BhZGRpbmctcmlnaHQ6MjVweDtwYWRkaW5nLWxlZnQ6MjVweDthbGlnbjpjZW50ZXI7In0sImNvbXBvbmVudHMiOlt7InR5cGUiOiJ0ZXh0bm9kZSIsImNvbnRlbnQiOiJMZWFybiBtb3JlIn1dfV19XX1dfV19LHsidHlwZSI6ImNvbW1lbnQiLCJjb250ZW50IjoiIFNpZGUgaW1hZ2UgIn0seyJ0YWdOYW1lIjoibWotc2VjdGlvbiIsInR5cGUiOiJtai1zZWN0aW9uIiwic3R5bGUiOnsiYmFja2dyb3VuZC1jb2xvciI6IndoaXRlIiwicGFkZGluZy1sZWZ0IjoiMHB4IiwicGFkZGluZy1yaWdodCI6IjBweCIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInRleHQtYWxpZ24iOiJjZW50ZXIifSwiYXR0cmlidXRlcyI6eyJiYWNrZ3JvdW5kLWNvbG9yIjoid2hpdGUiLCJwYWRkaW5nLWxlZnQiOiIwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMHB4IiwicGFkZGluZy10b3AiOiIxMHB4IiwicGFkZGluZy1ib3R0b20iOiIxMHB4IiwidGV4dC1hbGlnbiI6ImNlbnRlciIsInN0eWxlIjoiYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTtwYWRkaW5nLWxlZnQ6MHB4O3BhZGRpbmctcmlnaHQ6MHB4O3BhZGRpbmctdG9wOjEwcHg7cGFkZGluZy1ib3R0b206MTBweDt0ZXh0LWFsaWduOmNlbnRlcjsifSwiY29tcG9uZW50cyI6W3sidGFnTmFtZSI6Im1qLWNvbHVtbiIsInR5cGUiOiJtai1jb2x1bW4iLCJzdHlsZSI6eyJ2ZXJ0aWNhbC1hbGlnbiI6InRvcCJ9LCJhdHRyaWJ1dGVzIjp7InZlcnRpY2FsLWFsaWduIjoidG9wIiwic3R5bGUiOiJ2ZXJ0aWNhbC1hbGlnbjp0b3A7In0sImNvbXBvbmVudHMiOlt7InRhZ05hbWUiOiJtai1pbWFnZSIsInR5cGUiOiJtai1pbWFnZSIsInN0eWxlIjp7IndpZHRoIjoiMjAwcHgiLCJzcmMiOiJodHRwczovL2Rlc2lnbnNwZWxsLmZpbGVzLndvcmRwcmVzcy5jb20vMjAxMi8wMS9zY2lvbGluby1wYXJpcy1idy5qcGciLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMjVweCIsInBhZGRpbmctbGVmdCI6IjI1cHgiLCJhbGlnbiI6ImNlbnRlciJ9LCJhdHRyaWJ1dGVzIjp7IndpZHRoIjoiMjAwcHgiLCJzcmMiOiJodHRwczovL2Rlc2lnbnNwZWxsLmZpbGVzLndvcmRwcmVzcy5jb20vMjAxMi8wMS9zY2lvbGluby1wYXJpcy1idy5qcGciLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMjVweCIsInBhZGRpbmctbGVmdCI6IjI1cHgiLCJhbGlnbiI6ImNlbnRlciIsInN0eWxlIjoid2lkdGg6MjAwcHg7c3JjOmh0dHBzOi8vZGVzaWduc3BlbGwuZmlsZXMud29yZHByZXNzLmNvbS8yMDEyLzAxL3NjaW9saW5vLXBhcmlzLWJ3LmpwZztwYWRkaW5nLXRvcDoxMHB4O3BhZGRpbmctYm90dG9tOjEwcHg7cGFkZGluZy1yaWdodDoyNXB4O3BhZGRpbmctbGVmdDoyNXB4O2FsaWduOmNlbnRlcjsifSwiY29tcG9uZW50cyI6W3sidHlwZSI6InRleHRub2RlIiwiY29udGVudCI6IlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XX1dfSx7InRhZ05hbWUiOiJtai1jb2x1bW4iLCJ0eXBlIjoibWotY29sdW1uIiwic3R5bGUiOnsidmVydGljYWwtYWxpZ24iOiJ0b3AifSwiYXR0cmlidXRlcyI6eyJ2ZXJ0aWNhbC1hbGlnbiI6InRvcCIsInN0eWxlIjoidmVydGljYWwtYWxpZ246dG9wOyJ9LCJjb21wb25lbnRzIjpbeyJ0YWdOYW1lIjoibWotdGV4dCIsInR5cGUiOiJtai10ZXh0Iiwic3R5bGUiOnsiZm9udC1zdHlsZSI6Iml0YWxpYyIsImZvbnQtc2l6ZSI6IjIwcHgiLCJmb250LWZhbWlseSI6IkhlbHZldGljYSBOZXVlIiwiY29sb3IiOiIjNjI2MjYyIiwicGFkZGluZy10b3AiOiIxMHB4IiwicGFkZGluZy1ib3R0b20iOiIxMHB4IiwicGFkZGluZy1yaWdodCI6IjI1cHgiLCJwYWRkaW5nLWxlZnQiOiIyNXB4IiwibGluZS1oZWlnaHQiOiIyMnB4IiwiYWxpZ24iOiJsZWZ0In0sImF0dHJpYnV0ZXMiOnsiZm9udC1zdHlsZSI6Iml0YWxpYyIsImZvbnQtc2l6ZSI6IjIwcHgiLCJmb250LWZhbWlseSI6IkhlbHZldGljYSBOZXVlIiwiY29sb3IiOiIjNjI2MjYyIiwicGFkZGluZy10b3AiOiIxMHB4IiwicGFkZGluZy1ib3R0b20iOiIxMHB4IiwicGFkZGluZy1yaWdodCI6IjI1cHgiLCJwYWRkaW5nLWxlZnQiOiIyNXB4IiwibGluZS1oZWlnaHQiOiIyMnB4IiwiYWxpZ24iOiJsZWZ0Iiwic3R5bGUiOiJmb250LXN0eWxlOml0YWxpYztmb250LXNpemU6MjBweDtmb250LWZhbWlseTpIZWx2ZXRpY2EgTmV1ZTtjb2xvcjojNjI2MjYyO3BhZGRpbmctdG9wOjEwcHg7cGFkZGluZy1ib3R0b206MTBweDtwYWRkaW5nLXJpZ2h0OjI1cHg7cGFkZGluZy1sZWZ0OjI1cHg7bGluZS1oZWlnaHQ6MjJweDthbGlnbjpsZWZ0OyJ9LCJjb21wb25lbnRzIjpbeyJ0eXBlIjoidGV4dG5vZGUiLCJjb250ZW50IjoiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5kIGFtYXppbmcgcGxhY2VzIC4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifV19LHsidGFnTmFtZSI6Im1qLXRleHQiLCJ0eXBlIjoibWotdGV4dCIsInN0eWxlIjp7ImNvbG9yIjoiIzUyNTI1MiIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInBhZGRpbmctcmlnaHQiOiIyNXB4IiwicGFkZGluZy1sZWZ0IjoiMjVweCIsImZvbnQtc2l6ZSI6IjEzcHgiLCJsaW5lLWhlaWdodCI6IjIycHgiLCJhbGlnbiI6ImxlZnQifSwiYXR0cmlidXRlcyI6eyJjb2xvciI6IiM1MjUyNTIiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMjVweCIsInBhZGRpbmctbGVmdCI6IjI1cHgiLCJmb250LXNpemUiOiIxM3B4IiwibGluZS1oZWlnaHQiOiIyMnB4IiwiYWxpZ24iOiJsZWZ0Iiwic3R5bGUiOiJjb2xvcjojNTI1MjUyO3BhZGRpbmctdG9wOjEwcHg7cGFkZGluZy1ib3R0b206MTBweDtwYWRkaW5nLXJpZ2h0OjI1cHg7cGFkZGluZy1sZWZ0OjI1cHg7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MjJweDthbGlnbjpsZWZ0OyJ9LCJjb21wb25lbnRzIjpbeyJ0eXBlIjoidGV4dG5vZGUiLCJjb250ZW50IjoiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LiBQcm9pbiBydXRydW0gZW5pbSBlZ2V0IG1hZ25hIGVmZmljaXR1ciwgZXUgc2VtcGVyIGF1Z3VlIHNlbXBlci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaXF1YW0gZXJhdCB2b2x1dHBhdC4gQ3JhcyBpZCBkdWkgbGVjdHVzLiBWZXN0aWJ1bHVtIHNlZCBmaW5pYnVzIGxlY3R1cy4ifV19XX1dfSx7InRhZ05hbWUiOiJtai1zZWN0aW9uIiwidHlwZSI6Im1qLXNlY3Rpb24iLCJzdHlsZSI6eyJwYWRkaW5nLWxlZnQiOiIwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMHB4IiwicGFkZGluZy10b3AiOiIxMHB4IiwicGFkZGluZy1ib3R0b20iOiIxMHB4IiwidGV4dC1hbGlnbiI6ImNlbnRlciJ9LCJhdHRyaWJ1dGVzIjp7InBhZGRpbmctbGVmdCI6IjBweCIsInBhZGRpbmctcmlnaHQiOiIwcHgiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJ0ZXh0LWFsaWduIjoiY2VudGVyIiwic3R5bGUiOiJwYWRkaW5nLWxlZnQ6MHB4O3BhZGRpbmctcmlnaHQ6MHB4O3BhZGRpbmctdG9wOjEwcHg7cGFkZGluZy1ib3R0b206MTBweDt0ZXh0LWFsaWduOmNlbnRlcjsifSwiY29tcG9uZW50cyI6W3sidGFnTmFtZSI6Im1qLWNvbHVtbiIsInR5cGUiOiJtai1jb2x1bW4iLCJzdHlsZSI6eyJ2ZXJ0aWNhbC1hbGlnbiI6InRvcCJ9LCJhdHRyaWJ1dGVzIjp7InZlcnRpY2FsLWFsaWduIjoidG9wIiwic3R5bGUiOiJ2ZXJ0aWNhbC1hbGlnbjp0b3A7In0sImNvbXBvbmVudHMiOlt7InRhZ05hbWUiOiJtai10ZXh0IiwidHlwZSI6Im1qLXRleHQiLCJzdHlsZSI6eyJmb250LXN0eWxlIjoiaXRhbGljIiwiZm9udC1zaXplIjoiMjBweCIsImZvbnQtZmFtaWx5IjoiSGVsdmV0aWNhIE5ldWUiLCJjb2xvciI6IiM2MjYyNjIiLCJhbGlnbiI6ImNlbnRlciIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInBhZGRpbmctcmlnaHQiOiIyNXB4IiwicGFkZGluZy1sZWZ0IjoiMjVweCIsImxpbmUtaGVpZ2h0IjoiMjJweCJ9LCJhdHRyaWJ1dGVzIjp7ImZvbnQtc3R5bGUiOiJpdGFsaWMiLCJmb250LXNpemUiOiIyMHB4IiwiZm9udC1mYW1pbHkiOiJIZWx2ZXRpY2EgTmV1ZSIsImNvbG9yIjoiIzYyNjI2MiIsImFsaWduIjoiY2VudGVyIiwicGFkZGluZy10b3AiOiIxMHB4IiwicGFkZGluZy1ib3R0b20iOiIxMHB4IiwicGFkZGluZy1yaWdodCI6IjI1cHgiLCJwYWRkaW5nLWxlZnQiOiIyNXB4IiwibGluZS1oZWlnaHQiOiIyMnB4Iiwic3R5bGUiOiJmb250LXN0eWxlOml0YWxpYztmb250LXNpemU6MjBweDtmb250LWZhbWlseTpIZWx2ZXRpY2EgTmV1ZTtjb2xvcjojNjI2MjYyO2FsaWduOmNlbnRlcjtwYWRkaW5nLXRvcDoxMHB4O3BhZGRpbmctYm90dG9tOjEwcHg7cGFkZGluZy1yaWdodDoyNXB4O3BhZGRpbmctbGVmdDoyNXB4O2xpbmUtaGVpZ2h0OjIycHg7In0sImNvbXBvbmVudHMiOlt7InR5cGUiOiJ0ZXh0bm9kZSIsImNvbnRlbnQiOiJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiB3aXRoIHJlYWwtbGlmZSBpbWFnZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1dfV19XX0seyJ0YWdOYW1lIjoibWotcmF3IiwidHlwZSI6Im1qLXJhdyIsImNvbXBvbmVudHMiOlt7ImNsYXNzZXMiOlsiY29udGFpbmVyIl0sImNvbXBvbmVudHMiOlt7InR5cGUiOiJpbWFnZSIsInJlc2l6YWJsZSI6eyJyYXRpb0RlZmF1bHQiOjF9LCJjbGFzc2VzIjpbIml0ZW0iXSwiYXR0cmlidXRlcyI6eyJzcmMiOiJodHRwczovL3NvdXJjZS51bnNwbGFzaC5jb20vcmFuZG9tLzIwMHgxNDE/cmFuZG9tIiwiYWx0IjoiRXhhbXBsZSBpbWFnZSJ9fSx7InR5cGUiOiJpbWFnZSIsInJlc2l6YWJsZSI6eyJyYXRpb0RlZmF1bHQiOjF9LCJjbGFzc2VzIjpbIml0ZW0iXSwiYXR0cmlidXRlcyI6eyJzcmMiOiJodHRwczovL3NvdXJjZS51bnNwbGFzaC5jb20vcmFuZG9tLzIwMHgxNDI/cmFuZG9tIiwiYWx0IjoiRXhhbXBsZSBpbWFnZSJ9fSx7InR5cGUiOiJpbWFnZSIsInJlc2l6YWJsZSI6eyJyYXRpb0RlZmF1bHQiOjF9LCJjbGFzc2VzIjpbIml0ZW0iXSwiYXR0cmlidXRlcyI6eyJzcmMiOiJodHRwczovL3NvdXJjZS51bnNwbGFzaC5jb20vcmFuZG9tLzIwMHgxNDM/cmFuZG9tIiwiYWx0IjoiRXhhbXBsZSBpbWFnZSJ9fSx7InR5cGUiOiJpbWFnZSIsInJlc2l6YWJsZSI6eyJyYXRpb0RlZmF1bHQiOjF9LCJjbGFzc2VzIjpbIml0ZW0iXSwiYXR0cmlidXRlcyI6eyJzcmMiOiJodHRwczovL3NvdXJjZS51bnNwbGFzaC5jb20vcmFuZG9tLzIwMHgxNDQ/cmFuZG9tIiwiYWx0IjoiRXhhbXBsZSBpbWFnZSJ9fSx7InR5cGUiOiJpbWFnZSIsInJlc2l6YWJsZSI6eyJyYXRpb0RlZmF1bHQiOjF9LCJjbGFzc2VzIjpbIml0ZW0iXSwiYXR0cmlidXRlcyI6eyJzcmMiOiJodHRwczovL3NvdXJjZS51bnNwbGFzaC5jb20vcmFuZG9tLzIwMHgxNDU/cmFuZG9tIiwiYWx0IjoiRXhhbXBsZSBpbWFnZSJ9fSx7InR5cGUiOiJpbWFnZSIsInJlc2l6YWJsZSI6eyJyYXRpb0RlZmF1bHQiOjF9LCJjbGFzc2VzIjpbIml0ZW0iXSwiYXR0cmlidXRlcyI6eyJzcmMiOiJodHRwczovL3NvdXJjZS51bnNwbGFzaC5jb20vcmFuZG9tLzIwMHgxNDY/cmFuZG9tIiwiYWx0IjoiRXhhbXBsZSBpbWFnZSJ9fV19XX0seyJ0eXBlIjoiY29tbWVudCIsImNvbnRlbnQiOiIgSWNvbnMgIn0seyJ0YWdOYW1lIjoibWotc2VjdGlvbiIsInR5cGUiOiJtai1zZWN0aW9uIiwic3R5bGUiOnsiYmFja2dyb3VuZC1jb2xvciI6IiNmYmZiZmIiLCJwYWRkaW5nLWxlZnQiOiIwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMHB4IiwicGFkZGluZy10b3AiOiIxMHB4IiwicGFkZGluZy1ib3R0b20iOiIxMHB4IiwidGV4dC1hbGlnbiI6ImNlbnRlciJ9LCJhdHRyaWJ1dGVzIjp7ImJhY2tncm91bmQtY29sb3IiOiIjZmJmYmZiIiwicGFkZGluZy1sZWZ0IjoiMHB4IiwicGFkZGluZy1yaWdodCI6IjBweCIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInRleHQtYWxpZ24iOiJjZW50ZXIiLCJzdHlsZSI6ImJhY2tncm91bmQtY29sb3I6I2ZiZmJmYjtwYWRkaW5nLWxlZnQ6MHB4O3BhZGRpbmctcmlnaHQ6MHB4O3BhZGRpbmctdG9wOjEwcHg7cGFkZGluZy1ib3R0b206MTBweDt0ZXh0LWFsaWduOmNlbnRlcjsifSwiY29tcG9uZW50cyI6W3sidGFnTmFtZSI6Im1qLWNvbHVtbiIsInR5cGUiOiJtai1jb2x1bW4iLCJzdHlsZSI6eyJ2ZXJ0aWNhbC1hbGlnbiI6InRvcCJ9LCJhdHRyaWJ1dGVzIjp7InZlcnRpY2FsLWFsaWduIjoidG9wIiwic3R5bGUiOiJ2ZXJ0aWNhbC1hbGlnbjp0b3A7In0sImNvbXBvbmVudHMiOlt7InRhZ05hbWUiOiJtai1pbWFnZSIsInR5cGUiOiJtai1pbWFnZSIsInN0eWxlIjp7IndpZHRoIjoiMTAwcHgiLCJzcmMiOiJodHRwOi8vMTkxbi5tai5hbS9pbWcvMTkxbi8zcy94MGwucG5nIiwicGFkZGluZy10b3AiOiIxMHB4IiwicGFkZGluZy1ib3R0b20iOiIxMHB4IiwicGFkZGluZy1yaWdodCI6IjI1cHgiLCJwYWRkaW5nLWxlZnQiOiIyNXB4IiwiYWxpZ24iOiJjZW50ZXIifSwiYXR0cmlidXRlcyI6eyJ3aWR0aCI6IjEwMHB4Iiwic3JjIjoiaHR0cDovLzE5MW4ubWouYW0vaW1nLzE5MW4vM3MveDBsLnBuZyIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInBhZGRpbmctcmlnaHQiOiIyNXB4IiwicGFkZGluZy1sZWZ0IjoiMjVweCIsImFsaWduIjoiY2VudGVyIiwic3R5bGUiOiJ3aWR0aDoxMDBweDtzcmM6aHR0cDovLzE5MW4ubWouYW0vaW1nLzE5MW4vM3MveDBsLnBuZztwYWRkaW5nLXRvcDoxMHB4O3BhZGRpbmctYm90dG9tOjEwcHg7cGFkZGluZy1yaWdodDoyNXB4O3BhZGRpbmctbGVmdDoyNXB4O2FsaWduOmNlbnRlcjsifSwiY29tcG9uZW50cyI6W3sidHlwZSI6InRleHRub2RlIiwiY29udGVudCI6IlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XX1dfSx7InRhZ05hbWUiOiJtai1jb2x1bW4iLCJ0eXBlIjoibWotY29sdW1uIiwic3R5bGUiOnsidmVydGljYWwtYWxpZ24iOiJ0b3AifSwiYXR0cmlidXRlcyI6eyJ2ZXJ0aWNhbC1hbGlnbiI6InRvcCIsInN0eWxlIjoidmVydGljYWwtYWxpZ246dG9wOyJ9LCJjb21wb25lbnRzIjpbeyJ0YWdOYW1lIjoibWotaW1hZ2UiLCJ0eXBlIjoibWotaW1hZ2UiLCJzdHlsZSI6eyJ3aWR0aCI6IjEwMHB4Iiwic3JjIjoiaHR0cDovLzE5MW4ubWouYW0vaW1nLzE5MW4vM3MveDAxLnBuZyIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInBhZGRpbmctcmlnaHQiOiIyNXB4IiwicGFkZGluZy1sZWZ0IjoiMjVweCIsImFsaWduIjoiY2VudGVyIn0sImF0dHJpYnV0ZXMiOnsid2lkdGgiOiIxMDBweCIsInNyYyI6Imh0dHA6Ly8xOTFuLm1qLmFtL2ltZy8xOTFuLzNzL3gwMS5wbmciLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMjVweCIsInBhZGRpbmctbGVmdCI6IjI1cHgiLCJhbGlnbiI6ImNlbnRlciIsInN0eWxlIjoid2lkdGg6MTAwcHg7c3JjOmh0dHA6Ly8xOTFuLm1qLmFtL2ltZy8xOTFuLzNzL3gwMS5wbmc7cGFkZGluZy10b3A6MTBweDtwYWRkaW5nLWJvdHRvbToxMHB4O3BhZGRpbmctcmlnaHQ6MjVweDtwYWRkaW5nLWxlZnQ6MjVweDthbGlnbjpjZW50ZXI7In0sImNvbXBvbmVudHMiOlt7InR5cGUiOiJ0ZXh0bm9kZSIsImNvbnRlbnQiOiJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAifV19XX0seyJ0YWdOYW1lIjoibWotY29sdW1uIiwidHlwZSI6Im1qLWNvbHVtbiIsInN0eWxlIjp7InZlcnRpY2FsLWFsaWduIjoidG9wIn0sImF0dHJpYnV0ZXMiOnsidmVydGljYWwtYWxpZ24iOiJ0b3AiLCJzdHlsZSI6InZlcnRpY2FsLWFsaWduOnRvcDsifSwiY29tcG9uZW50cyI6W3sidGFnTmFtZSI6Im1qLWltYWdlIiwidHlwZSI6Im1qLWltYWdlIiwic3R5bGUiOnsid2lkdGgiOiIxMDBweCIsInNyYyI6Imh0dHA6Ly8xOTFuLm1qLmFtL2ltZy8xOTFuLzNzL3gwcy5wbmciLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMjVweCIsInBhZGRpbmctbGVmdCI6IjI1cHgiLCJhbGlnbiI6ImNlbnRlciJ9LCJhdHRyaWJ1dGVzIjp7IndpZHRoIjoiMTAwcHgiLCJzcmMiOiJodHRwOi8vMTkxbi5tai5hbS9pbWcvMTkxbi8zcy94MHMucG5nIiwicGFkZGluZy10b3AiOiIxMHB4IiwicGFkZGluZy1ib3R0b20iOiIxMHB4IiwicGFkZGluZy1yaWdodCI6IjI1cHgiLCJwYWRkaW5nLWxlZnQiOiIyNXB4IiwiYWxpZ24iOiJjZW50ZXIiLCJzdHlsZSI6IndpZHRoOjEwMHB4O3NyYzpodHRwOi8vMTkxbi5tai5hbS9pbWcvMTkxbi8zcy94MHMucG5nO3BhZGRpbmctdG9wOjEwcHg7cGFkZGluZy1ib3R0b206MTBweDtwYWRkaW5nLXJpZ2h0OjI1cHg7cGFkZGluZy1sZWZ0OjI1cHg7YWxpZ246Y2VudGVyOyJ9LCJjb21wb25lbnRzIjpbeyJ0eXBlIjoidGV4dG5vZGUiLCJjb250ZW50IjoiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1dfV19XX0seyJ0eXBlIjoiY29tbWVudCIsImNvbnRlbnQiOiIgRm9vdGVyICJ9LHsidGFnTmFtZSI6Im1qLXNlY3Rpb24iLCJ0eXBlIjoibWotc2VjdGlvbiIsInN0eWxlIjp7ImJhY2tncm91bmQtY29sb3IiOiIjZTdlN2U3IiwicGFkZGluZy1sZWZ0IjoiMHB4IiwicGFkZGluZy1yaWdodCI6IjBweCIsInBhZGRpbmctdG9wIjoiMTBweCIsInBhZGRpbmctYm90dG9tIjoiMTBweCIsInRleHQtYWxpZ24iOiJjZW50ZXIifSwiYXR0cmlidXRlcyI6eyJiYWNrZ3JvdW5kLWNvbG9yIjoiI2U3ZTdlNyIsInBhZGRpbmctbGVmdCI6IjBweCIsInBhZGRpbmctcmlnaHQiOiIwcHgiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJ0ZXh0LWFsaWduIjoiY2VudGVyIiwic3R5bGUiOiJiYWNrZ3JvdW5kLWNvbG9yOiNlN2U3ZTc7cGFkZGluZy1sZWZ0OjBweDtwYWRkaW5nLXJpZ2h0OjBweDtwYWRkaW5nLXRvcDoxMHB4O3BhZGRpbmctYm90dG9tOjEwcHg7dGV4dC1hbGlnbjpjZW50ZXI7In0sImNvbXBvbmVudHMiOlt7InRhZ05hbWUiOiJtai1jb2x1bW4iLCJ0eXBlIjoibWotY29sdW1uIiwic3R5bGUiOnsidmVydGljYWwtYWxpZ24iOiJ0b3AifSwiYXR0cmlidXRlcyI6eyJ2ZXJ0aWNhbC1hbGlnbiI6InRvcCIsInN0eWxlIjoidmVydGljYWwtYWxpZ246dG9wOyJ9LCJjb21wb25lbnRzIjpbeyJ0YWdOYW1lIjoibWotYnV0dG9uIiwidHlwZSI6Im1qLWJ1dHRvbiIsInN0eWxlIjp7ImhyZWYiOiIjIiwiYmFja2dyb3VuZC1jb2xvciI6IiM0MTQxNDEiLCJib3JkZXItcmFkaXVzIjoiM3B4IiwiZm9udC1zaXplIjoiMTNweCIsImZvbnQtd2VpZ2h0IjoiNDAwIiwiY29sb3IiOiIjZmZmZmZmIiwidmVydGljYWwtYWxpZ24iOiJtaWRkbGUiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMjVweCIsInBhZGRpbmctbGVmdCI6IjI1cHgiLCJhbGlnbiI6ImNlbnRlciJ9LCJhdHRyaWJ1dGVzIjp7ImhyZWYiOiIjIiwiYmFja2dyb3VuZC1jb2xvciI6IiM0MTQxNDEiLCJib3JkZXItcmFkaXVzIjoiM3B4IiwiZm9udC1zaXplIjoiMTNweCIsImZvbnQtd2VpZ2h0IjoiNDAwIiwiY29sb3IiOiIjZmZmZmZmIiwidmVydGljYWwtYWxpZ24iOiJtaWRkbGUiLCJwYWRkaW5nLXRvcCI6IjEwcHgiLCJwYWRkaW5nLWJvdHRvbSI6IjEwcHgiLCJwYWRkaW5nLXJpZ2h0IjoiMjVweCIsInBhZGRpbmctbGVmdCI6IjI1cHgiLCJhbGlnbiI6ImNlbnRlciIsInN0eWxlIjoiaHJlZjojO2JhY2tncm91bmQtY29sb3I6IzQxNDE0MTtib3JkZXItcmFkaXVzOjNweDtmb250LXNpemU6MTNweDtmb250LXdlaWdodDo0MDA7Y29sb3I6I2ZmZmZmZjt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7cGFkZGluZy10b3A6MTBweDtwYWRkaW5nLWJvdHRvbToxMHB4O3BhZGRpbmctcmlnaHQ6MjVweDtwYWRkaW5nLWxlZnQ6MjVweDthbGlnbjpjZW50ZXI7In0sImNvbXBvbmVudHMiOlt7InR5cGUiOiJ0ZXh0bm9kZSIsImNvbnRlbnQiOiJIZWxsbyBUaGVyZSEifV19LHsidGFnTmFtZSI6Im1qLXNvY2lhbCIsInR5cGUiOiJtai1zb2NpYWwiLCJzdHlsZSI6eyJmb250LXNpemUiOiIxNXB4IiwiaWNvbi1zaXplIjoiMzBweCIsIm1vZGUiOiJob3Jpem9udGFsIiwiYWxpZ24iOiJjZW50ZXIiLCJsaW5lLWhlaWdodCI6IjIycHgifSwiYXR0cmlidXRlcyI6eyJmb250LXNpemUiOiIxNXB4IiwiaWNvbi1zaXplIjoiMzBweCIsIm1vZGUiOiJob3Jpem9udGFsIiwiYWxpZ24iOiJjZW50ZXIiLCJsaW5lLWhlaWdodCI6IjIycHgiLCJzdHlsZSI6ImZvbnQtc2l6ZToxNXB4O2ljb24tc2l6ZTozMHB4O21vZGU6aG9yaXpvbnRhbDthbGlnbjpjZW50ZXI7bGluZS1oZWlnaHQ6MjJweDsifSwiY29tcG9uZW50cyI6W3sidGFnTmFtZSI6Im1qLXNvY2lhbC1lbGVtZW50IiwidHlwZSI6Im1qLXNvY2lhbC1lbGVtZW50Iiwic3R5bGUiOnsibmFtZSI6ImZhY2Vib29rIiwiaHJlZiI6Imh0dHBzOi8vbWptbC5pby8iLCJhbGlnbiI6ImNlbnRlciIsImZvbnQtc2l6ZSI6IjEzcHgiLCJsaW5lLWhlaWdodCI6IjIycHgiLCJ2ZXJ0aWNhbC1hbGlnbiI6Im1pZGRsZSJ9LCJhdHRyaWJ1dGVzIjp7Im5hbWUiOiJmYWNlYm9vayIsImhyZWYiOiJodHRwczovL21qbWwuaW8vIiwiYWxpZ24iOiJjZW50ZXIiLCJmb250LXNpemUiOiIxM3B4IiwibGluZS1oZWlnaHQiOiIyMnB4IiwidmVydGljYWwtYWxpZ24iOiJtaWRkbGUiLCJzdHlsZSI6Im5hbWU6ZmFjZWJvb2s7aHJlZjpodHRwczovL21qbWwuaW8vO2FsaWduOmNlbnRlcjtmb250LXNpemU6MTNweDtsaW5lLWhlaWdodDoyMnB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTsifSwiY29tcG9uZW50cyI6W3sidHlwZSI6InRleHRub2RlIiwiY29udGVudCI6IlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2Vib29rXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifV19LHsidGFnTmFtZSI6Im1qLXNvY2lhbC1lbGVtZW50IiwidHlwZSI6Im1qLXNvY2lhbC1lbGVtZW50Iiwic3R5bGUiOnsibmFtZSI6Imdvb2dsZSIsImhyZWYiOiJodHRwczovL21qbWwuaW8vIiwiYWxpZ24iOiJjZW50ZXIiLCJmb250LXNpemUiOiIxM3B4IiwibGluZS1oZWlnaHQiOiIyMnB4IiwidmVydGljYWwtYWxpZ24iOiJtaWRkbGUifSwiYXR0cmlidXRlcyI6eyJuYW1lIjoiZ29vZ2xlIiwiaHJlZiI6Imh0dHBzOi8vbWptbC5pby8iLCJhbGlnbiI6ImNlbnRlciIsImZvbnQtc2l6ZSI6IjEzcHgiLCJsaW5lLWhlaWdodCI6IjIycHgiLCJ2ZXJ0aWNhbC1hbGlnbiI6Im1pZGRsZSIsInN0eWxlIjoibmFtZTpnb29nbGU7aHJlZjpodHRwczovL21qbWwuaW8vO2FsaWduOmNlbnRlcjtmb250LXNpemU6MTNweDtsaW5lLWhlaWdodDoyMnB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTsifSwiY29tcG9uZW50cyI6W3sidHlwZSI6InRleHRub2RlIiwiY29udGVudCI6IlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdvb2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1dfSx7InRhZ05hbWUiOiJtai1zb2NpYWwtZWxlbWVudCIsInR5cGUiOiJtai1zb2NpYWwtZWxlbWVudCIsInN0eWxlIjp7Im5hbWUiOiJ0d2l0dGVyIiwiaHJlZiI6Imh0dHBzOi8vbWptbC5pby8iLCJhbGlnbiI6ImNlbnRlciIsImZvbnQtc2l6ZSI6IjEzcHgiLCJsaW5lLWhlaWdodCI6IjIycHgiLCJ2ZXJ0aWNhbC1hbGlnbiI6Im1pZGRsZSJ9LCJhdHRyaWJ1dGVzIjp7Im5hbWUiOiJ0d2l0dGVyIiwiaHJlZiI6Imh0dHBzOi8vbWptbC5pby8iLCJhbGlnbiI6ImNlbnRlciIsImZvbnQtc2l6ZSI6IjEzcHgiLCJsaW5lLWhlaWdodCI6IjIycHgiLCJ2ZXJ0aWNhbC1hbGlnbiI6Im1pZGRsZSIsInN0eWxlIjoibmFtZTp0d2l0dGVyO2hyZWY6aHR0cHM6Ly9tam1sLmlvLzthbGlnbjpjZW50ZXI7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MjJweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7In0sImNvbXBvbmVudHMiOlt7InR5cGUiOiJ0ZXh0bm9kZSIsImNvbnRlbnQiOiJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUd2l0dGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifV19XX1dfV19LHsidHlwZSI6ImNvbW1lbnQiLCJjb250ZW50IjoiIEZvb3RlciAifV19XX1dfSwiaWQiOiI3cERSTzdjS1R3V2hXSXJ4In1dLCJpZCI6IjU2czJHNlVkVVhHMlpidngifV19]]></fileData>
36 </file> 38 </file>
37 </dbResources> 39 </dbResources>
40
41 <!-- ========= Service Jobs -->
42 <moqui.service.job.ServiceJob jobName="remove_ExcessMjmlEmailResourceHistories" description="Remove any excess mjml resource histories for email templates"
43 serviceName="mjml.MjmlServices.remove#ExcessMjmlEmailResourceHistories" cronExpression="0 0 * * * ?" paused="N"
44 transactionTimeout="3600"/>
45
38 </entity-facade-xml> 46 </entity-facade-xml>
......
...@@ -16,7 +16,9 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -16,7 +16,9 @@ along with this software (see the LICENSE.md file). If not, see
16 16
17 <extend-entity entity-name="EmailTemplate" package="moqui.basic.email"> 17 <extend-entity entity-name="EmailTemplate" package="moqui.basic.email">
18 <field name="grapesLocation" type="text-medium"/> 18 <field name="grapesLocation" type="text-medium"/>
19 <field name="grapesPublishedVersionName" type="text-short"/>
19 <field name="htmlLocation" type="text-medium"/> 20 <field name="htmlLocation" type="text-medium"/>
21 <field name="htmlPublishedVersionName" type="text-short"/>
20 </extend-entity> 22 </extend-entity>
21 <view-entity entity-name="ProductStoreEmailDetail" package="mantle.product.store"> 23 <view-entity entity-name="ProductStoreEmailDetail" package="mantle.product.store">
22 <member-entity entity-alias="PSE" entity-name="mantle.product.store.ProductStoreEmail"/> 24 <member-entity entity-alias="PSE" entity-name="mantle.product.store.ProductStoreEmail"/>
......
...@@ -69,17 +69,6 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -69,17 +69,6 @@ along with this software (see the LICENSE.md file). If not, see
69 </mj-column> 69 </mj-column>
70 </mj-section> 70 </mj-section>
71 71
72 <!-- Image Header -->
73 <mj-section background-url="http://1.bp.blogspot.com/-TPrfhxbYpDY/Uh3Refzk02I/AAAAAAAALw8/5sUJ0UUGYuw/s1600/New+York+in+The+1960's+-+70's+(2).jpg"
74 background-size="cover" background-repeat="no-repeat">
75 <mj-column>
76 <mj-text css-class="slogan" align="center" color="#fff" font-size="40px" font-family="Helvetica Neue">Slogan here</mj-text>
77 <mj-button background-color="#F63A4D" href="#">
78 Promotion
79 </mj-button>
80 </mj-column>
81 </mj-section>
82
83 <!-- Intro text --> 72 <!-- Intro text -->
84 <mj-wrapper background-color="#ffe9f7" padding="10px"> 73 <mj-wrapper background-color="#ffe9f7" padding="10px">
85 <mj-section background-color="#eaeffa"> 74 <mj-section background-color="#eaeffa">
...@@ -100,9 +89,6 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -100,9 +89,6 @@ along with this software (see the LICENSE.md file). If not, see
100 <!-- Side image --> 89 <!-- Side image -->
101 <mj-section background-color="white"> 90 <mj-section background-color="white">
102 <mj-column> 91 <mj-column>
103 <mj-image width="200px" src="https://designspell.files.wordpress.com/2012/01/sciolino-paris-bw.jpg" />
104 </mj-column>
105 <mj-column>
106 <mj-text font-style="italic" font-size="20px" font-family="Helvetica Neue" color="#626262"> 92 <mj-text font-style="italic" font-size="20px" font-family="Helvetica Neue" color="#626262">
107 Find amazing places ... 93 Find amazing places ...
108 </mj-text> 94 </mj-text>
...@@ -118,41 +104,19 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -118,41 +104,19 @@ along with this software (see the LICENSE.md file). If not, see
118 </mj-text> 104 </mj-text>
119 </mj-column> 105 </mj-column>
120 </mj-section> 106 </mj-section>
121 <mj-raw>
122 <div class="container">
123 <img class="item" src="https://source.unsplash.com/random/200x141?random" alt="Example image">
124 <img class="item" src="https://source.unsplash.com/random/200x142?random" alt="Example image">
125 <img class="item" src="https://source.unsplash.com/random/200x143?random" alt="Example image">
126 <img class="item" src="https://source.unsplash.com/random/200x144?random" alt="Example image">
127 <img class="item" src="https://source.unsplash.com/random/200x145?random" alt="Example image">
128 <img class="item" src="https://source.unsplash.com/random/200x146?random" alt="Example image">
129 </div>
130 </mj-raw>
131 <!-- Icons -->
132 <mj-section background-color="#fbfbfb">
133 <mj-column>
134 <mj-image width="100px" src="http://191n.mj.am/img/191n/3s/x0l.png" />
135 </mj-column>
136 <mj-column>
137 <mj-image width="100px" src="http://191n.mj.am/img/191n/3s/x01.png" />
138 </mj-column>
139 <mj-column>
140 <mj-image width="100px" src="http://191n.mj.am/img/191n/3s/x0s.png" />
141 </mj-column>
142 </mj-section>
143 107
144 <!-- Footer --> 108 <!-- Footer -->
145 <mj-section background-color="#e7e7e7"> 109 <mj-section background-color="#e7e7e7">
146 <mj-column> 110 <mj-column>
147 <mj-button href="#">Hello There!</mj-button> 111 <mj-button href="#">Hello There!</mj-button>
148 <mj-social font-size="15px" icon-size="30px" mode="horizontal"> 112 <mj-social font-size="15px" icon-size="30px" mode="horizontal">
149 <mj-social-element name="facebook" href="https://mjml.io/"> 113 <mj-social-element name="facebook" href="https://moqui.org/">
150 Facebook 114 Facebook
151 </mj-social-element> 115 </mj-social-element>
152 <mj-social-element name="google" href="https://mjml.io/"> 116 <mj-social-element name="google" href="https://moqui.org/">
153 Google 117 Google
154 </mj-social-element> 118 </mj-social-element>
155 <mj-social-element name="twitter" href="https://mjml.io/"> 119 <mj-social-element name="twitter" href="https://moqui.org/">
156 Twitter 120 Twitter
157 </mj-social-element> 121 </mj-social-element>
158 </mj-social> 122 </mj-social>
...@@ -180,7 +144,11 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -180,7 +144,11 @@ along with this software (see the LICENSE.md file). If not, see
180 } 144 }
181 // console.log('response ', response) 145 // console.log('response ', response)
182 window.htmlLocation = response.htmlLocation; 146 window.htmlLocation = response.htmlLocation;
147 window.htmlVersionName = response.htmlVersionName;
148 window.htmlPublishedVersionName = response.htmlPublishedVersionName;
183 window.grapesLocation = response.grapesLocation; 149 window.grapesLocation = response.grapesLocation;
150 window.grapesVersionName = response.grapesVersionName;
151 window.grapesPublishedVersionName = response.grapesPublishedVersionName;
184 // const url = new URL(window.location.href) 152 // const url = new URL(window.location.href)
185 // url.searchParams.set('htmlLocation', response.htmlLocation); 153 // url.searchParams.set('htmlLocation', response.htmlLocation);
186 // url.searchParams.set('grapesLocation', response.grapesLocation); 154 // url.searchParams.set('grapesLocation', response.grapesLocation);
...@@ -191,6 +159,67 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -191,6 +159,67 @@ along with this software (see the LICENSE.md file). If not, see
191 const projectData = JSON.parse(response.data); 159 const projectData = JSON.parse(response.data);
192 // console.log('window.projectData ', window.projectData) 160 // console.log('window.projectData ', window.projectData)
193 161
162 function moquiPlugin(editor) {
163 // Use the API: https://grapesjs.com/docs/api/
164
165 window.moquiPublishText = 'moqui-publish';
166 editor.Commands.add(window.moquiPublishText, () => {
167 const request = new XMLHttpRequest();
168 request.open("POST", "${baseLinkUrl}/rest/s1/moqui-mjml/mjml?emailTemplateId="+window.emailTemplateId, false); // `false` makes the request synchronous
169 request.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
170 request.setRequestHeader("X-CSRF-Token", document.getElementById('confMoquiSessionToken').value);
171 request.send(JSON.stringify({ publish:true, data: window.editor.getProjectData(), moquiVars:window.moquiVars, html:window.editor.runCommand('mjml-code-to-html')?.html }));
172 // console.log('request ', request)
173 if (request.status === 200) {
174 const result = JSON.parse(request.responseText);
175 window.htmlLocation = result.htmlLocation;
176 window.htmlVersionName = result.htmlVersionName;
177 window.htmlPublishedVersionName = result.htmlPublishedVersionName;
178 window.grapesLocation = result.grapesLocation;
179 window.grapesVersionName = result.grapesVersionName;
180 window.grapesPublishedVersionName = result.grapesPublishedVersionName;
181 if (window.grapesVersionName !== window.grapesPublishedVersionName && window.htmlVersionName !== window.htmlPublishedVersionName) {
182 editor.Panels.addButton('options', window.moquiPublishButtonSettings);
183 } else {
184 editor.Panels.removeButton('options', window.moquiPublishText);
185 }
186 }
187 });
188 editor.on('storage:end:store', () => {
189 // console.log('Storage store request ended');
190 const request = new XMLHttpRequest();
191 request.open("GET", "${baseLinkUrl}/rest/s1/moqui-mjml/mjml/afterMjmlStore?emailTemplateId="+window.emailTemplateId, false); // `false` makes the request synchronous
192 request.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
193 request.setRequestHeader("X-CSRF-Token", document.getElementById('confMoquiSessionToken').value);
194 request.send();
195 if (request.status === 200) {
196 const result = JSON.parse(request.responseText);
197 window.htmlLocation = result.htmlLocation;
198 window.htmlVersionName = result.htmlVersionName;
199 window.htmlPublishedVersionName = result.htmlPublishedVersionName;
200 window.grapesLocation = result.grapesLocation;
201 window.grapesVersionName = result.grapesVersionName;
202 window.grapesPublishedVersionName = result.grapesPublishedVersionName;
203 if (window.grapesVersionName !== window.grapesPublishedVersionName && window.htmlVersionName !== window.htmlPublishedVersionName) {
204 editor.Panels.addButton('options', window.moquiPublishButtonSettings);
205 } else {
206 editor.Panels.removeButton('options', window.moquiPublishText);
207 }
208 }
209 });
210
211 // Add Publish button
212 window.moquiPublishButtonSettings = {
213 id: window.moquiPublishText,
214 command: 'moqui-publish',
215 attributes: { title: 'publish' },
216 label: `<div style="background-color: #f45e43; color:#2c2e35; padding: 0px 10px; border: none; border-radius: 10px; cursor: pointer;">Publish</div>`,
217 };
218 if (window.grapesVersionName !== window.grapesPublishedVersionName && window.htmlVersionName !== window.htmlPublishedVersionName) {
219 editor.Panels.addButton('options', window.moquiPublishButtonSettings);
220 }
221 }
222
194 window.editor = grapesjs.init({ 223 window.editor = grapesjs.init({
195 projectData: projectData, 224 projectData: projectData,
196 height: '100%', 225 height: '100%',
...@@ -226,11 +255,19 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -226,11 +255,19 @@ along with this software (see the LICENSE.md file). If not, see
226 // url.searchParams.set('htmlLocation', result.htmlLocation); 255 // url.searchParams.set('htmlLocation', result.htmlLocation);
227 // url.searchParams.set('emailTemplateId', result.emailTemplateId); 256 // url.searchParams.set('emailTemplateId', result.emailTemplateId);
228 window.history.pushState({}, '', url) 257 window.history.pushState({}, '', url)
229 window.grapesLocation = result.grapesLocation;
230 window.htmlLocation = result.htmlLocation; 258 window.htmlLocation = result.htmlLocation;
259 window.htmlVersionName = result.htmlVersionName;
260 window.htmlPublishedVersionName = result.htmlPublishedVersionName;
261 window.grapesLocation = result.grapesLocation;
262 window.grapesVersionName = result.grapesVersionName;
263 window.grapesPublishedVersionName = result.grapesPublishedVersionName;
231 window.emailTemplateId = result.emailTemplateId; 264 window.emailTemplateId = result.emailTemplateId;
232 window.moquiVars = result.moquiVars; 265 window.moquiVars = result.moquiVars;
233 // console.log('onLoad window.moquiVars ', window.moquiVars) 266 if (window.grapesVersionName !== window.grapesPublishedVersionName && window.htmlVersionName !== window.htmlPublishedVersionName) {
267 editor.Panels.addButton('options', window.moquiPublishButtonSettings);
268 } else {
269 editor.Panels.removeButton('options', window.moquiPublishText);
270 }
234 } 271 }
235 // console.log('onLoad ', result) 272 // console.log('onLoad ', result)
236 return result.data 273 return result.data
...@@ -241,7 +278,7 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -241,7 +278,7 @@ along with this software (see the LICENSE.md file). If not, see
241 fromElement: true, 278 fromElement: true,
242 container: '#gjs', 279 container: '#gjs',
243 280
244 plugins: ['grapesjs-mjml'], 281 plugins: ['grapesjs-mjml',moquiPlugin],
245 pluginsOpts: { 282 pluginsOpts: {
246 'grapesjs-mjml': {} 283 'grapesjs-mjml': {}
247 } 284 }
......
...@@ -17,11 +17,34 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -17,11 +17,34 @@ along with this software (see the LICENSE.md file). If not, see
17 17
18 <actions> 18 <actions>
19 <entity-find-one entity-name="moqui.basic.email.EmailTemplate" value-field="emailTemplate" auto-field-map="[emailTemplateId:emailTemplateId]"/> 19 <entity-find-one entity-name="moqui.basic.email.EmailTemplate" value-field="emailTemplate" auto-field-map="[emailTemplateId:emailTemplateId]"/>
20 <if condition="!emailTemplate"> 20 <if condition="!emailTemplate || !emailTemplate.htmlLocation">
21 <return error="true" message="Email Template not found"/> 21 <return error="true" message="Email Template not found"/>
22 </if> 22 </if>
23 <set field="dataPre" from="ec.resource.getLocationReference(emailTemplate.htmlLocation).getText(emailTemplate.htmlPublishedVersionName)"/>
24 <script><![CDATA[
25 String location = "template.ftl";
23 26
24 <set field="renderedText" from="ec.resource.template(emailTemplate.htmlLocation, 'ftl')"/> 27 freemarker.template.Template newTemplate;
28 Reader templateReader = null;
29
30 try {
31 templateReader = new StringReader(context.dataPre);
32 // Use the getFtlConfiguration method from ec.resource.templateRenderers.ftl
33 newTemplate = new freemarker.template.Template(location, templateReader, ec.resource.templateRenderers.ftl.getFtlConfiguration());
34 } catch (Exception e) {
35 throw new org.moqui.BaseArtifactException("Error while initializing template at " + location, e);
36 } finally {
37 if (templateReader != null) {
38 try { templateReader.close(); }
39 catch (Exception e) { logger.error("Error closing template reader", e); }
40 }
41 }
42 StringWriter sw = new StringWriter()
43 try {
44 newTemplate.createProcessingEnvironment(ec.contextStack, sw).process();
45 } catch (Exception e) { throw new org.moqui.BaseArtifactException("Error rendering template at " + location, e); }
46 context.renderedText = sw.toString();
47 ]]></script>
25 </actions> 48 </actions>
26 49
27 <widgets> 50 <widgets>
......
...@@ -21,6 +21,9 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -21,6 +21,9 @@ along with this software (see the LICENSE.md file). If not, see
21 <resource name="mjml"> 21 <resource name="mjml">
22 <method type="get"><service name="mjml.MjmlServices.load#GrapeJs"/></method> 22 <method type="get"><service name="mjml.MjmlServices.load#GrapeJs"/></method>
23 <method type="post"><service name="mjml.MjmlServices.store#GrapeJs"/></method> 23 <method type="post"><service name="mjml.MjmlServices.store#GrapeJs"/></method>
24 <resource name="afterMjmlStore">
25 <method type="get"><service name="mjml.MjmlServices.get#AfterMjmlStore"/></method>
26 </resource>
24 </resource> 27 </resource>
25 28
26 </resource> 29 </resource>
......
...@@ -34,7 +34,11 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -34,7 +34,11 @@ along with this software (see the LICENSE.md file). If not, see
34 </in-parameters> 34 </in-parameters>
35 <out-parameters> 35 <out-parameters>
36 <parameter name="grapesLocation"/> 36 <parameter name="grapesLocation"/>
37 <parameter name="grapesVersionName"/>
38 <parameter name="grapesPublishedVersionName"/>
37 <parameter name="htmlLocation"/> 39 <parameter name="htmlLocation"/>
40 <parameter name="htmlVersionName"/>
41 <parameter name="htmlPublishedVersionName"/>
38 <parameter name="data"/> 42 <parameter name="data"/>
39 <parameter name="emailTemplateId"/> 43 <parameter name="emailTemplateId"/>
40 <parameter name="moquiVars"/> 44 <parameter name="moquiVars"/>
...@@ -45,7 +49,9 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -45,7 +49,9 @@ along with this software (see the LICENSE.md file). If not, see
45 <entity-find-one entity-name="moqui.basic.email.EmailTemplate" value-field="emailTemplate" auto-field-map="[emailTemplateId:emailTemplateId]"/> 49 <entity-find-one entity-name="moqui.basic.email.EmailTemplate" value-field="emailTemplate" auto-field-map="[emailTemplateId:emailTemplateId]"/>
46 <if condition="!emailTemplate"><return error="true" message="Resource not found"/></if> 50 <if condition="!emailTemplate"><return error="true" message="Resource not found"/></if>
47 <set field="grapesLocation" from="emailTemplate?.grapesLocation"/> 51 <set field="grapesLocation" from="emailTemplate?.grapesLocation"/>
52 <set field="grapesPublishedVersionName" from="emailTemplate?.grapesPublishedVersionName"/>
48 <set field="htmlLocation" from="emailTemplate?.htmlLocation"/> 53 <set field="htmlLocation" from="emailTemplate?.htmlLocation"/>
54 <set field="htmlPublishedVersionName" from="emailTemplate?.htmlPublishedVersionName"/>
49 55
50 <set field="grapesJsResource" from="ec.resource.getLocationReference('dbresource://grapesjs/project')"/> 56 <set field="grapesJsResource" from="ec.resource.getLocationReference('dbresource://grapesjs/project')"/>
51 <if condition="!grapesLocation &amp;&amp; !htmlLocation"> 57 <if condition="!grapesLocation &amp;&amp; !htmlLocation">
...@@ -54,7 +60,8 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -54,7 +60,8 @@ along with this software (see the LICENSE.md file). If not, see
54 <set field="grapesFile" from="grapesJsResource.makeFile(java.util.UUID.randomUUID().toString()+'.json')"/> 60 <set field="grapesFile" from="grapesJsResource.makeFile(java.util.UUID.randomUUID().toString()+'.json')"/>
55 61
56 <service-call name="mjml.MjmlServices.get#GlobalGrapeVarList" out-map="context"/> 62 <service-call name="mjml.MjmlServices.get#GlobalGrapeVarList" out-map="context"/>
57 <set field="dataRaw" from="ec.resource.getLocationReference('dbresource://grapesjs/template/default.json').getText()"/> 63 <set field="defaultLocation" value="dbresource://grapesjs/template/default.json"/>
64 <set field="dataRaw" from="ec.resource.getLocationReference(defaultLocation).getText()"/>
58 <set field="htmlLocation" from="grapesJsResource.location + '/' + htmlFile?.dbResourceId + '.html'"/> 65 <set field="htmlLocation" from="grapesJsResource.location + '/' + htmlFile?.dbResourceId + '.html'"/>
59 <set field="grapesLocation" from="grapesJsResource.location + '/' + grapesFile?.dbResourceId + '.json'"/> 66 <set field="grapesLocation" from="grapesJsResource.location + '/' + grapesFile?.dbResourceId + '.json'"/>
60 <script><![CDATA[ 67 <script><![CDATA[
...@@ -62,6 +69,8 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -62,6 +69,8 @@ along with this software (see the LICENSE.md file). If not, see
62 grapesFile.putText(dataRaw) 69 grapesFile.putText(dataRaw)
63 grapesFile.move(grapesLocation) 70 grapesFile.move(grapesLocation)
64 ]]></script> 71 ]]></script>
72 <set field="htmlVersionName" from="htmlFile?.getCurrentVersion()?.getVersionName() ?: htmlFile?.getRootVersion()?.getVersionName() ?: '01'"/>
73 <set field="grapesVersionName" from="grapesFile?.getCurrentVersion()?.getVersionName() ?: grapesFile?.getRootVersion()?.getVersionName() ?: '01'"/>
65 <service-call name="update#moqui.basic.email.EmailTemplate" in-map="[emailTemplateId:emailTemplateId,grapesLocation:grapesLocation,htmlLocation:htmlLocation]"/> 74 <service-call name="update#moqui.basic.email.EmailTemplate" in-map="[emailTemplateId:emailTemplateId,grapesLocation:grapesLocation,htmlLocation:htmlLocation]"/>
66 75
67 <service-call name="mjml.MjmlServices.get#GlobalGrapeVarList" out-map="globalGrapeVarList"/> 76 <service-call name="mjml.MjmlServices.get#GlobalGrapeVarList" out-map="globalGrapeVarList"/>
...@@ -76,7 +85,7 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -76,7 +85,7 @@ along with this software (see the LICENSE.md file). If not, see
76 } 85 }
77 } 86 }
78 87
79 context.allVarsRegexPattern = /\$\{[a-zA-Z_]\w*\}/ 88 context.allVarsRegexPattern = /\$\{[a-zA-Z_][a-zA-Z0-9_.]*\}/
80 context.errorVarList = context.dataRaw.findAll(context.allVarsRegexPattern).unique().collect { it - '${' - '}' } - globalGrapeVarList*.key 89 context.errorVarList = context.dataRaw.findAll(context.allVarsRegexPattern).unique().collect { it - '${' - '}' } - globalGrapeVarList*.key
81 context.errorTemplateRegexPattern = errorVarList.collect { '\\\$\\{'+it+'\\}' }.join('|') 90 context.errorTemplateRegexPattern = errorVarList.collect { '\\\$\\{'+it+'\\}' }.join('|')
82 if (context.errorTemplateRegexPattern) { 91 if (context.errorTemplateRegexPattern) {
...@@ -88,7 +97,7 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -88,7 +97,7 @@ along with this software (see the LICENSE.md file). If not, see
88 ]]></script> 97 ]]></script>
89 <!-- <log level="warn" message="dataPre is ${dataPre}"/>--> 98 <!-- <log level="warn" message="dataPre is ${dataPre}"/>-->
90 <script><![CDATA[ 99 <script><![CDATA[
91 String location = "template.ftl"; 100 String location = defaultLocation;
92 101
93 freemarker.template.Template newTemplate; 102 freemarker.template.Template newTemplate;
94 Reader templateReader = null; 103 Reader templateReader = null;
...@@ -120,6 +129,10 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -120,6 +129,10 @@ along with this software (see the LICENSE.md file). If not, see
120 <if condition="!grapesFile || grapesFile.parent?.location != grapesJsResource.location"> 129 <if condition="!grapesFile || grapesFile.parent?.location != grapesJsResource.location">
121 <return error="true" message="Resource not found"/> 130 <return error="true" message="Resource not found"/>
122 </if> 131 </if>
132 <set field="grapesVersionName" from="grapesFile?.getCurrentVersion()?.getVersionName() ?: grapesFile?.getRootVersion()?.getVersionName() ?: '01'"/>
133 <set field="tempHtmlFile" from="ec.resource.getLocationReference(htmlLocation)"/>
134 <set field="htmlVersionName" from="tempHtmlFile?.getCurrentVersion()?.getVersionName() ?: tempHtmlFile?.getRootVersion()?.getVersionName() ?: '01'"/>
135 <set field="tempHtmlFile" from="null"/>
123 136
124 <service-call name="mjml.MjmlServices.get#GlobalGrapeVarList" out-map="globalGrapeVarList"/> 137 <service-call name="mjml.MjmlServices.get#GlobalGrapeVarList" out-map="globalGrapeVarList"/>
125 <set field="dataRaw" from="grapesFile.getText()"/> 138 <set field="dataRaw" from="grapesFile.getText()"/>
...@@ -134,7 +147,7 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -134,7 +147,7 @@ along with this software (see the LICENSE.md file). If not, see
134 } 147 }
135 } 148 }
136 149
137 context.allVarsRegexPattern = /\$\{[a-zA-Z_]\w*\}/ 150 context.allVarsRegexPattern = /\$\{[a-zA-Z_][a-zA-Z0-9_.]*\}/
138 context.errorVarList = context.dataRaw.findAll(context.allVarsRegexPattern).unique().collect { it - '${' - '}' } - globalGrapeVarList*.key 151 context.errorVarList = context.dataRaw.findAll(context.allVarsRegexPattern).unique().collect { it - '${' - '}' } - globalGrapeVarList*.key
139 context.errorTemplateRegexPattern = errorVarList.collect { '\\\$\\{'+it+'\\}' }.join('|') 152 context.errorTemplateRegexPattern = errorVarList.collect { '\\\$\\{'+it+'\\}' }.join('|')
140 if (context.errorTemplateRegexPattern) { 153 if (context.errorTemplateRegexPattern) {
...@@ -146,7 +159,7 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -146,7 +159,7 @@ along with this software (see the LICENSE.md file). If not, see
146 ]]></script> 159 ]]></script>
147 <!-- <log level="warn" message="dataPre is ${dataPre}"/>--> 160 <!-- <log level="warn" message="dataPre is ${dataPre}"/>-->
148 <script><![CDATA[ 161 <script><![CDATA[
149 String location = "template.ftl"; 162 String location = grapesFile.location;
150 163
151 freemarker.template.Template newTemplate; 164 freemarker.template.Template newTemplate;
152 Reader templateReader = null; 165 Reader templateReader = null;
...@@ -183,14 +196,19 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -183,14 +196,19 @@ along with this software (see the LICENSE.md file). If not, see
183 <in-parameters> 196 <in-parameters>
184 <parameter name="htmlLocation"/> 197 <parameter name="htmlLocation"/>
185 <parameter name="grapesLocation"/> 198 <parameter name="grapesLocation"/>
186 <parameter name="emailTemplateId"/> 199 <parameter name="emailTemplateId" required="true"/>
187 <parameter name="data"/> 200 <parameter name="data" required="true"/>
188 <parameter name="moquiVars"/> 201 <parameter name="moquiVars" required="true"/>
189 <parameter name="html" allow-html="any"/> 202 <parameter name="html" allow-html="any" required="true"/>
203 <parameter name="publish" default="false" type="Boolean" required="true"/>
190 </in-parameters> 204 </in-parameters>
191 <out-parameters> 205 <out-parameters>
192 <parameter name="htmlLocation"/> 206 <parameter name="htmlLocation"/>
207 <parameter name="htmlVersionName"/>
208 <parameter name="htmlPublishedVersionName"/>
193 <parameter name="grapesLocation"/> 209 <parameter name="grapesLocation"/>
210 <parameter name="grapesVersionName"/>
211 <parameter name="grapesPublishedVersionName"/>
194 </out-parameters> 212 </out-parameters>
195 <actions> 213 <actions>
196 <if condition="htmlLocation == 'null'"><set field="htmlLocation" from="null"/></if> 214 <if condition="htmlLocation == 'null'"><set field="htmlLocation" from="null"/></if>
...@@ -198,7 +216,9 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -198,7 +216,9 @@ along with this software (see the LICENSE.md file). If not, see
198 <entity-find-one entity-name="moqui.basic.email.EmailTemplate" value-field="emailTemplate" auto-field-map="[emailTemplateId:emailTemplateId]"/> 216 <entity-find-one entity-name="moqui.basic.email.EmailTemplate" value-field="emailTemplate" auto-field-map="[emailTemplateId:emailTemplateId]"/>
199 <if condition="!emailTemplate"><return error="true" message="Resource not found"/></if> 217 <if condition="!emailTemplate"><return error="true" message="Resource not found"/></if>
200 <set field="grapesLocation" from="emailTemplate?.grapesLocation"/> 218 <set field="grapesLocation" from="emailTemplate?.grapesLocation"/>
219 <set field="grapesPublishedVersionName" from="emailTemplate?.grapesPublishedVersionName"/>
201 <set field="htmlLocation" from="emailTemplate?.htmlLocation"/> 220 <set field="htmlLocation" from="emailTemplate?.htmlLocation"/>
221 <set field="htmlPublishedVersionName" from="emailTemplate?.htmlPublishedVersionName"/>
202 <set field="dataMap" from="new groovy.json.JsonSlurper().parseText(ec.web.secureRequestParameters._requestBodyText).data"/> 222 <set field="dataMap" from="new groovy.json.JsonSlurper().parseText(ec.web.secureRequestParameters._requestBodyText).data"/>
203 <!-- <log level="warn" message="dataMap is ${dataMap}"/>--> 223 <!-- <log level="warn" message="dataMap is ${dataMap}"/>-->
204 <set field="moquiVars" from="new groovy.json.JsonSlurper().parseText(ec.web.secureRequestParameters._requestBodyText).moquiVars"/> 224 <set field="moquiVars" from="new groovy.json.JsonSlurper().parseText(ec.web.secureRequestParameters._requestBodyText).moquiVars"/>
...@@ -243,10 +263,7 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -243,10 +263,7 @@ along with this software (see the LICENSE.md file). If not, see
243 } 263 }
244 ]]></script> 264 ]]></script>
245 <script>grapesFile.putText(dataPre)</script> 265 <script>grapesFile.putText(dataPre)</script>
246 266 <set field="grapesVersionName" from="grapesFile?.getCurrentVersion()?.getVersionName()"/>
247 <!-- <set field="dataRaw" from="grapesFile.getText()"/>-->
248 <!-- <set field="dataRawMap" from="new groovy.json.JsonSlurper().parseText(dataRaw)"/>-->
249 <!-- <script>grapesFile.putText(data)</script>-->
250 267
251 <set field="htmlFile" from="null"/> 268 <set field="htmlFile" from="null"/>
252 <if condition="htmlLocation"><then> 269 <if condition="htmlLocation"><then>
...@@ -269,7 +286,14 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -269,7 +286,14 @@ along with this software (see the LICENSE.md file). If not, see
269 <if condition="!htmlFile || htmlFile.parent?.location != grapesJsResource.location"> 286 <if condition="!htmlFile || htmlFile.parent?.location != grapesJsResource.location">
270 <return error="true" message="Resource not found"/> 287 <return error="true" message="Resource not found"/>
271 </if> 288 </if>
272 <!-- <script><![CDATA[htmlFile.putText(html)]]></script>--> 289 <script><![CDATA[htmlFile.putText(html)]]></script>
290 <set field="htmlVersionName" from="htmlFile?.getCurrentVersion()?.getVersionName()"/>
291 <if condition="publish">
292 <service-call name="update#moqui.basic.email.EmailTemplate" in-map="[emailTemplateId:emailTemplateId,
293 htmlPublishedVersionName:htmlVersionName,grapesPublishedVersionName:grapesVersionName]"/>
294 <set field="htmlPublishedVersionName" from="htmlVersionName"/>
295 <set field="grapesPublishedVersionName" from="grapesVersionName"/>
296 </if>
273 </else-if> 297 </else-if>
274 <else> 298 <else>
275 <return error="true" message="Resource not found"/> 299 <return error="true" message="Resource not found"/>
...@@ -277,6 +301,100 @@ along with this software (see the LICENSE.md file). If not, see ...@@ -277,6 +301,100 @@ along with this software (see the LICENSE.md file). If not, see
277 </if> 301 </if>
278 </actions> 302 </actions>
279 </service> 303 </service>
304 <service verb="get" noun="AfterMjmlStore">
305 <description>Get the data after storing the MJML data</description>
306 <in-parameters>
307 <parameter name="emailTemplateId" required="true"/>
308 </in-parameters>
309 <out-parameters>
310 <parameter name="htmlLocation"/>
311 <parameter name="htmlVersionName"/>
312 <parameter name="htmlPublishedVersionName"/>
313 <parameter name="grapesLocation"/>
314 <parameter name="grapesVersionName"/>
315 <parameter name="grapesPublishedVersionName"/>
316 </out-parameters>
317 <actions>
318 <entity-find-one entity-name="moqui.basic.email.EmailTemplate" value-field="emailTemplate" auto-field-map="[emailTemplateId:emailTemplateId]"/>
319 <if condition="!emailTemplate"><return error="true" message="Resource not found"/></if>
320 <set field="grapesLocation" from="emailTemplate?.grapesLocation"/>
321 <set field="grapesVersionName" from="ec.resource.getLocationReference(grapesLocation)?.getCurrentVersion()?.getVersionName()"/>
322 <set field="grapesPublishedVersionName" from="emailTemplate?.grapesPublishedVersionName"/>
323 <set field="htmlLocation" from="emailTemplate?.htmlLocation"/>
324 <set field="htmlVersionName" from="ec.resource.getLocationReference(htmlLocation)?.getCurrentVersion()?.getVersionName()"/>
325 <set field="htmlPublishedVersionName" from="emailTemplate?.htmlPublishedVersionName"/>
326 </actions>
327 </service>
280 328
329 <service verb="remove" noun="ExcessMjmlEmailResourceHistories">
330 <in-parameters>
331 <parameter name="runDate" default="Timestamp.from(java.time.Instant.now())" required="true" type="Timestamp"/>
332 </in-parameters>
333 <out-parameters>
334 <parameter name="removedHistoryList"/>
335 </out-parameters>
336 <actions>
337 <entity-find entity-name="moqui.basic.email.EmailTemplate" list="emailTemplateList">
338 <econdition field-name="grapesLocation" operator="is-not-null"/>
339 <econdition field-name="htmlLocation" operator="is-not-null"/>
340 <select-field field-name="emailTemplateId,grapesLocation,htmlLocation,grapesPublishedVersionName,htmlPublishedVersionName"/>
341 <order-by field-name="-lastUpdatedStamp"/>
342 </entity-find>
343 <set field="resourceList" from="[]"/>
344 <iterate list="emailTemplateList" entry="emailTemplate">
345 <set field="grapesFile" from="ec.resource.getLocationReference(emailTemplate.grapesLocation)"/>
346 <if condition="grapesFile">
347 <script><![CDATA[
348 def versionWhitelist = []
349 if (grapesFile?.getCurrentVersion()?.getVersionName()) versionWhitelist.add(grapesFile.getCurrentVersion().getVersionName())
350 if (emailTemplate?.grapesPublishedVersionName) versionWhitelist.add(emailTemplate.grapesPublishedVersionName)
351 resourceList.add([location:grapesFile.location,resourceId:grapesFile.dbResourceId,versionWhitelist:versionWhitelist.size()>0?versionWhitelist:null])]]></script>
352 </if>
353 <set field="htmlFile" from="ec.resource.getLocationReference(emailTemplate.htmlLocation)"/>
354 <if condition="htmlFile">
355 <script><![CDATA[
356 def versionWhitelist = []
357 if (htmlFile?.getCurrentVersion()?.getVersionName()) versionWhitelist.add(htmlFile.getCurrentVersion().getVersionName())
358 if (emailTemplate?.htmlPublishedVersionName) versionWhitelist.add(emailTemplate.htmlPublishedVersionName)
359 resourceList.add([location:htmlFile.location,resourceId:htmlFile.dbResourceId,versionWhitelist:versionWhitelist.size()>0?versionWhitelist:null])]]></script>
360 </if>
361 </iterate>
362
363 <set field="oneHourAgo" from="Timestamp.from(runDate.toInstant().minus(1, java.time.temporal.ChronoUnit.HOURS))"/>
364 <set field="removedHistoryList" from="[]"/>
365
366 <iterate list="resourceList" entry="resource">
367 <entity-find entity-name="moqui.resource.DbResourceFileHistory" list="resourceHistoryPreList">
368 <econdition field-name="resourceId" from="resource.resourceId"/>
369 <econdition field-name="versionDate" operator="greater" from="oneHourAgo"/>
370 <econdition field-name="versionDate" operator="less-equals" from="runDate"/>
371 <select-field field-name="resourceId,versionName,versionDate,previousVersionName,userId"/>
372 <order-by field-name="-versionDate"/>
373 </entity-find>
374 <set field="skippedUserIds" from="[]"/>
375 <set field="resourceHistoryList" from="[]"/>
376 <iterate list="resourceHistoryPreList" entry="resourceHistory">
377 <!-- Add all but the single latest history per userId to resourceHistoryList -->
378 <if condition="resource.versionWhitelist.contains(resourceHistory.versionName) || !skippedUserIds.contains(resourceHistory.userId)">
379 <!-- <log level="warn" message="${resource.resourceId} ${resourceHistory.versionName} userId ${resourceHistory.userId}"/>-->
380 <set field="skippedUserIds" from="skippedUserIds + [resourceHistory.userId]"/><continue/></if>
381 <set field="resourceHistoryList" from="resourceHistoryList + [resourceHistory]"/>
382 </iterate>
383 <iterate list="resourceHistoryList" entry="resourceHistory">
384 <entity-find-one entity-name="moqui.resource.DbResourceFileHistory" value-field="usedResourceHistory" auto-field-map="[resourceId:resource.resourceId,previousVersionName:resourceHistory.versionName]" for-update="true">
385 <select-field field-name="resourceId,versionName,versionDate,previousVersionName,userId"/></entity-find-one>
386 <!-- <log level="warn" message="set versionName ${usedResourceHistory.versionName} of previousVersionName ${usedResourceHistory.previousVersionName} to ${resourceHistory.previousVersionName}"/>-->
387 <set field="usedResourceHistory.previousVersionName" from="resourceHistory.previousVersionName"/>
388
389 <log level="info" message="Removed resource history ${resourceHistory.resourceId} version ${resourceHistory.versionName}"/>
390 <set field="removedHistoryList" from="removedHistoryList + [resourceId:resource.resourceId, versionName:resourceHistory.versionName,versionDate:resourceHistory.versionDate,userId:resourceHistory.userId]"/>
391
392 <entity-update value-field="usedResourceHistory"/>
393 <entity-delete value-field="resourceHistory"/>
394 </iterate>
395 </iterate>
396
397 </actions>
398 </service>
281 399
282 </services> 400 </services>
......