ProseMirror / prosemirror

The ProseMirror WYSIWYM editor
http://prosemirror.net/
MIT License
7.53k stars 334 forks source link

Incorrect and slow parsing of base64 encoded CSS property values #1470

Closed marlass closed 1 month ago

marlass commented 1 month ago

Running DOMParser.fromSchema(schema).parse(dom, options).toJSON() on HTML with base64 encoded CSS values is extremely slow and incorrect.

Minimal HTML example to parse:

<div style="
width: 200px;
background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyNy41LjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAzMTQ3IDIwMDAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMxNDcgMjAwMDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPHJlY3Qgc3R5bGU9ImZpbGw6I0ZGRkZGRjsiIHdpZHRoPSIzMTQ3IiBoZWlnaHQ9IjIwMDAiLz4NCgk8Zz4NCgkJPGc+DQoJCQk8cGF0aCBzdHlsZT0ib3BhY2l0eTowLjM7ZmlsbDojOUJDMUY5OyIgZD0iTTI4NDQuNzE3LDE1MzkuNjQ1aC0zNTEuMjQ0YzM3LjU5NC0zNC41NDcsNjEuNTYzLTg2Ljg2Niw2MS41NjMtMTQ1LjQyOXYtNDMuMDM0DQoJCQkJYzAtMTI0LjY2Myw5MC42MjktMjI1LjcyMywyMDIuNDI1LTIyNS43MjNsMCwwYzExNC42MDQsMCwyMDcuNTA4LTEwMy41OTcsMjA3LjUwOC0yMzEuMzkxdi0wLjAwMQ0KCQkJCWMwLTEyNy43OTQtOTIuOTA0LTIzMS4zOTEtMjA3LjUwOC0yMzEuMzkxaC0zMy45OTVjLTExMS43OTYsMC0yMDIuNDI1LTEwMS4wNi0yMDIuNDI1LTIyNS43MjN2LTAuMDAxDQoJCQkJYzAtMTA0LjAyNy03NS42MjYtMTg4LjM1Ny0xNjguOTE2LTE4OC4zNTdIMTAzMi4yNzZjLTEwMy44MzUsMC0xODguMDEsOTMuODYzLTE4OC4wMSwyMDkuNjQ5djANCgkJCQljMCw3OS4xNTQsMzkuMzQ0LDE0OC4wNTMsOTcuNDA5LDE4My43MzJINzA5LjgyN2MtOTYuNjkxLDAtMTc1LjA3NCw4MC44OS0xNzUuMDc0LDE4MC42NzN2MA0KCQkJCWMwLDExOS41NzctOTMuOTMzLDIxNi41MTQtMjA5LjgwNSwyMTYuNTE0aC0zNS4yMzRjLTExOC43ODEsMC0yMTUuMDcyLDk5LjM3MS0yMTUuMDcyLDIyMS45NXYwLjAwMQ0KCQkJCWMwLDEyMi41OCw5Ni4yOTIsMjIxLjk1LDIxNS4wNzIsMjIxLjk1aDBjMTE1Ljg3MiwwLDIwOS44MDQsOTYuOTM3LDIwOS44MDQsMjE2LjUxNHY0MS4yNzgNCgkJCQljMCw5OS43ODMsNzguMzgzLDE4MC42NzMsMTc1LjA3NCwxODAuNjczaDgxNC42NTZjNi4xNDYsMC41OTUsMTIuMzczLDAuOTA5LDE4LjY3NCwwLjkwOWgxMzM2Ljc5NA0KCQkJCWMxMDUuNzA2LDAsMTkxLjM5Ny04NS42OTEsMTkxLjM5Ny0xOTEuMzk3djBDMzAzNi4xMTQsMTYyNS4zMzYsMjk1MC40MjMsMTUzOS42NDUsMjg0NC43MTcsMTUzOS42NDV6Ii8+DQoJCQk8Zz4NCgkJCQk8cGF0aCBzdHlsZT0iZmlsbDojNDY2RUI2OyIgZD0iTTkyMC42OTcsMTMwOS45MDNjLTUuMzMtMC4wMTMtOS42NjYsNi4xMzQtOS42ODUsMTMuNzI5Yy0wLjAxOSw3LjU5Niw0LjI4NywxMy43NjMsOS42MTcsMTMuNzc3DQoJCQkJCWM1LjMzLDAuMDEzLDkuNjY2LTYuMTM0LDkuNjg1LTEzLjcyOUM5MzAuMzMzLDEzMTYuMDg0LDkyNi4wMjcsMTMwOS45MTYsOTIwLjY5NywxMzA5LjkwM3ogTTkyMC42ODgsMTMxMy43ODkNCgkJCQkJYzIuODYxLDAuMDA3LDUuMTc2LDEuNDM4LDUuMTcyLDMuMTk3Yy0wLjAwNCwxLjc1OS0yLjMyNywzLjE3OS01LjE4OCwzLjE3MmMtMi44NjEtMC4wMDctNS4xNzYtMS40MzgtNS4xNzItMy4xOTcNCgkJCQkJQzkxNS41MDQsMTMxNS4yMDIsOTE3LjgyNywxMzEzLjc4Miw5MjAuNjg4LDEzMTMuNzg5eiBNOTIwLjY0MiwxMzMyLjI0OGMtNC4wMzUtMC4wMS03LjMwMS0yLjIxNy03LjI5NC00LjkyOQ0KCQkJCQljMC4wMDctMi43MTMsMy4yODMtNC45MDQsNy4zMTgtNC44OTRjNC4wMzUsMC4wMSw3LjMwMSwyLjIxNyw3LjI5NCw0LjkyOUM5MjcuOTU0LDEzMzAuMDY3LDkyNC42NzcsMTMzMi4yNTgsOTIwLjY0MiwxMzMyLjI0OHoNCgkJCQkJIi8+DQoJCQkJPHBhdGggc3R5bGU9ImZpbGw6IzdGMUNBMDsiIGQ9Ik04OTguNzg3LDEzNDAuMjdjLTIuMDI2LDQuMzczLTMuMDg4LDkuMTI0LTMuMSwxMy45MzhMODk1LjQ0LDE0NTQuOQ0KCQkJCQljLTAuMDE1LDYuMDgxLDQuOTUzLDExLjAyMywxMS4wOTYsMTEuMDM4bDU3LjU3OCwwLjE0MWM2LjE0MywwLjAxNSwxMS4xMzUtNC45MDIsMTEuMTUtMTAuOTgzbDAuMjQ3LTEwMC42OTINCgkJCQkJYzAuMDEyLTQuODEzLTEuMDI3LTkuNTY5LTMuMDMxLTEzLjk1Mkw4OTguNzg3LDEzNDAuMjd6Ii8+DQoJCQkJPHBhdGggc3R5bGU9ImZpbGw6IzdGMUNBMDsiIGQ9Ik04OTguNzg3LDEzNDAuMjdjLTIuMDI2LDQuMzczLTMuMDg4LDkuMTI0LTMuMSwxMy45MzhMODk1LjQ0LDE0NTQuOQ0KCQkJCQljLTAuMDE1LDYuMDgxLDQuOTUzLDExLjAyMywxMS4wOTYsMTEuMDM4bDU3LjU3OCwwLjE0MWM2LjE0MywwLjAxNSwxMS4xMzUtNC45MDIsMTEuMTUtMTAuOTgzbDAuMjQ3LTEwMC42OTINCgkJCQkJYzAuMDEyLTQuODEzLTEuMDI3LTkuNTY5LTMuMDMxLTEzLjk1Mkw4OTguNzg3LDEzNDAuMjd6Ii8+DQoJCQkJPHBhdGggc3R5bGU9ImZpbGw6I0Y0NzQ1ODsiIGQ9Ik05NzUuNTE2LDEzNTQuNDAxbC0wLjI0NywxMDAuN2MtMC4wMTUsNi4wNzUtNS4wMTMsMTAuOTk4LTExLjE1LDEwLjk4M2wtNTcuNTc3LTAuMTQxDQoJCQkJCWMtNi4xNS0wLjAxNS0xMS4xMTEtNC45NjMtMTEuMDk2LTExLjAzOGwwLjI0Ny0xMDAuN2MwLjAxMi00LjgwNSwxLjA3LTkuNTU3LDMuMDk2LTEzLjkzbDczLjY4NiwwLjE4MQ0KCQkJCQlDOTc0LjQ3OSwxMzQ0LjgzOSw5NzUuNTI4LDEzNDkuNTk1LDk3NS41MTYsMTM1NC40MDF6Ii8+DQoJCQkJPHBhdGggc3R5bGU9ImZpbGw6I0Y0OEM3RjsiIGQ9Ik05MTAuNzA2LDE0NTQuOTM3bDAuMjQ3LTEwMC42OTJjMC4wMTItNC44MTMsMS4wNzQtOS41NjQsMy4xLTEzLjkzN2wtMTUuMjY3LTAuMDM4DQoJCQkJCWMtMi4wMjYsNC4zNzMtMy4wODgsOS4xMjQtMy4xLDEzLjkzN0w4OTUuNDQsMTQ1NC45Yy0wLjAxNSw2LjA4MSw0Ljk1MywxMS4wMjMsMTEuMDk2LDExLjAzOGwxNS4yNjcsMC4wMzgNCgkJCQkJQzkxNS42NTksMTQ2NS45Niw5MTAuNjkxLDE0NjEuMDE4LDkxMC43MDYsMTQ1NC45Mzd6Ii8+DQoJCQkJPHBhdGggc3R5bGU9ImZpbGw6I0I3NTc0MjsiIGQ9Ik05NzUuNTE2LDEzNTQuNDAxbC0wLjI0NywxMDAuN2MtMC4wMTUsNi4wNzUtNS4wMTMsMTAuOTk4LTExLjE1LDEwLjk4M2wtMjMuNTQxLTAuMDU4DQoJCQkJCWM2LjIwMywwLjAxNSwxMS4yNTMtNC45MDgsMTEuMjY4LTEwLjk4M2wwLjI0Ny0xMDAuNjk5YzAuMDEyLTQuODA1LTEuMDUtOS41NjItMy4wNjctMTMuOTQ1bDIzLjQ1LDAuMDU3DQoJCQkJCUM5NzQuNDc5LDEzNDQuODM5LDk3NS41MjgsMTM0OS41OTUsOTc1LjUxNiwxMzU0LjQwMXoiLz4NCgkJCQk8cGF0aCBzdHlsZT0iZmlsbDojMTMzNzVCOyIgZD0iTTk3Mi40NzksMTM0MC40NTFsLTczLjY5OS0wLjE4MWwwLDBjMC4wMDgtMy4yMTksMi42NTEtNS44MjIsNS45MDMtNS44MTRsNjEuOTIyLDAuMTUyDQoJCQkJCUM5NjkuODU3LDEzMzQuNjE1LDk3Mi40ODcsMTMzNy4yMzIsOTcyLjQ3OSwxMzQwLjQ1MUw5NzIuNDc5LDEzNDAuNDUxeiIvPg0KCQkJCQ0KCQkJCQk8cmVjdCB4PSI5MjkuMTM0IiB5PSIxNDAxLjQ2NCIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wMDI1IC0xIDEgMC4wMDI1IC01MDguMjc3MiAyMzczLjIyMzkpIiBzdHlsZT0iZmlsbDojMzU1Mzg5OyIgd2lkdGg9IjEyLjUxMyIgaGVpZ2h0PSI3OS44MjMiLz4NCgkJCTwvZz4NCgkJCTxnPg0KCQkJCTxwYXRoIHN0eWxlPSJmaWxsOiM4NkIxRjI7IiBkPSJNODI2LjI1OCwxMzA3Ljg1M2g4LjgwNGMtMS40NC0wLjk4NS0zLjI0Mi0xLjU3NC01LjIwMi0xLjU3NEg2MDkuMzAzDQoJCQkJCWMtMTEuNTM5LDAtMjAuODk0LDguMjkyLTIwLjg5NCwxOC41MjF2MTEuNzY0YzAsMTAuMjI5LDkuMzU0LDE4LjUyMSwyMC44OTQsMTguNTIxbDIxOC4wODktMC4wNjVMODI2LjI1OCwxMzA3Ljg1M3oiLz4NCgkJCQk8cGF0aCBzdHlsZT0iZmlsbDojNDY2RUI2OyIgZD0iTTcwMS4wNDMsMTMwNi4zMjJjLTExLjAzNSwwLTE5Ljk4MSw3LjkzLTE5Ljk4MSwxNy43MTJ2MTMuMjk1DQoJCQkJCWMwLDkuNzgyLDguOTQ2LDE3LjcxMiwxOS45ODEsMTcuNzEyaDEzNy4zMDJ2LTIuOTc0aC0wLjU2N2wtMzQuOTA1LTIuOTNsLTcuMDU1LTI0LjUzNGMwLDAsMTMuNjE3LTEzLjU1NywxNC41MDUtMTMuOTA3DQoJCQkJCWMwLjg4OC0wLjM1LDI3LjQ1NS0xLjQxMSwyNy40NTUtMS40MTFsMC41NjctMC4wMDV2LTIuOTU4SDcwMS4wNDN6Ii8+DQoJCQkJPHBhdGggc3R5bGU9ImZpbGw6I0ZBRTBCMjsiIGQ9Ik04MjkuNDQsMTMzMC41OTRjMC0xNC4zNDQsOC4zNjItMjEuMjk4LDguMzYyLTIxLjI5OEg3MDMuODU1DQoJCQkJCWMtMTAuMTM2LDAtMTguMzUzLDcuMjg0LTE4LjM1MywxNi4yNjl2MTAuMjM0YzAsOC45ODUsOC4yMTcsMTYuMjY5LDE4LjM1MywxNi4yNjloMTMzLjk0Nw0KCQkJCQlDODM3LjgwMiwxMzUyLjA2Nyw4MjkuNDQsMTM0OC42NTYsODI5LjQ0LDEzMzAuNTk0eiIvPg0KCQkJCTxwYXRoIHN0eWxlPSJmaWxsOiNEQUVFRjc7IiBkPSJNNjg1LjUwMiwxMzI1LjU2NHYxMC4yMzRjMCwxLjM0NSwwLjE4OCwyLjY1MSwwLjUzNSwzLjkwMg0KCQkJCQljNC41MTgtOS43OTgsMTMuMTc2LTE5LjIzNSwyOS42NTktMjIuMjdjMzguNDgyLTcuMDg1LDEyMi4xMDYtOC4xMzQsMTIyLjEwNi04LjEzNEg3MDMuODU1DQoJCQkJCUM2OTMuNzE5LDEzMDkuMjk2LDY4NS41MDIsMTMxNi41NzksNjg1LjUwMiwxMzI1LjU2NHoiLz4NCgkJCQk8cGF0aCBzdHlsZT0iZmlsbDojNTBCRkE1OyIgZD0iTTgyMi42MjYsMTQwNS40MDVoOS45NjRjLTEuNjMtMS4yMzMtMy42Ny0xLjk3MS01Ljg4OC0xLjk3MUg1NzcuMDc1DQoJCQkJCWMtMTMuMDYsMC0yMy42NDgsMTAuMzc5LTIzLjY0OCwyMy4xODN2MTQuNzI1YzAsMTIuODA0LDEwLjU4NywyMy4xODMsMjMuNjQ4LDIzLjE4M2wyNDYuODM1LTAuMDgyTDgyMi42MjYsMTQwNS40MDV6Ii8+DQoJCQkJPHBhdGggc3R5bGU9ImZpbGw6IzNDOEY3QzsiIGQ9Ik02ODAuOTA3LDE0MDMuNDljLTEyLjQ5LDAtMjIuNjE1LDkuOTI2LTIyLjYxNSwyMi4xN3YxNi42NDFjMCwxMi4yNDQsMTAuMTI1LDIyLjE3LDIyLjYxNSwyMi4xNw0KCQkJCQloMTU1LjM5OXYtMy43MjJoLTAuNjQybC0zOS41MDYtMy42NjhsLTcuOTg1LTMwLjcxYzAsMCwxNS40MTItMTYuOTcsMTYuNDE3LTE3LjQwOHMzMS4wNzQtMS43NjUsMzEuMDc0LTEuNzY1bDAuNjQyLTAuMDA3DQoJCQkJCXYtMy43MDJINjgwLjkwN3oiLz4NCgkJCQk8cGF0aCBzdHlsZT0iZmlsbDojRkFFMEIyOyIgZD0iTTgyNi4yMjgsMTQzMy44NzFjMC0xNy45NTUsOS40NjUtMjYuNjU5LDkuNDY1LTI2LjY1OUg2ODQuMDkNCgkJCQkJYy0xMS40NzIsMC0yMC43NzIsOS4xMTctMjAuNzcyLDIwLjM2NHYxMi44MDljMCwxMS4yNDcsOS4zLDIwLjM2NCwyMC43NzIsMjAuMzY0aDE1MS42MDINCgkJCQkJQzgzNS42OTIsMTQ2MC43NDksODI2LjIyOCwxNDU2LjQ3OSw4MjYuMjI4LDE0MzMuODcxeiIvPg0KCQkJCTxwYXRoIHN0eWxlPSJmaWxsOiNEQUVFRjc7IiBkPSJNNjYzLjMxOCwxNDI3LjU3NnYxMi44MDljMCwxLjY4NCwwLjIxMywzLjMxOSwwLjYwNiw0Ljg4NA0KCQkJCQljNS4xMTMtMTIuMjY0LDE0LjkxMy0yNC4wNzcsMzMuNTY4LTI3Ljg3NWM0My41NTQtOC44NjgsMTM4LjIwMS0xMC4xODIsMTM4LjIwMS0xMC4xODJINjg0LjA5DQoJCQkJCUM2NzIuNjE4LDE0MDcuMjEyLDY2My4zMTgsMTQxNi4zMjksNjYzLjMxOCwxNDI3LjU3NnoiLz4NCgkJCQk8cGF0aCBzdHlsZT0iZmlsbDojRjQ3NDU4OyIgZD0iTTU0NS4yLDEzNTYuNTI0aC05Ljk2OGMxLjYzMS0wLjk3OCwzLjY3MS0xLjU2NCw1Ljg5MS0xLjU2NGgyNDkuNzI1DQoJCQkJCWMxMy4wNjUsMCwyMy42NTcsOC4yMzYsMjMuNjU3LDE4LjM5NXYxMS42ODRjMCwxMC4xNTktMTAuNTkyLDE4LjM5NS0yMy42NTcsMTguMzk1bC0yNDYuOTMyLTAuMDY1TDU0NS4yLDEzNTYuNTI0eiIvPg0KCQkJCTxwYXRoIHN0eWxlPSJmaWxsOiNCNzU3NDI7IiBkPSJNNjg2Ljk3NCwxMzU1LjAwNGMxMi40OTUsMCwyMi42MjMsNy44NzYsMjIuNjIzLDE3LjU5MnYxMy4yMDQNCgkJCQkJYzAsOS43MTYtMTAuMTI5LDE3LjU5Mi0yMi42MjMsMTcuNTkyaC0xNTUuNDZ2LTIuOTU0aDAuNjQzbDM5LjUyMS0yLjkxbDcuOTg4LTI0LjM2OGMwLDAtMTUuNDE4LTEzLjQ2NS0xNi40MjMtMTMuODEzDQoJCQkJCWMtMS4wMDUtMC4zNDctMzEuMDg2LTEuNDAxLTMxLjA4Ni0xLjQwMWwtMC42NDMtMC4wMDV2LTIuOTM4SDY4Ni45NzR6Ii8+DQoJCQkJPHBhdGggc3R5bGU9ImZpbGw6I0ZBRTBCMjsiIGQ9Ik01NDEuNTk3LDEzNzkuMTExYzAtMTQuMjQ3LTkuNDY4LTIxLjE1My05LjQ2OC0yMS4xNTNINjgzLjc5YzExLjQ3NywwLDIwLjc4LDcuMjM0LDIwLjc4LDE2LjE1OA0KCQkJCQl2MTAuMTY0YzAsOC45MjQtOS4zMDQsMTYuMTU4LTIwLjc4LDE2LjE1OEg1MzIuMTI5QzUzMi4xMjksMTQwMC40MzgsNTQxLjU5NywxMzk3LjA1LDU0MS41OTcsMTM3OS4xMTF6Ii8+DQoJCQkJPHBhdGggc3R5bGU9ImZpbGw6I0RBRUVGNzsiIGQ9Ik03MDQuNTcsMTM3NC4xMTV2MTAuMTY0YzAsMS4zMzYtMC4yMTMsMi42MzMtMC42MDYsMy44NzUNCgkJCQkJYy01LjExNS05LjczMS0xNC45MTktMTkuMTA0LTMzLjU4MS0yMi4xMTljLTQzLjU3MS03LjAzNi0xMzguMjU1LTguMDc5LTEzOC4yNTUtOC4wNzlINjgzLjc5DQoJCQkJCUM2OTUuMjY3LDEzNTcuOTU3LDcwNC41NywxMzY1LjE5Miw3MDQuNTcsMTM3NC4xMTV6Ii8+DQoJCQk8L2c+DQoJCQkNCgkJCQk8cmVjdCB4PSIxMzg3LjM2NCIgeT0iMTM3NS41MyIgdHJhbnNmb3JtPSJtYXRyaXgoMC45ODI1IDAuMTg2MiAtMC4xODYyIDAuOTgyNSAzMzEuNDc0OSAtMjMxLjc0MDkpIiBzdHlsZT0iZmlsbDojMTg0NjU1OyIgd2lkdGg9IjIzLjgyOSIgaGVpZ2h0PSI1NDYuMDM2Ii8+DQoJCQk8cG9seWdvbiBzdHlsZT0iZmlsbDojMTg0NjU1OyIgcG9pbnRzPSIyMTM2Ljg5MiwxOTIxLjQ5OCAyMTY1LjA1MywxOTIxLjQ5OCAyMDYwLjEwNywxMzc4LjAzOCAyMDM2LjY5NSwxMzgyLjQ3NSAJCQkiLz4NCgkJCTxwb2x5Z29uIHN0eWxlPSJmaWxsOiMxODQ2NTU7IiBwb2ludHM9IjE2MjEuMzIxLDE5MjEuNDk4IDE2NDkuNDgyLDE5MjEuNDk4IDE1NDQuNTM2LDEzNzguMDM4IDE1MjEuMTI0LDEzODIuNDc1IAkJCSIvPg0KCQkJPHBvbHlnb24gc3R5bGU9ImZpbGw6IzE4NDY1NTsiIHBvaW50cz0iMTg4MC4zMDcsMTkyMS40OTggMTg1Ny40NDQsMTkyMS43NzEgMTk1OC4wNTcsMTM4MC40NzcgMTk4MS40NjksMTM4NC45MTUgCQkJIi8+DQoJCQk8cGF0aCBzdHlsZT0iZmlsbDojRkFFMEIyOyIgZD0iTTE3NzguMTYyLDY0Ni4xMjVjOTIuNzA5LDkuOTI5LDIxMi42ODYsMjAuNDAzLDMzMy4xMzIsMjI0Ljc5OA0KCQkJCWMxMzEuNjQsMjIzLjM5Myw2Mi4zNDQsNTU3LjA4Ny00MS41NTYsNjQ5LjgxNWMtMTAzLjkwMSw5Mi43MjktNDQzLjI0MywyMDcuMjI1LTcyOC41MDMsMzUuODE3DQoJCQkJYzAsMC0xNzIuMjQzLTEwMy44NzYtODMuODQ2LTI3Ni4yNzJjMTM2LjAzMi0yNjUuMjk3LDExNi44MTEtMzIwLjYxOSwxNzcuNjM0LTQyNC41ODhTMTU4MS4zNyw2MjUuMDUsMTc3OC4xNjIsNjQ2LjEyNXoiLz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiNGN0NDN0Y7IiBkPSJNMjExMS4yOTUsODcwLjkyM2MtODIuMjA5LTEzOS41MDctMTY0LjE5Ni0xODguNjY1LTIzNy40NDctMjA4Ljk4DQoJCQkJYzI4LjMzMywyOS4zMjEsNTcuMDU3LDY3LjA0MSw4NS44MDgsMTE1LjgzMWMxMzEuNjQsMjIzLjM5Myw2Mi4zNDQsNTU3LjA4Ni00MS41NTcsNjQ5LjgxNQ0KCQkJCWMtOTIuMTQxLDgyLjIzMy0zNjkuNDM5LDE4MS41NTItNjI5Ljk4LDgzLjQ0M2MyNi43ODcsMjkuNjQzLDUzLjExNSw0NS41MjIsNTMuMTE1LDQ1LjUyMg0KCQkJCWMyODUuMjYsMTcxLjQwOSw2MjQuNjAzLDU2LjkxMyw3MjguNTA0LTM1LjgxNkMyMTczLjYzOCwxNDI4LjAxLDIyNDIuOTM0LDEwOTQuMzE2LDIxMTEuMjk1LDg3MC45MjN6Ii8+DQoJCQk8cGF0aCBzdHlsZT0iZmlsbDojRjQ4QzdGOyIgZD0iTTQ5MS45NDcsODA0LjQ2NGMtMi42MywyMC43MjMsMTguOTUyLDM3LjE3LDM4LjE0NiwzNS44NzMNCgkJCQljMjEuMjE4LTEuNDM0LDM5LjIxNi0xOC44MzUsNDIuMzE5LTM5LjY4NWMzLjM1OS0yMi41NjktMTAuMjAxLTQwLjYxOC0zMS4xODEtNDIuMjcyYy0yMC40MjItMS42MS0zMy40ODYsMTYuNTY3LTI3LjU4OCwzNC45MQ0KCQkJCWM0LjIyOSwxMy4xNTEsMTYuMjMzLDE4LjA1NCwyMi4yOCwxNC40MjVjNC43MTMtMi44MjgsNC40MjgtOS45Ni0xLjI3OC0xMS4yMTljLTIuMjg3LTAuNTA0LTQuNjQ0LDAuNzcxLTUuODU5LDIuNTI2DQoJCQkJYy00Ljk5NS0xLjk4My05Ljc0OC0xMS4wNzctNi41MjItMjAuODk2YzQuMTItMTIuNTQyLDE5Ljk3Ny0xMy4yNiwyOS44MjQtNy40MWMxMi41MzUsNy40NDYsMTQuNTA1LDIzLjQ3OSw5LjkwOCwzNi4yNTQNCgkJCQljLTQuODI3LDEzLjQxNS0xOC4wMDEsMjMuOTgxLTMyLjM0NCwyNC45OTljLTE2LjI0NywxLjE1My0zMC41NDYtMTEuMzAxLTMxLjg0My0yNy40ODYNCgkJCQlDNDk3LjUwMyw4MDAuNjYyLDQ5Mi40MTgsODAwLjc1NSw0OTEuOTQ3LDgwNC40NjR6Ii8+DQoJCQk8Zz4NCgkJCQk8cGF0aCBzdHlsZT0iZmlsbDojRkFFMEIyOyIgZD0iTTE5MjAuNDYsMTEyLjcwN2MtOTUuOTUzLTAuNTY5LTE3NC4wMjIsNDYuNzUzLTE3NC4zNzIsMTA1LjY5Ng0KCQkJCQljLTAuMTc1LDI5LjQ3MSwxOS4xMTMsNTYuMjY4LDUwLjQzOSw3NS43NjlsLTM5LjQ1OCw4Ni42NzRsODIuMzUyLTY3LjA3MmMyMy44NjEsNy43NTQsNTAuOTg2LDEyLjIxNSw3OS43NzIsMTIuMzg2DQoJCQkJCWM5NS45NTMsMC41NjksMTc0LjAyMi00Ni43NTMsMTc0LjM3Mi0xMDUuNjk2QzIwOTMuOTE1LDE2MS41MjEsMjAxNi40MTMsMTEzLjI3NiwxOTIwLjQ2LDExMi43MDd6Ii8+DQoJCQkJPGc+DQoJCQkJCTxwYXRoIHN0eWxlPSJmaWxsOiNGN0NDN0Y7IiBkPSJNMTg1My45ODcsMjI5LjU5NGM4LjUyMiwzMi4zMzksNDEuNjQyLDUxLjY0NCw3My45NzYsNDMuMTE3DQoJCQkJCQljMzIuMzMzLTguNTI2LDUxLjYzNi00MS42NTQsNDMuMTE0LTczLjk5NGMtOC41MjItMzIuMzM5LTQxLjY0Mi01MS42NDMtNzMuOTc1LTQzLjExNw0KCQkJCQkJQzE4NjQuNzY4LDE2NC4xMjcsMTg0NS40NjUsMTk3LjI1NSwxODUzLjk4NywyMjkuNTk0eiIvPg0KCQkJCQk8cGF0aCBzdHlsZT0iZmlsbDojRUZFRkVGOyIgZD0iTTE5NDYuMjc4LDIxNS4xNzhjNC41NTcsMTcuMjktNS43NjQsMzUuMDAyLTIzLjA1MSwzOS41NjENCgkJCQkJCWMtMTcuMjg3LDQuNTU5LTM0Ljk5NS01Ljc2My0zOS41NTEtMjMuMDUyTDE5NDYuMjc4LDIxNS4xNzh6Ii8+DQoJCQkJPC9nPg0KCQkJPC9nPg0KCQkJPGc+DQoJCQkJPHBhdGggc3R5bGU9ImZpbGw6I0Y0NzQ1ODsiIGQ9Ik05MzAuMDE3LDk0OS41NzlsMjY0LjkxOS0xLjk4OWM2LjA1LTAuMDQ1LDEwLjkxNy00Ljk4NywxMC44NzItMTEuMDM2bC0xLjMyOS0xNzcuMTE2DQoJCQkJCWMtMC4wNDUtNi4wNS00Ljk4Ni0xMC45MTctMTEuMDM2LTEwLjg3MmwtMjY0LjkyLDEuOTg5Yy02LjA1LDAuMDQ1LTEwLjkxNyw0Ljk4Ny0xMC44NzIsMTEuMDM2bDEuMzI5LDE3Ny4xMTYNCgkJCQkJQzkxOS4wMjcsOTQ0Ljc1Nyw5MjMuOTY4LDk0OS42MjQsOTMwLjAxNyw5NDkuNTc5eiIvPg0KCQkJCTxwb2x5Z29uIHN0eWxlPSJmaWxsOiNGNDc0NTg7IiBwb2ludHM9IjExOTYuMzU3LDg0Ny4wODYgMTI4MS44OTMsOTM0LjI1MyAxMTc2LjM3NCw5MTQuNTU3IAkJCQkiLz4NCgkJCQk8Zz4NCgkJCQkJPHBhdGggc3R5bGU9ImZpbGw6I0ZGRkZGRjsiIGQ9Ik0xMTE5LjE4NSw4MzQuODAzbC0yNS43NDEtMC40NjFjMCwwLTMyLjQzNy0yNC4yMjMtMzMuNDI5LTMyLjc4NA0KCQkJCQkJYy0wLjk5My04LjU2MSw0LjMyNS0yNi42NzgtMC43MDctMjguOTUzYy01LjAzMS0yLjI3NC0xNS42ODctNC4wNzItMjIuNDE5LDcuMjY0Yy00Ljg4Nyw4LjIyOC0wLjgxOSwzOC4yNjUtMy44NDQsNDAuMjc0DQoJCQkJCQljLTEuODkyLDEuMjU4LTE2LjY5NCwxLjQwOS0yNy41MSwxLjM0NmMtNy4xMTItMC4wNDItMTMuNjQ5LDMuODctMTYuOTgzLDEwLjE1M2wtMC4wMTEsMC4wMTgNCgkJCQkJCWMtMi4yNTMsNC4yNDYtMS4yMjcsOS40OTEsMi40NjEsMTIuNTc1bDUuNzQxLDQuODAxbC00LjUxOSw2LjAwM2MtMy4zNjMsNC40Ny0yLjQ4OSwxMC44MTYsMS45NiwxNC4yMDhsNC41MzMsMy40NTgNCgkJCQkJCWwtMy4xMDQsMy41MzZjLTMuOTk4LDQuNTUzLTMuMTU0LDExLjU2OCwxLjgwOCwxNS4wNDRsNC4wMywyLjgyNGwtMC42MDUsMS4xMTVjLTIuNTE2LDQuNjM2LTEuMDcyLDEwLjQyNSwzLjMyNiwxMy4zMzcNCgkJCQkJCWw0LjA0OCwyLjY3OWw2OC41NTgsMS4yMTdjNi40MjMsMC4xMTQsMTIuODAyLTEuMDg2LDE4Ljc0NC0zLjUyNmwyNC4xODMtMy41NThjMi41OTgtMC4zODMsNC41MjctMi42MDksNC41MzQtNS4yMzYNCgkJCQkJCWwwLjE1NS02MC4wMTJDMTEyNC40MDMsODM3LjIyMywxMTIyLjA4Myw4MzQuODU1LDExMTkuMTg1LDgzNC44MDN6Ii8+DQoJCQkJPC9nPg0KCQkJPC9nPg0KCQkJPHBvbHlnb24gc3R5bGU9ImZpbGw6I0Y3OUM4RDsiIHBvaW50cz0iMTQ4MC41MTQsOTg1LjY3MSAxNDU2LjY4NSwxMDU3LjE1OCAxNTI5LjMwNSwxMDI4LjU5NSAJCQkiLz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiMwNDJBNDQ7IiBkPSJNMTU1NS4zNzgsNzcyLjkzN2MtNC44NDIsMC4yLTE4LjEwNyw0LjYyNC0zNy41MDgsNDEuMTYzDQoJCQkJYy0yNC43NzQsNDYuNjYxLTYwLjk4MywxODcuNjE3LTYwLjk4MywxODcuNjE3bDEwOC4wODEsNDAuMTE0bDEzLjg4NS0yOS40MjFsMjIuODY5LTIyNi41MDINCgkJCQlDMTYwMS43MjMsNzg1LjkwOSwxNTU2LjcyLDc3Mi44ODEsMTU1NS4zNzgsNzcyLjkzN3oiLz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiMwNzM0NUE7IiBkPSJNMTY5OC4yNSw3NTIuNjE5Yy0zMC45MDYsMC4wNDEtMTA3LjM3Nyw5LjAyOC0xNDIuODcxLDIwLjMyOWMwLDAtMjYuMDc0LDIyMy4zNDQsMjMuNDc1LDM5My4wNTUNCgkJCQljMTEuMDkxLDM3Ljk5LTkuMTc0LDE1Ny40ODQtOS4xNzQsMTU3LjQ4NGwzMjAuMjU3LTQuMjEyYzAsMC0zNy45NC0yODguODgxLTIzLjY0OC0zMzUuNTQzDQoJCQkJYzE0LjI5My00Ni42NjEsMTQuNjM0LTIwOS4yODMsMTQuNjM0LTIwOS4yODNzLTIuMTk0LTAuMzQxLTcxLjk1NC0xMi4zNThDMTc3Ni40MzIsNzU2LjQ4NywxNzMxLjI0OCw3NTIuNTc2LDE2OTguMjUsNzUyLjYxOXoiDQoJCQkJLz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiNGN0E0OTE7IiBkPSJNMTczNS41NjcsMTczOC4wMjNjMCwwLTcuMDg1LDgxLjQ5Ni0yMC4xMTEsMTA0LjA2NWMtMTMuMDI3LDIyLjU2OCwwLjY4NSw2MC45MzQsMS4zNzEsNjYuMg0KCQkJCWMwLjY4Niw1LjI2NiwyNy40MjUsMTIuNzg5LDY5LjkzMyw4LjI3NWM0Mi41MDgtNC41MTQsNDEuODIzLTE0LjI5MywzOC4zOTQtMzAuMDkxYy0zLjQyOC0xNS43OTctMjYuMDUzLTM2LjEwOS0yNy40MjUtNTEuMTU1DQoJCQkJYy0xLjM3MS0xNS4wNDYsMTMuMDI3LTY5LjIwOSwxMy4wMjctNjkuMjA5TDE3MzUuNTY3LDE3MzguMDIzeiIvPg0KCQkJPHBhdGggc3R5bGU9ImZpbGw6IzMyN0Y2QjsiIGQ9Ik0xNjA1LjgxNCwxMjU2LjIyMWMwLDAtMjIxLjA3My0xMi4yMzQtMjcwLjQ0MSwxNy41NjNjLTQ5LjM2NywyOS43OTcsOC45MjcsOTAuOTgzLDguOTI3LDkwLjk4Mw0KCQkJCXMxNzkuOTc4LDc3Ljk4Niw0ODEuMjg5LDk1LjMxNmM3MS4zNTEsNC4xMDQsNzcuNTAxLTE4NS40MTIsNjQuMTU5LTIwMS4wOTUNCgkJCQlDMTg3Ni40MDYsMTI0My4zMDYsMTYwNS44MTQsMTI1Ni4yMjEsMTYwNS44MTQsMTI1Ni4yMjF6Ii8+DQoJCQk8cGF0aCBzdHlsZT0iZmlsbDojMzU1Mzg5OyIgZD0iTTE3OTIuMDYyLDE5MjIuODg5YzQzLjc3Mi00LjY0OCwzOC4zNTktMjYuMDc5LDM0LjgyOS00Mi4zNDcNCgkJCQljLTIuMjEtMTAuMTg2LTE0Ljc2Ny0yMi4xOTQtMjIuMjUyLTMzLjU1MmMtMy45MTMsMy4xMDYtMTAuMjc3LDguNTkxLTI5LjI4NiwxNC4xODZjLTE5Ljc0LDUuODExLTQ2Ljc5OS01LjY4OS02NC4wNDItMTIuODkyDQoJCQkJYy02LjE0NiwyMi43OTQtNi40MjYsNTEuODYzLTUuODUyLDU2LjI3MkMxNzA2LjE2NSwxOTA5Ljk3OCwxNzQ4LjI5LDE5MjcuNTM3LDE3OTIuMDYyLDE5MjIuODg5eiIvPg0KCQkJPHBhdGggc3R5bGU9ImZpbGw6IzNDOEY3QzsiIGQ9Ik0xNzY3LjkwMSwxNDEzLjg0MmMtOC44MzIsNjYuNjA5LTUyLjU2NCwzOTguMjA0LTUyLjU2NCwzOTguMjA0bDEwMS40NzEsMTIuNTM4DQoJCQkJYzAsMCwxMjQuNzgyLTQzMi44MDksMTE4LjM4My00OTkuMDA5Yy02LjM5OS02Ni4yLTUzLjEwOC03MS43Ny01My4xMDgtNzEuNzdTMTc5MS4yNzksMTIzNy41MTcsMTc2Ny45MDEsMTQxMy44NDJ6Ii8+DQoJCQk8cGF0aCBzdHlsZT0iZmlsbDojMDczNDVBOyIgZD0iTTE2NzAuNjk0LDQ3MC44NDVjMCwwLDMzLjcxNC0zNS41NDYsNjAuODMxLDcuNjk1YzAsMCwyMC44ODgtMTEuNzI2LDM1LjU0Niw5LjE2Mg0KCQkJCWMwLDAsMzcuNzQ1LTExLjM2LDQ2LjkwNiw0NS4wNzRjMCwwLDE5LjQyMi0zLjY2NSwyMS45ODcsMTkuNDIyYzIuNTY1LDIzLjA4Ny05LjE2MSwzOC40NzgtOS4xNjEsMzguNDc4DQoJCQkJczEwLjkxMSw4LjE4Miw1Ljk1NSwyOS40MDhjLTQuMjE0LDE4LjA0OC0xOS4xNDcsMjAuNzk2LTE5LjE0NywyMC43OTZzLTQuMDMxLDMwLjQxNi0xNy4yMjMsMzkuNTc3DQoJCQkJYy0xMy4xOTIsOS4xNjEtMzEuMTQ4LDQuNzY1LTMxLjE0OCw0Ljc2NXMtNC43NjQsMTYuNDktMjAuMTU1LDE1LjAyNGMtMTUuMzkxLTEuNDY2LTM0LjQ0Ny0xNi4xMjQtNTEuNjctOS41MjgNCgkJCQljLTE3LjIyMyw2LjU5Ni02MS45MzEtMC4zNjctNjEuOTMxLTAuMzY3cy01MC4yMDMtMjIuMzUzLTM1LjE3OS03My42NTdjMCwwLTI2LjM4NS0yMy44MTktMy4yOTgtNTIuNDAzDQoJCQkJYzAsMC0xNi44NTctNDQuNzA3LDE2LjQ5LTcxLjA5MkMxNjQyLjg0NCw0NjYuODE0LDE2NzAuNjk0LDQ3MC44NDUsMTY3MC42OTQsNDcwLjg0NXoiLz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiNGN0E0OTE7IiBkPSJNMTY3Ni4zOSw3MTIuMTcxbC02LjEwMyw0NS4yNzZjMCwwLTEzLjY3MSw2NS4yMywzLjkxNyw3Ny44MDUNCgkJCQljMTcuNTg4LDEyLjU3Niw3NC43OTUtNzkuNjY1LDc0Ljc5NS03OS42NjVsLTYuMDQyLTExNC43MjdMMTY3Ni4zOSw3MTIuMTcxeiIvPg0KCQkJPHBhdGggc3R5bGU9ImZpbGw6I0Y0NzQ1ODsiIGQ9Ik0xNzQ0LjkwOSw2NzguMDQyYy0xNC41MjgsMzkuMTMxLTQ5LjEzMSw2My4xODUtNzMuNjkzLDcyLjUxNWw1LjE3NS0zOC4zODZsNjYuNTY3LTcxLjMxMQ0KCQkJCUwxNzQ0LjkwOSw2NzguMDQyeiIvPg0KCQkJPHBhdGggc3R5bGU9ImZpbGw6I0Y3QTQ5MTsiIGQ9Ik0xNzAyLjMxMyw1MjAuMzI4Yy0zNS42OTMtMTIuMjg2LTczLjczOSwxMS40MjQtNzkuMTg2LDQ4LjIxNw0KCQkJCWMtMi4zNjcsMTUuOTkyLTQuNTEsMzYuMTAyLTQuOTEsNTguMDg5Yy0wLjk2LDUyLjg4MiwyNi40MTUsMTA0LjM0OSw1MC40MjksMTA0LjM0OWMyNC4wMTQsMCw5MC4zNzktMzQuMjMzLDkyLjc4MS0xMDkuMzA3DQoJCQkJQzE3NjIuOTA5LDU3NS4zMjYsMTczOS43NjksNTMzLjIyMiwxNzAyLjMxMyw1MjAuMzI4eiIvPg0KCQkJPHBhdGggc3R5bGU9ImZpbGw6I0Y3QTQ5MTsiIGQ9Ik0xNzQzLjczMyw2MjcuNjEyYzAsMTEuNjY1LDcuNzM0LDIxLjEyMiwxNy4yNzMsMjEuMTIyYzkuNTM5LDAsMTcuMjcyLTkuNDU3LDE3LjI3Mi0yMS4xMjINCgkJCQljMC0xMS42NjUtNy43MzQtMjEuMTIyLTE3LjI3Mi0yMS4xMjJDMTc1MS40NjcsNjA2LjQ5LDE3NDMuNzMzLDYxNS45NDcsMTc0My43MzMsNjI3LjYxMnoiLz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiMwNzM0NUE7IiBkPSJNMTU5OC4yNzksNDk0LjAxNmMtMjQuODA0LDE5LjY1LTMzLjQ5Nyw0OS41MDYtMTkuNDE1LDY2LjY4Nw0KCQkJCWMxNC4wODEsMTcuMTgsNDUuNjA1LDE1LjE3OCw3MC40MDktNC40NzFjMjQuODA0LTE5LjY1LDMzLjQ5Ny00OS41MDcsMTkuNDE1LTY2LjY4Nw0KCQkJCUMxNjU0LjYwNyw0NzIuMzY1LDE2MjMuMDgzLDQ3NC4zNjcsMTU5OC4yNzksNDk0LjAxNnoiLz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiNGN0E0OTE7IiBkPSJNMTg4NC40MSw3OTkuMjc1Yy0yOS45NDQtMTEuMTk1LTQ0LjU5MiwyNTcuNjg5LTQ4LjYyOSwzNjguMzYyDQoJCQkJYy01My4wMjYsNS4wODQtMTQ1LjQ1MSwwLjAzOC0xNjguNDY0LTEuNjg0Yy0xMC44MjQtMC44MS0zNS43OC05LjkyLTQ2LjU0NC0xMS4zMjVjLTExLjAzMS0xLjQ0LTIxLjAzLTIuMTg5LTI2LjQ1My0xLjI0OQ0KCQkJCWMtMS45OTEsMC4zNDUtNTcuMjYyLDIyLjg3MS02MS45OTEsMjcuODEyYy01Ljg2NCw2LjEyNi0yMS43MTUsMjEuNTc4LTE5LjA0LDI4LjI2MmMyLjY3NSw2LjY4MywzMC40ODgtMTguNjE5LDMwLjQ4OC0xOC42MTkNCgkJCQlsMTMuNTkyLTcuNmMtMTYuOTIxLDE2LjQ3NC00OS4xOTUsMzguMTctNDQuNTQ2LDQ2LjA3MWM0LjUzNCw3LjcwNSwzMy42NDctMTQuMzEzLDU0LjM5Ni0yOS4zMTkNCgkJCQljLTE3Ljc5NywxNi4wMjEtMzkuOTA3LDQ0LjY4OS0zNC44MTMsNDkuMTU4YzQuNTc4LDQuMDE3LDI5LjcyOC0yOS4xNzMsNTYuNjA2LTM4LjczMWM5Ljk2LTMuNTQyLDE5Ljg4OCw2LjI2NywyNy43MjMsNy40NTINCgkJCQljNS43NTksMC44NzEsMTQuNjQ5LDIuNzI0LDIwLjI5OCwxLjEyOGwyOS4xMDItOC4yMjZjOS45MTQsMC44OTQsMTAuMTYzLDYuNzM4LDIwLjE3Myw4Ljg2Mg0KCQkJCWMxMS42MjIsMi40NjUsMzAuNjksNS4wNjEsNDUuNDkyLDguNjY1Yzg1LjIzLDIwLjc1MywxMTMuNjU3LDMwLjM5MSwxMzkuNzUyLDMwLjM3NQ0KCQkJCUMxOTUwLjU5MywxMjU4LjYyLDE5NTUuMTc3LDgyNS43MzIsMTg4NC40MSw3OTkuMjc1eiIvPg0KCQkJPHBhdGggc3R5bGU9ImZpbGw6IzA3MzQ1QTsiIGQ9Ik0xOTQxLjIzNiwxMDUxLjcxYzUuNjA5LTExMy4zNjQsNC43ODgtMjUzLjA5LTU4Ljk3Ny0yNzYuOTI5DQoJCQkJYy0yNS4xNi05LjQwNi02OS41MTMsNDcuMTUxLTYxLjUzNiwyNzkuMjMyQzE4NTQuNzY0LDEwNTYuODE0LDE5MDQuNzM5LDEwNTkuMDY5LDE5NDEuMjM2LDEwNTEuNzF6Ii8+DQoJCQk8cG9seWdvbiBzdHlsZT0iZmlsbDojRjc5QzhEOyIgcG9pbnRzPSIxNTg0LjQ5NCwxMDAzLjAwMSAxNTkwLjk5MywxMDAzLjAwMSAxNjg4LjcwNSwxMjQyLjMxMSAxNjgxLjk3NiwxMjQxLjI5IAkJCSIvPg0KCQkJPHBhdGggc3R5bGU9ImZpbGw6I0Y3QTQ5MTsiIGQ9Ik0xNDM4Ljg0NSwxODA3LjczM2MwLDAsOC44NTQsMjguMjkxLTcsNDdjLTE1Ljg1NCwxOC43MDgtODEuNzMyLDM3LjA2NS05MC4zNzksNDcuMTk4DQoJCQkJYy04LjY0NywxMC4xMzMtNy45OTMsMTguNzYzLTcuOTkzLDE4Ljc2M2wxODQuODk5LTUuMDcybC0yLjAxNC01NS42NTJsLTguNTE0LTM5Ljk5MUwxNDM4Ljg0NSwxODA3LjczM3oiLz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiMzNTUzODk7IiBkPSJNMTQyMC4zNDUsMTg2NC4wNjJjMCwwLDQ3LjUxLDE5LjE1Myw3MC40NTgsNy44MTNjMjIuOTQ5LTExLjM0LDIyLjI1Ni0xNC40ODEsMjguODk3LTEwLjI1Mw0KCQkJCWM2LjY0MSw0LjIyOSw5LjAxOSw1Ni4zOTgsOS4wMTksNTYuMzk4bC0yMDcuOTE0LDYuMDg5Yy0xNC40NjktMC4zMzItMjEuNzgzLTEwLjk1MS0xMC4wMjgtMjAuMDQyDQoJCQkJYzguMDU5LTYuMjMzLDE3LjM3NC0xMC40MDcsMjIuNjY4LTEzLjQzMkMxMzQ5LjcxLDE4ODEuMzQsMTQyMC4zNDUsMTg2NC4wNjIsMTQyMC4zNDUsMTg2NC4wNjJ6Ii8+DQoJCQk8cGF0aCBzdHlsZT0iZmlsbDojM0M4RjdDOyIgZD0iTTE0NDUuODUzLDEzMDguNDQ0Yy0xNC4yOS0yOS45NzItNDYuNzkzLTY4Ljk5NS0xMDMuOTgxLTQ1LjQ5Mg0KCQkJCWMtNTQuNTQ0LDIyLjQxNi02OS4xODIsNzcuNTA4LTUxLjk3NCwxMzMuOTIyczEzMC41MDEsMzg4LjA0MywxMzQuNDUsNDMzLjY0bDkwLjQ1NiwwLjU5N2MwLDAtMTYuNDM5LTI2Mi41ODktMjAuNDcyLTMyNi4wNjENCgkJCQlDMTQ5MC40NTEsMTQ0My45NzgsMTQ3MC41ODYsMTM2MC4zMTgsMTQ0NS44NTMsMTMwOC40NDR6Ii8+DQoJCQk8cGF0aCBzdHlsZT0iZmlsbDojRjQ3NDU4OyIgZD0iTTEyOTkuMDA3LDEwMDMuMDAxaDMwMi4zNzJjOCwwLDE1LjIwNyw0LjgzNCwxOC4yNDIsMTIuMjM2bDkzLjEwMywyMjcuMDc0aDE2Ni42OTkNCgkJCQljNC42NjEsMCw4LjQ0LDMuNzc2LDguNDQsOC40MzRsMCwwYzAsNC42NTgtMy43NzksOC40MzQtOC40NCw4LjQzNGgtNDc0LjQ0MWMtMTMuMDQ0LDAtMjQuODczLTcuNjU2LTMwLjIxNC0xOS41NTYNCgkJCQlsLTkzLjc0Ny0yMDguODMyQzEyNzUuMTY1LDEwMTcuNzQ2LDEyODQuNzA4LDEwMDMuMDAxLDEyOTkuMDA3LDEwMDMuMDAxeiIvPg0KCQkJPHBhdGggc3R5bGU9ImZpbGw6I0ZGRkZGRjsiIGQ9Ik0xNDYxLjgwNCwxMTM1LjIyOGMyLjA0MiwxMC4yLDEwLjkzOSwxNy4wMiwxOS44NzEsMTUuMjM0DQoJCQkJYzguOTMyLTEuNzg2LDE0LjUxNy0xMS41MDIsMTIuNDc1LTIxLjcwMmMtMi4wNDMtMTAuMTk5LTEwLjkzOS0xNy4wMi0xOS44NzEtMTUuMjM0DQoJCQkJQzE0NjUuMzQ3LDExMTUuMzEyLDE0NTkuNzYyLDExMjUuMDI4LDE0NjEuODA0LDExMzUuMjI4eiIvPg0KCQkJPGVsbGlwc2Ugc3R5bGU9Im9wYWNpdHk6MC4zO2ZpbGw6IzlCQzFGOTsiIGN4PSIyMzExLjg5OSIgY3k9IjUzMi4xODQiIHJ4PSIxNDkuMzAxIiByeT0iMTQ5LjYxMiIvPg0KCQkJPGc+DQoJCQkJPGc+DQoJCQkJCTxnPg0KCQkJCQkJPHJlY3QgeD0iMjE1MS4zMzIiIHk9IjUyOS4yMzkiIHN0eWxlPSJmaWxsOiMxODQ2NTU7IiB3aWR0aD0iNTUuMDQiIGhlaWdodD0iNC4yMzgiLz4NCgkJCQkJPC9nPg0KCQkJCQk8Zz4NCgkJCQkJCTxyZWN0IHg9IjI0MTcuNzY1IiB5PSI1MjkuMjM5IiBzdHlsZT0iZmlsbDojMTg0NjU1OyIgd2lkdGg9IjU1LjA0IiBoZWlnaHQ9IjQuMjM4Ii8+DQoJCQkJCTwvZz4NCgkJCQkJPGc+DQoJCQkJCQk8cmVjdCB4PSIyMzA5LjU1MyIgeT0iMzcyLjQxMiIgc3R5bGU9ImZpbGw6IzE4NDY1NTsiIHdpZHRoPSI0LjIyOSIgaGVpZ2h0PSI1NS4xNTUiLz4NCgkJCQkJPC9nPg0KCQkJCQk8Zz4NCgkJCQkJCTxyZWN0IHg9IjIzMDkuNTUzIiB5PSI2MzguMzMyIiBzdHlsZT0iZmlsbDojMTg0NjU1OyIgd2lkdGg9IjQuMjI5IiBoZWlnaHQ9IjU1LjE1NSIvPg0KCQkJCQk8L2c+DQoJCQkJCTxwYXRoIHN0eWxlPSJmaWxsOiMxODQ2NTU7IiBkPSJNMjMxNi40NTUsNTMyLjE4NGMwLDIuNTIyLTIuMDQsNC41NjYtNC41NTYsNC41NjZjLTIuNTE2LDAtNC41NTYtMi4wNDQtNC41NTYtNC41NjYNCgkJCQkJCWMwLTIuNTIxLDIuMDQtNC41NjUsNC41NTYtNC41NjVDMjMxNC40MTUsNTI3LjYxOCwyMzE2LjQ1NSw1MjkuNjYyLDIzMTYuNDU1LDUzMi4xODR6Ii8+DQoJCQkJCTxnPg0KCQkJCQkJPHBhdGggc3R5bGU9ImZpbGw6IzE4NDY1NTsiIGQ9Ik0yMzExLjg5OCw1MzQuMjI1Yy0wLjUyMSwwLTEuMDQzLTAuMTk5LTEuNDQtMC41OThsLTgxLjg2Ny04Mi4wMzgNCgkJCQkJCQljLTAuNzk2LTAuNzk3LTAuNzk2LTIuMDg5LDAtMi44ODZjMC43OTUtMC43OTcsMi4wODUtMC43OTcsMi44OCwwbDgxLjg2Nyw4Mi4wMzhjMC43OTYsMC43OTcsMC43OTYsMi4wODksMCwyLjg4Ng0KCQkJCQkJCUMyMzEyLjk0MSw1MzQuMDI2LDIzMTIuNDIsNTM0LjIyNSwyMzExLjg5OCw1MzQuMjI1eiIvPg0KCQkJCQk8L2c+DQoJCQkJCTxnPg0KCQkJCQkJPHBhdGggc3R5bGU9ImZpbGw6IzE4NDY1NTsiIGQ9Ik0yMzM4LjIyMiw2MTUuMDkyYy0wLjMzOC0wLjE3MS0wLjYxMy0wLjQ3MS0wLjc0MS0wLjg2bC0yNi40NjItODAuMDk3DQoJCQkJCQkJYy0wLjI1Ny0wLjc3OCwwLjE2NC0xLjYxOCwwLjk0LTEuODc1YzAuNzc2LTAuMjU4LDEuNjE1LDAuMTY0LDEuODcyLDAuOTQybDI2LjQ2Miw4MC4wOTcNCgkJCQkJCQljMC4yNTcsMC43NzgtMC4xNjQsMS42MTgtMC45NDEsMS44NzVDMjMzOC45NjQsNjE1LjMwNCwyMzM4LjU2LDYxNS4yNjMsMjMzOC4yMjIsNjE1LjA5MnoiLz4NCgkJCQkJPC9nPg0KCQkJCTwvZz4NCgkJCTwvZz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiMwNzM0NUE7IiBkPSJNMjU0OS44NTMsODY5LjY0N2wxMy4zMjYtMjEuNjQ1bC0xMC43MDEtNC4zNGMtMi4zNDItMC45NS0zLjQ3LTMuNjE4LTIuNTIxLTUuOTZsMCwwDQoJCQkJYzAuOTUtMi4zNDIsMy42MTgtMy40NzEsNS45Ni0yLjUyMWwxMi4zNDEsNS4wMDVsMTEuOTE0LTE5LjQzOGwtMTEuNDMtNC42MzVjLTIuMzQyLTAuOTUtMy40Ny0zLjYxOC0yLjUyMS01Ljk2bDAsMA0KCQkJCWMwLjk1LTIuMzQyLDMuNjE4LTMuNDcsNS45Ni0yLjUybDEzLjA3LDUuM2wxMy44MzctMjIuMjU5YzEuMTc2LTEuODkxLDMuNTQyLTIuNjYxLDUuNjA1LTEuODI1bDEuOTk2LDAuODA5DQoJCQkJYzIuNjE5LDEuMDYyLDMuNjU4LDQuMjIxLDIuMTgyLDYuNjMxbC0xMi44NjksMjEuMDA0bDE4Ljk1LDcuNjg1bDEzLjgzNi0yMi4yNTljMS4xNzYtMS44OTEsMy41NDItMi42NjEsNS42MDYtMS44MjUNCgkJCQlsMi4xNzgsMC44ODNjMi42MTksMS4wNjIsMy42NTgsNC4yMjEsMi4xODIsNi42MzFsLTEyLjg2OSwyMS4wMDRsMTAuNzAxLDQuMzRjMi4zNDIsMC45NSwzLjQ3LDMuNjE4LDIuNTIxLDUuOTZsMCwwDQoJCQkJYy0wLjk0OSwyLjM0Mi0zLjYxOCwzLjQ3LTUuOTYsMi41MjFsLTEyLjM0Mi01LjAwNWwtMTEuNzMyLDE5LjUxMWwxMS40MzEsNC42MzVjMi4zNDIsMC45NSwzLjQ3LDMuNjE4LDIuNTIxLDUuOTZsMCwwDQoJCQkJYy0wLjk1LDIuMzQyLTMuNjE4LDMuNDctNS45NiwyLjUyMWwtMTMuMDctNS4zMDFsLTE0LjEzMywyMi45NTVjLTEuMTcxLDEuOTAzLTMuNTQ2LDIuNjgxLTUuNjE2LDEuODQybC0yLjMzNC0wLjk0Nw0KCQkJCWMtMi42MjMtMS4wNjMtMy42Ni00LjIyOS0yLjE3Ny02LjYzOWwxMy4zMjYtMjEuNjQ1bC0xOC45NS03LjY4NWwtMTQuMTMzLDIyLjk1NWMtMS4xNzEsMS45MDMtMy41NDUsMi42ODEtNS42MTYsMS44NDENCgkJCQlsLTIuMzMzLTAuOTQ2QzI1NDkuNDA4LDg3NS4yMjIsMjU0OC4zNyw4NzIuMDU3LDI1NDkuODUzLDg2OS42NDd6IE0yNTk4LjE0Miw4NTIuMzA1bDExLjkxNC0xOS40MzhsLTE4Ljk1LTcuNjg1bC0xMS45MTQsMTkuNDM4DQoJCQkJTDI1OTguMTQyLDg1Mi4zMDV6Ii8+DQoJCQk8cGF0aCBzdHlsZT0iZmlsbDojRjQ4QzdGOyIgZD0iTTEzODAuNzc3LDI4MC44OGwxMy42MjUtMzAuNzUzbC0xNy42MDktMjguNjU4Yy0yLjAwNi0zLjI2NCwwLjYwMi03LjQxMSw0LjQxMy03LjAxOA0KCQkJCWwzMy40NTgsMy40NTVsMjEuODE0LTI1LjYwM2MyLjQ4NC0yLjkxNiw3LjIzNC0xLjcxNyw4LjAzOCwyLjAyOWw3LjA1MywzMi44ODhsMzEuMDkxLDEyLjgzNQ0KCQkJCWMzLjU0MSwxLjQ2MiwzLjg2OSw2LjM1LDAuNTU1LDguMjcxbC0yOS4wOTksMTYuODcxbC0yLjU5OSwzMy41MzVjLTAuMjk2LDMuODItNC44NDQsNS42NDItNy42OTUsMy4wODRsLTI1LjAzNy0yMi40NjINCgkJCQlsLTMyLjY5Nyw3Ljg5MkMxMzgyLjM2MywyODguMTQ0LDEzNzkuMjI1LDI4NC4zODIsMTM4MC43NzcsMjgwLjg4eiIvPg0KCQkJPHBhdGggc3R5bGU9ImZpbGw6I0Y3Q0M3RjsiIGQ9Ik0yMzY3Ljc5NywyODAuODQ5bDEwLjIyLTIzLjA2N2wtMTMuMjA4LTIxLjQ5N2MtMS41MDQtMi40NDgsMC40NTItNS41NTksMy4zMS01LjI2NGwyNS4wOTcsMi41OTINCgkJCQlsMTYuMzYzLTE5LjIwNWMxLjg2NC0yLjE4Nyw1LjQyNy0xLjI4OCw2LjAyOSwxLjUyMmw1LjI5LDI0LjY2OWwyMy4zMjEsOS42MjdjMi42NTYsMS4wOTcsMi45MDIsNC43NjMsMC40MTYsNi4yMDQNCgkJCQlsLTIxLjgyNywxMi42NTVsLTEuOTQ5LDI1LjE1NWMtMC4yMjIsMi44NjUtMy42MzMsNC4yMzItNS43NzIsMi4zMTNsLTE4Ljc4LTE2Ljg0OGwtMjQuNTI2LDUuOTE5DQoJCQkJQzIzNjguOTg3LDI4Ni4yOTgsMjM2Ni42MzMsMjgzLjQ3NiwyMzY3Ljc5NywyODAuODQ5eiIvPg0KCQkJPHBhdGggc3R5bGU9ImZpbGw6I0Y0OEM3RjsiIGQ9Ik0yMjY2LjM1MSw5MzkuOTIzbC0xLjYxOS0xOS4xMDhsLTE2LjY1OS05LjQ5OWMtMS44OTctMS4wODItMS43My0zLjg3LDAuMjgyLTQuNzE4bDE3LjY3Mi03LjQ0NQ0KCQkJCWwzLjg4Ni0xOC43NzljMC40NDMtMi4xMzksMy4xNDYtMi44NDIsNC41NzQtMS4xOWwxMi41NDIsMTQuNTA3bDE5LjA2MS0yLjEwN2MyLjE3MS0wLjI0LDMuNjc1LDIuMTE0LDIuNTQ1LDMuOTgzbC05LjkyMSwxNi40MTENCgkJCQlsNy44OTQsMTcuNDc2YzAuODk5LDEuOTkxLTAuODc1LDQuMTQ4LTMuMDAxLDMuNjUxbC0xOC42NzMtNC4zNjVsLTE0LjE4MiwxMi45MDgNCgkJCQlDMjI2OS4xMzYsOTQzLjEyLDIyNjYuNTM2LDk0Mi4xLDIyNjYuMzUxLDkzOS45MjN6Ii8+DQoJCQk8cGF0aCBzdHlsZT0iZmlsbDojRjdDQzdGOyIgZD0iTTczNy42NjMsNjU4Ljk5NWw3LjQ5NS0xNi45MTZsLTkuNjg2LTE1Ljc2NGMtMS4xMDMtMS43OTYsMC4zMzEtNC4wNzcsMi40MjctMy44NmwxOC40MDQsMS45MDENCgkJCQlsMTEuOTk5LTE0LjA4NGMxLjM2Ny0xLjYwNCwzLjk3OS0wLjk0NCw0LjQyMSwxLjExNmwzLjg4LDE4LjA5MWwxNy4xMDIsNy4wNmMxLjk0OCwwLjgwNCwyLjEyOCwzLjQ5MywwLjMwNSw0LjU1bC0xNi4wMDYsOS4yOA0KCQkJCWwtMS40MywxOC40NDdjLTAuMTYzLDIuMTAxLTIuNjY0LDMuMTAzLTQuMjMzLDEuNjk2bC0xMy43NzItMTIuMzU1bC0xNy45ODYsNC4zNDENCgkJCQlDNzM4LjUzNiw2NjIuOTkxLDczNi44MSw2NjAuOTIyLDczNy42NjMsNjU4Ljk5NXoiLz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiM1MEJGQTU7IiBkPSJNMTMxNy43NTcsNjI4LjM4NWw3LjQ5NS0xNi45MTZsLTkuNjg2LTE1Ljc2NGMtMS4xMDMtMS43OTYsMC4zMzEtNC4wNzcsMi40MjctMy44NmwxOC40MDQsMS45MDENCgkJCQlsMTEuOTk5LTE0LjA4M2MxLjM2Ny0xLjYwNCwzLjk3OS0wLjk0NSw0LjQyMSwxLjExNmwzLjg4LDE4LjA5MWwxNy4xMDIsNy4wNmMxLjk0OCwwLjgwNCwyLjEyOCwzLjQ5MywwLjMwNSw0LjU1bC0xNi4wMDYsOS4yOA0KCQkJCWwtMS40MjksMTguNDQ3Yy0wLjE2MywyLjEwMS0yLjY2NCwzLjEwMy00LjIzMywxLjY5NmwtMTMuNzcyLTEyLjM1NWwtMTcuOTg2LDQuMzQxDQoJCQkJQzEzMTguNjI5LDYzMi4zODEsMTMxNi45MDMsNjMwLjMxMSwxMzE3Ljc1Nyw2MjguMzg1eiIvPg0KCQkJPHBvbHlnb24gc3R5bGU9ImZpbGw6IzUwQkZBNTsiIHBvaW50cz0iMTAyOC45MzgsMzU0LjM1IDEwNTguNjM5LDM1MC4wNDMgMTA3MC44NDksMzk3LjA2NSAxMTE1LjA1MiwzOTYuMTIxIDExMjkuOTQzLDQyOS44MTcgDQoJCQkJMTE0Nyw0MjIuMjc4IDExMjcuMDg0LDM3Ny4yMTIgMTA4NS4xOTUsMzc4LjEwNiAxMDcyLjQ5MSwzMjkuMTg5IDEwMjcuNzk5LDMzNS42NzIgCQkJIi8+DQoJCQk8cG9seWdvbiBzdHlsZT0iZmlsbDojMDczNDVBOyIgcG9pbnRzPSI5NjUuMjU2LDExNDIuMDA3IDk4Ny43MzIsMTEyMi4xMiAxMDIzLjcyNiwxMTU0Ljc0OCAxMDYwLjE3NCwxMTI5LjcyMiANCgkJCQkxMDkxLjEwMywxMTQ5LjczNiAxMTAxLjIzNCwxMTM0LjA3OSAxMDU5Ljg2OCwxMTA3LjMxMSAxMDI1LjMyNywxMTMxLjAyOCA5ODcuODgyLDEwOTcuMDg1IDk1NC4wNjIsMTEyNy4wMTEgCQkJIi8+DQoJCQk8cGF0aCBzdHlsZT0iZmlsbDojNTBCRkE1OyIgZD0iTTYxMi4yNTMsMTE2Ni42MDlsMTguODYxLTMwLjYzNGwtMTUuMTQ2LTYuMTQyYy0zLjMxNC0xLjM0NC00LjkxMS01LjEyLTMuNTY3LTguNDM1bDAsMA0KCQkJCWMxLjM0NC0zLjMxNSw1LjEyMS00LjkxMiw4LjQzNS0zLjU2OGwxNy40NjcsNy4wODNsMTYuODYyLTI3LjUxbC0xNi4xNzctNi41NmMtMy4zMTQtMS4zNDQtNC45MTItNS4xMi0zLjU2OC04LjQzNWwwLDANCgkJCQljMS4zNDQtMy4zMTQsNS4xMi00LjkxMSw4LjQzNS0zLjU2OGwxOC40OTgsNy41MDJsMTkuNTgzLTMxLjUwNGMxLjY2NC0yLjY3Nyw1LjAxMy0zLjc2Nyw3LjkzNC0yLjU4M2wyLjgyNCwxLjE0Ng0KCQkJCWMzLjcwNiwxLjUwMyw1LjE3OCw1Ljk3NCwzLjA4OCw5LjM4NGwtMTguMjEzLDI5LjcyN2wyNi44MiwxMC44NzdsMTkuNTgzLTMxLjUwNGMxLjY2NC0yLjY3Nyw1LjAxMy0zLjc2Nyw3LjkzNC0yLjU4Mw0KCQkJCWwzLjA4MiwxLjI1YzMuNzA2LDEuNTAzLDUuMTc4LDUuOTc0LDMuMDg4LDkuMzg0bC0xOC4yMTMsMjkuNzI3bDE1LjE0Niw2LjE0MmMzLjMxNCwxLjM0NCw0LjkxMSw1LjEyLDMuNTY3LDguNDM1bDAsMA0KCQkJCWMtMS4zNDQsMy4zMTQtNS4xMiw0LjkxMi04LjQzNSwzLjU2OGwtMTcuNDY3LTcuMDgzbC0xNi42MDQsMjcuNjE1bDE2LjE3Nyw2LjU2MWMzLjMxNSwxLjM0NCw0LjkxMiw1LjEyLDMuNTY4LDguNDM1bDAsMA0KCQkJCWMtMS4zNDQsMy4zMTQtNS4xMjEsNC45MTItOC40MzUsMy41NjdsLTE4LjQ5OS03LjUwMmwtMjAuMDAzLDMyLjQ4OWMtMS42NTgsMi42OTMtNS4wMTgsMy43OTUtNy45NDgsMi42MDZsLTMuMzAzLTEuMzM5DQoJCQkJYy0zLjcxMi0xLjUwNS01LjE4MS01Ljk4NS0zLjA4MS05LjM5NmwxOC44NjEtMzAuNjM0bC0yNi44MjEtMTAuODc3bC0yMC4wMDMsMzIuNDg4Yy0xLjY1OCwyLjY5My01LjAxOCwzLjc5NC03Ljk0OCwyLjYwNg0KCQkJCWwtMy4zMDItMS4zMzlDNjExLjYyMiwxMTc0LjUsNjEwLjE1MywxMTcwLjAyLDYxMi4yNTMsMTE2Ni42MDl6IE02ODAuNTk2LDExNDIuMDY2bDE2Ljg2Mi0yNy41MWwtMjYuODItMTAuODc3bC0xNi44NjIsMjcuNTENCgkJCQlMNjgwLjU5NiwxMTQyLjA2NnoiLz4NCgkJCTxnPg0KCQkJCTxwYXRoIHN0eWxlPSJmaWxsOiMzQzhGN0M7IiBkPSJNMjMyNS41ODQsMTU1NC4xNTVjLTEuOTE4LTE2Ljk0MS00LjE5Ni0zNC4yNjktMTIuMDYtNDkuMzg5DQoJCQkJCWMtOS41NjItMTguMzgzLTI2LjM1OS0zMS42NDgtNDEuMDM1LTQ2LjI1OGMtMjcuNDIyLTI3LjMtNDguNTI0LTYwLjkzNS02MS4xODktOTcuNTMxDQoJCQkJCWMtOS43OTMtMjguMjk4LTE0LjY3Ni01OC40NDctMjguMTcyLTg1LjE3MWMtOC4yNDEtMTYuMzE4LTE5LjQ3OS0zMC45MDYtMjguODM5LTQ2LjYwNg0KCQkJCQljLTIyLjEyNS0zNy4xMDctMzQuMTY2LTgwLjk2Mi02NC4xNjgtMTEyLjAyYy01Ljc3MywzNy42NTcsNS42MzYsNzcuNjE2LDMwLjQxMiwxMDYuNTE0DQoJCQkJCWM3LjM4OSw4LjYxOCwxNS45NTksMTYuMzg3LDIxLjU4OCwyNi4yNWMxMC4yMTksMTcuOTAzLDkuMjg4LDM5Ljc0OCwxMC40ODUsNjAuMzM4YzIuMjUsMzguNjk3LDEzLjE1NSw3Ni44NjUsMzEuNjg0LDExMC44OTINCgkJCQkJYzE5LjY4MywzNi4xNDYsNDguMDk1LDY4LjMzMyw1OC42MiwxMDguMTM3YzcuODg2LDI5LjgyOCw1LjU0Myw2My4yODYsMjIuMzU2LDg5LjEzN2MxLjgyMiwyLjgwMSwzLjkwNyw1LjYxNiw0LjM1NCw4LjkyOQ0KCQkJCQljMC4yNTEsMS44NjItMC4wNCwzLjc0OS0wLjMzMSw1LjYwNWMtMC4zNzYsMi40MDEtMC43NTMsNC44MDMtMS4xMjksNy4yMDRjLTMuODI2LDI0LjQxMy03Ljc3OCw1NS40NzYsMTMuMiw3My43NDcNCgkJCQkJYzE0LjUzOSwxMi42NjMsMzMuMjUxLDEyLjk0Niw0My42OTMtMy44NzRjMTAuNTE0LTE2LjkzNiw5LjU4Mi00MS43MjMsOC44MDEtNjAuNzg0DQoJCQkJCUMyMzMyLjU1NiwxNjE3LjUzNiwyMzI5LjE1NywxNTg1LjcwNywyMzI1LjU4NCwxNTU0LjE1NXoiLz4NCgkJCQk8cGF0aCBzdHlsZT0iZmlsbDojMzI3RjZCOyIgZD0iTTIzNjMuMzcsMTUzNC41MTljLTguMTYyLTI4LjI2LTIwLjgyOS01NS4xNzUtMjcuMTc3LTgzLjg5OA0KCQkJCQljLTYuMTU3LTI3Ljg2MS02LjIwNS01Ni42NjQtNi4yMjYtODUuMmMtMC4wMjItMzEuMjY5LTAuMDQ0LTYyLjUzOC0wLjA2Ny05My44MDdjLTAuMDE0LTE5LjQ2Ny0wLjAzNi0zOS4wNC0zLjI1My01OC4yMzgNCgkJCQkJYy02LjkyMi00MS4zMDctMjguMzktNzkuNTAyLTMyLjAyNy0xMjEuMjI5Yy0xLjU3My0xOC4wNDQsMC4yNTMtMzYuMjgxLTEuNzMtNTQuMjg1Yy0xLjEzNC0xMC4yODUtMy43NzMtMjAuNzgzLTguNTMzLTI5LjkwOA0KCQkJCQljLTUuMTItOS44MTMtMTkuMjY2LTkuMzgtMjMuOTA1LDAuNjcxYy0xMC40MjgsMjIuNTkzLTE3LjA0MSw0Ny4wMTUtMTIuODI4LDcxLjIyMmMyLjUyNywxNC41Miw4LjgxNiwyOC4wNjMsMTMuNTEyLDQyLjAzMg0KCQkJCQljMjAuOTExLDYyLjIwNSw5LjgxLDEzMS4wNjQsMjUuOTksMTk0LjY3YzQuODg0LDE5LjE5OSwxMi4yNjksMzguMDI3LDEzLjEyOCw1Ny44MjJjMi4wNTYsNDcuMzc1LTMzLjMyNyw5MC42NTEtMzAuMDgyLDEzNy45Ng0KCQkJCQljMi42NjEsMzguNzg4LDMwLjU0OCw3MC44ODgsNDIuMjUyLDEwNy45NTZjNi41NTIsMjAuNzUxLDcuOTU2LDQyLjkwMSwxNC45NzYsNjMuNDk4YzUuNDU0LDE2LjAwMywxOC4xMzcsMzUuNDM2LDM3LjgzOSwzMC41NzkNCgkJCQkJYzE4LjcwMy00LjYxMSwxMy4wNTItMTkuODc4LDEyLjIxNy0zNC40NkMyMzc0LjYyOSwxNjMwLjU3NCwyMzc3LjI4OSwxNTgyLjcxMSwyMzYzLjM3LDE1MzQuNTE5eiIvPg0KCQkJCTxwYXRoIHN0eWxlPSJmaWxsOiMzQzhGN0M7IiBkPSJNMjQwNi4xODEsMTU2MC40MTVjLTAuODIzLTE0LjY4NC0zLjMwMi0yOS40NDktMS4yNDktNDQuMDEyDQoJCQkJCWMxLjczNS0xMi4yOTksNi42My0yMy44ODksMTAuMTI2LTM1LjgwNmM2LjU1Mi0yMi4zMyw4LjE3Ni00NS43NjgsOS43NjItNjguOTg5YzIuODg0LTQyLjIxMSw1Ljc2OC04NC40MjEsOC42NTItMTI2LjYzMg0KCQkJCQljNC40ODMtNjUuNjE0LDguOTktMTMxLjQxNCwyMS4yNTctMTk2LjAyMmMzLjQwNi0xNy45MzksNy4yMzEtMzcuMzc1LTAuODMxLTUzLjc1MWMtMS42OTktMy40NTItNS4wNDQtNy4xMTQtOC43MS01Ljk2NQ0KCQkJCQljLTIuNjExLDAuODE4LTMuODkzLDMuNjk1LTQuODQsNi4yNjhjLTI2LjgxNiw3Mi44NzktMzYuOTUzLDE1MS4zNDMtNjYuODg1LDIyMi45OTRjLTcuMTcsMTcuMTY0LTE1LjUxLDM0LjA1MS0xOS4yMjMsNTIuMjgzDQoJCQkJCWMtNC40NTcsMjEuODkyLTIuMDA5LDQ0LjUwNi0xLjQzNCw2Ni44NDJjMC44MjUsMzIuMDM0LTIuMjk0LDY0LjMxMi0xMS4xNCw5NS4xMDdjLTQuNjI4LDE2LjExMi0xMC44MjUsMzEuODYtMTMuMzYxLDQ4LjQzMw0KCQkJCQljLTMuMTYyLDIwLjY2NC0wLjUwNyw0MS43MTIsMS40NzIsNjIuNTIzYzMuODA1LDQwLjAxLDUuMDk1LDgwLjI1OSwzLjg1OCwxMjAuNDMxYy0wLjcyNywyMy42MTcsMTkuMjA5LDIyLjk5OSwzMi40MTcsOC40ODkNCgkJCQkJYzkuMjM2LTEwLjE0Nyw5LjE1MS0yMS4yODYsMTIuMzEzLTMzLjkxOEMyMzg4Ljc0OSwxNjM3LjIyMSwyNDA4LjcwMiwxNjA1LjM3NiwyNDA2LjE4MSwxNTYwLjQxNXoiLz4NCgkJCQk8cGF0aCBzdHlsZT0iZmlsbDojMzI3RjZCOyIgZD0iTTIyODEuNjI1LDE2MjQuNDU3Yy0xNy42MjktMjguMzI1LTUyLjc0OC00NC40MjktNjQuMDE1LTc1Ljg0NA0KCQkJCQljLTIuODY3LTcuOTk1LTMuOTg3LTE2LjU5Mi03LjQ5LTI0LjMyOGMtNy43OC0xNy4xODEtMjUuNDY3LTI2Ljg5MS00Mi44NTYtMzQuNzk1Yy0yLjQxNS0xLjA5OC01LjE1OSwwLjY1Mi01LjE5NiwzLjMwOWwwLDANCgkJCQkJYy0wLjA1OCw0LjIyNCwxLjk0NSw4LjI1NCw1LjQ0NCwxMC42MWMxMy4zOTUsOS4wMTgsMjMuNTc2LDIyLjgwMywyOC4xMDgsMzguMzM3YzUuMzcxLDE4LjQxMSwzLjA0MSwzOC41OTQsOS43MTcsNTYuNTcyDQoJCQkJCWM1LjYwNCwxNS4wOTIsMTcuMTQzLDI3LjQyOSwyMi41NjMsNDIuNTg5YzQuOTU1LDEzLjg1OSw0LjQzNCwyOC45OTksNi43NjMsNDMuNTMzYzIuMzI5LDE0LjUzNCw4Ljc4NSwyOS45NTcsMjIuMTMxLDM2LjEwNw0KCQkJCQlDMjMwNS4wODMsMTc0Mi43OTcsMjI5My4wMTQsMTY0Mi43NTYsMjI4MS42MjUsMTYyNC40NTd6Ii8+DQoJCQkJPHBhdGggc3R5bGU9ImZpbGw6IzNDOEY3QzsiIGQ9Ik0yNDgyLjQ2OSwxNjE1LjEwOWMtMC43NTIsMTMuNjk0LDEuMzQyLDI4LjA1MS00LjAxNyw0MC42NzINCgkJCQkJYy0zLjQyOCw4LjA3NC05LjU5NiwxNC42MDItMTQuNjU4LDIxLjc2MmMtMTcuNzc1LDI1LjE0My0yNC4yMjIsNjAuNzY4LTUxLjUzNSw3NC45MjJjLTEuODAyLDAuOTM0LTMuODEzLDEuNzctNS44MDcsMS4zOTgNCgkJCQkJYy0yLjc5OS0wLjUyMi00LjYzMy0zLjIxOS01Ljc1OC01Ljg0Yy02LjY5Ni0xNS42MDEsMC44MTgtMzMuMTc3LDUuMjY3LTQ5LjU2NGMwLjc3OC0yLjg2OCwxLjQzMi02LjA2MywwLjA2NS04LjcNCgkJCQkJYy0xLjUwMy0yLjktNC45MzEtNC4xNTgtNy4yNzEtNi40MzRjLTQuNjY3LTQuNTM5LTQuMjI3LTEyLjA0OS0zLjMwMS0xOC41YzIuMzE2LTE2LjExNiw1LjU3MS0zMi4wOTcsOS43NDItNDcuODMzDQoJCQkJCWMyLjM2Ni04LjkyNCw1LjA5OC0xNy45MjUsMTAuMjQtMjUuNTg2YzUuNjYtOC40MzQsMTMuODgtMTQuNzMsMjEuNTc1LTIxLjM1YzM0LjAxLTI5LjI1OCw2MC4wNjMtNjcuNzE1LDc0LjY0NS0xMTAuMTg5DQoJCQkJCWMzLjE1Ny05LjE5NSw1Ljk3MS0xOC45MDIsMTIuNDkyLTI2LjEwM2M2LjUyMS03LjIwMSwxOC4xNDQtMTAuOTA3LDI2LjA4NS01LjMxOWM1LjY1LDMuOTc2LTE3LjQ5NCw0MS4yMDMtMjAuMTkyLDQ1LjY2Nw0KCQkJCQljLTcuNzEsMTIuNzU2LTcuODEzLDIzLjg1Ny0xMi4xNzEsMzguMDI0QzI1MDcuMTkxLDE1NDYuODQ4LDI0ODQuNTEyLDE1NzcuOTE3LDI0ODIuNDY5LDE2MTUuMTA5eiIvPg0KCQkJCTxwYXRoIHN0eWxlPSJmaWxsOiMzMjdGNkI7IiBkPSJNMjQ1NS41NDksMTYzMC45NDVjNS4wNTItMTMuMDY0LDEwLjE0Ny0yNi4yOTgsMTEuODEyLTQwLjIwOQ0KCQkJCQljMS44NTEtMTUuNDY0LTAuNjA0LTMxLjI3OSwyLjAzNy00Ni42MjhjMy4zOTYtMTkuNzMyLDE0LjkwMS0zNy4wODgsMjAuNTk2LTU2LjI4YzQuMTEzLTEzLjg2LDUuMTIzLTI4LjQyMyw3LjU5My00Mi42NjkNCgkJCQkJYzcuMDY0LTQwLjczOCwyNi4yMTctODAuNTQ2LDIwLjcyLTEyMS41MjZjLTEuMTk2LTguOTE0LTUuMjE5LTE5LjMwNC0xNC4wNjUtMjAuODI0Yy04LjAwOC0xLjM3Ni0xNS4zLDUuOTQ3LTE3LjM4MiwxMy44MTYNCgkJCQkJYy0yLjA4Myw3Ljg3LTAuNTI5LDE2LjE3MSwwLjA0MywyNC4yOTJjMS41OTUsMjIuNjQ5LTQuODY3LDQ1Ljc4Ni0xNy45NjIsNjQuMzE1Yy0xMi41ODIsMTcuODAyLTMwLjgzNiwzMS4yMDctNDIuMTU5LDQ5Ljg0DQoJCQkJCWMtMTMuODg4LDIyLjg1NS0xNS43NzgsNTAuNzU1LTIyLjg2NCw3Ni41NTRjLTE0LjA5Myw1MS4zMDYtNDkuNDM5LDk2LjA2My01NS44ODMsMTQ4Ljg4NA0KCQkJCQljLTIuNTY0LDIxLjAxOCwyLjM2OSw0Ni41NjcsMjEuNzY3LDU0Ljk2NEMyNDI1LjkwNSwxNzU5Ljc2LDI0NDIuODQsMTY2My44MTEsMjQ1NS41NDksMTYzMC45NDV6Ii8+DQoJCQkJPHBhdGggc3R5bGU9ImZpbGw6I0Y0NzQ1ODsiIGQ9Ik0yMzU3LjQ3NCwxNjk2LjA1OWgtOC45NzNoLTExOS43NzljLTguODAzLDAtMTUuMjk4LDguMjM2LTEzLjI2MiwxNi44MThsNDYuOTM1LDE5Ny45MTUNCgkJCQkJYzEuNDYsNi4xNTYsNi45NDgsMTAuNTAyLDEzLjI2MiwxMC41MDJoNzIuODQ1aDguOTczaDcyLjg0NGM2LjMxNSwwLDExLjgwMy00LjM0NiwxMy4yNjMtMTAuNTAybDQ2LjkzNS0xOTcuOTE1DQoJCQkJCWMyLjAzNS04LjU4Mi00LjQ2LTE2LjgxOC0xMy4yNjMtMTYuODE4SDIzNTcuNDc0eiIvPg0KCQkJPC9nPg0KCQkJPGc+DQoJCQkJPHJlY3QgeD0iNDM5Ljg0MyIgeT0iMTQ2NC40MTYiIHN0eWxlPSJmaWxsOiMxODQ2NTU7IiB3aWR0aD0iNjI1Ljg1MiIgaGVpZ2h0PSIzMi4zMjUiLz4NCgkJCQk8cmVjdCB4PSI0NTEuMTU3IiB5PSIxNjUxLjkyNyIgc3R5bGU9ImZpbGw6IzE4NDY1NTsiIHdpZHRoPSI0MDkuMTgyIiBoZWlnaHQ9IjI4LjI4NCIvPg0KCQkJCTxyZWN0IHg9Ijk3Ny44NzciIHk9IjE0ODAuNTc4IiBzdHlsZT0iZmlsbDojMTg0NjU1OyIgd2lkdGg9IjI2LjM5OSIgaGVpZ2h0PSI0NDAuODY1Ii8+DQoJCQkJPHJlY3QgeD0iNjA0LjUyMiIgeT0iMTQ4MC41NzgiIHN0eWxlPSJmaWxsOiMxODQ2NTU7IiB3aWR0aD0iMjYuMzk5IiBoZWlnaHQ9IjQ0MC44NjUiLz4NCgkJCQk8cG9seWdvbiBzdHlsZT0iZmlsbDojMTg0NjU1OyIgcG9pbnRzPSI3OTAuMTA0LDE5MjEuNDQyIDkzMi4zMTcsMTQ4NC4zNjkgOTA5LjAwNiwxNDc2Ljc4NiA3NjQuMzI2LDE5MjEuNDQyIAkJCQkiLz4NCgkJCQk8cG9seWdvbiBzdHlsZT0iZmlsbDojMTg0NjU1OyIgcG9pbnRzPSIzOTAuMDYsMTkyMS40NDIgNTExLjY5NiwxNDgzLjQxMyA0ODguMDc2LDE0NzYuODU0IDM2NC42MTgsMTkyMS40NDIgCQkJCSIvPg0KCQkJPC9nPg0KCQkJPHBhdGggc3R5bGU9ImZpbGw6IzE4NDY1NTsiIGQ9Ik0yMzExLjg5OCwzNTcuNDU0Yy05Ni4zLDAtMTc0LjM2Niw3OC4yMjktMTc0LjM2NiwxNzQuNzNzNzguMDY2LDE3NC43MywxNzQuMzY2LDE3NC43Mw0KCQkJCWM5Ni4zMDEsMCwxNzQuMzY3LTc4LjIyOSwxNzQuMzY3LTE3NC43M1MyNDA4LjE5OSwzNTcuNDU0LDIzMTEuODk4LDM1Ny40NTR6IE0yMzIxLjI1LDY4MS41MDMNCgkJCQljLTgyLjI5NSw1LjE3NS0xNTMuMTk1LTU3LjQ4Mi0xNTguMzYtMTM5Ljk0OGMtNS4xNjQtODIuNDY2LDU3LjM2Mi0xNTMuNTE0LDEzOS42NTctMTU4LjY4OQ0KCQkJCWM4Mi4yOTUtNS4xNzUsMTUzLjE5NSw1Ny40ODIsMTU4LjM1OSwxMzkuOTQ4QzI0NjYuMDcxLDYwNS4yNzksMjQwMy41NDUsNjc2LjMyNywyMzIxLjI1LDY4MS41MDN6Ii8+DQoJCTwvZz4NCgkJPHJlY3QgeD0iMTk5LjA5OSIgeT0iMTkxOC43MzkiIHN0eWxlPSJmaWxsOiMwNDJBNDQ7IiB3aWR0aD0iMjg3NC42MzUiIGhlaWdodD0iMTkuNDk2Ii8+DQoJPC9nPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBkPSJNMTY0Ni44OTIsNjcyLjI4Nmw0Ni40ODktMC43NTljMCwwLTAuNzgzLDE3LjY3NS0yMS4yMTcsMTguNTk5DQoJCUMxNjQ3LjI0OCw2OTEuMjUzLDE2NDYuODkyLDY3Mi4yODYsMTY0Ni44OTIsNjcyLjI4NnoiLz4NCjwvZz4NCjwvc3ZnPg0K);
height: 100px;">Test</div>`

After digging a bit into the code it seems that the problem might be in tokenizer for style attribute

Assumption that ; can be present only at the end of CSS rule is not correct. I think the common use case where that is not true is base64 encoded images (like in the example above). Tokenizer only returns beggining of the encoded value ('url(data:image/svg+xml').

To make this even worse these values are often long (not hard to find ~10kb strings in the wild) which contributes to slow performance of regex.

Sample fix idea:

function parseStyles(style: string): string[] {
+  let re = /\s*([\w-]+)\s*:\s*((url\(.*?\)[^;]*|[^;]+))/g,
-  let re = /\s*([\w-]+)\s*:\s*([^;]+)/g,
    m,
    result = []
  while ((m = re.exec(style))) result.push(m[1], m[2].trim())
  return result
}

I'm sure that there are probably more cases than url() which could potentially cause this issue. content: "Random content:;" comes into my mind, but I don't think it is that common (and especially in inline styles).

That might be one of these cases where it's hard to find the right balance between spec compliance and correctness vs parsing speed.

marijnh commented 1 month ago

On closer look, it appears there's no need to split these ourselves at all, given that the DOM element style property already has this information. Does attached patch look reasonable to you?

marlass commented 1 month ago

Thanks! That looks nice. I'm not only sure if the access to CSS property value through [name] is fully compatible with theCSSStyleDeclaration interface. I'm having trouble accessing it like this in the browser.

We are using zeed-dom as a lightweight DOM parser and this change exposed the same issue there as well 😅 and additionally it seems that its style getter interface is not at all compatible with CSSStyleDeclaration. I'll report the issue there as well.

marijnh commented 1 month ago

I'm not only sure if the access to CSS property value through [name] is fully compatible with theCSSStyleDeclaration interface. I'm having trouble accessing it like this in the browser.

Could you elaborate on this? What exactly is going wrong?

marlass commented 1 month ago

I guess for 99.9% of the use cases it's alright, but for example with CSS vars different access methods return different result.

image
marijnh commented 1 month ago

Oh, indeed. I didn't know getPropertyValue exists. That seems like a preferable approach. Adjusted in attached patch.

marlass commented 1 month ago

Thanks for such a quick fix! I guess it can be closed now 🎉