<snapdata remixID="10186620"><project name="snap spam request demo" app="Snap! 6, https://snap.berkeley.edu" version="1"><notes></notes><thumbnail>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAACbUlEQVR4Xu3XwWmEUABF0W8xdjCNuLYK63JrP/bhxkAgIZsku7kgZ7YKD+8/KDPd930PPwWiAhOAUXmznwUABCEtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYA8Jf8r9drbNs21nVND+jp4wD+ccLLsnxfPc9z7Ps+5nl+uom3Ph+A/+T+ifDr1mmaxnVd4ziOtx7WE8cABDB1DaBPMIBpAX9C0vzegGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jf+AdcV/KgRNV2yAAAAAElFTkSuQmCC</thumbnail><stage name="Stage" width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" penlog="false" volume="100" pan="0" lines="round" ternary="false" hyperops="true" codify="false" inheritance="true" sublistIDs="false" scheduled="false" id="1"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAOhUlEQVR4Xu3VwQkAAAjEMN1/abewn7jAQRC64wgQIECAAIF3gX1fNEiAAAECBAiMAHsCAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQIHLFxAWmhEwHPAAAAAElFTkSuQmCC</pentrails><costumes><list struct="atomic" id="2"></list></costumes><sounds><list struct="atomic" id="3"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites><sprite name="Sprite" idx="1" x="0" y="0" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" costume="0" color="80,80,80,1" pen="tip" id="8"><costumes><list struct="atomic" id="9"></list></costumes><sounds><list struct="atomic" id="10"></list></sounds><blocks></blocks><variables></variables><scripts><script x="45" y="10"><block s="receiveGo"></block><block s="doForever"><script><block s="doSetVar"><l>html</l><block s="reportURL"><l>snap.berkeley.edu</l></block></block></script></block></script></scripts></sprite><watcher var="html" style="normal" x="10" y="10" color="243,118,29" hidden="true"/></sprites></stage><hidden></hidden><headers></headers><code></code><blocks></blocks><variables><variable name="html"><l>&lt;!DOCTYPE html&gt;&#xD;&lt;html&gt;&#xD;    &lt;head&gt;&#xD;	&lt;meta name="snap-cloud-domain" location="https://snap.berkeley.edu:443"&gt;&#xD;        &lt;meta charset="UTF-8"&gt;&#xD;        &lt;title&gt;Snap! Build Your Own Blocks&lt;/title&gt;&#xD;        &lt;meta name="description" content="The Snap! social platform"&gt;&#xD;        &lt;meta name="author" content="Bernat Romagosa"&gt;&#xD;        &lt;meta name="snap-cloud-domain" location="https://snap.berkeley.edu"&gt;&#xD;        &lt;link rel="icon" href="favicon.ico"&gt;&#xD;        &lt;meta name="viewport" content="width=device-width, initial-scale=1"&gt;&#xD;        &lt;!-- External libs, both stylesheets and JS --&gt;&#xD;        &lt;link rel="stylesheet" href="libs/reset.css"&gt;&#xD;        &lt;link rel="stylesheet" href="libs/pure-min.css"&gt;&#xD;        &lt;link rel="stylesheet"&#xD;            href="https://use.fontawesome.com/releases/v5.7.1/css/all.css"&#xD;            integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr"&#xD;            crossorigin="anonymous"&gt;&#xD;        &lt;link rel="stylesheet" href="libs/custom-alert.css"&gt;&#xD;        &lt;script type="text/javascript" src="libs/FileSaver.min.js"&gt;&lt;/script&gt;&#xD;        &lt;!-- Stylesheets --&gt;&#xD;        &lt;link rel="stylesheet" href="style/elements.css"&gt;&#xD;        &lt;link rel="stylesheet" href="style/classes.css"&gt;&#xD;        &lt;link rel="stylesheet" href="style/layout.css"&gt;&#xD;        &lt;!-- JS --&gt;&#xD;        &lt;script type="text/javascript" src="js/locale.js"&gt;&lt;/script&gt;&#xD;        &lt;script type="text/javascript" src="js/base.js"&gt;&lt;/script&gt;&#xD;        &lt;script type="text/javascript" src="libs/cloud.js"&gt;&lt;/script&gt;&#xD;        &lt;script type="text/javascript"&gt;SnapCloud = new Cloud();&lt;/script&gt;&#xD;        &lt;script type="text/javascript" src="libs/sha512.js"&gt;&lt;/script&gt;&#xD;    &lt;/head&gt;&#xD;    &lt;body&gt;&#xD;        &lt;script type="text/javascript" src="libs/custom-alert.min.js"&gt;&lt;/script&gt;&#xD;        &lt;script&gt;new customAlert();&lt;/script&gt;&#xD;        &lt;div id="loading"&gt;&#xD;            &lt;i class="fas fa-spinner fa-spin fa-3x" aria-hidden="true"&gt;&lt;/i&gt;&#xD;        &lt;/div&gt;&#xD;&lt;nav id="top-bar"&gt;&#xD;    &lt;div class="pure-menu-horizontal pure-menu"&gt;&#xD;        &lt;ul class="pure-g pure-menu-list"&gt;&#xD;            &lt;a class="pure-u-1-12" href="/" aria-label="Snap! home page"&gt;&#xD;                &lt;img src="img/topbar-logo.png" class="logo clickable"/&gt;&#xD;            &lt;/a&gt;&#xD;            &lt;span class="pure-u-5-12"&gt;&#xD;                &lt;li class="pure-menu-item"&gt;&#xD;                    &lt;a localizable class="pure-menu-link run"&#xD;                        target="_blank"&gt;Run Snap&lt;em&gt;!&lt;/em&gt;&lt;/a&gt;&#xD;                &lt;/li&gt;&#xD;                &lt;li class="pure-menu-item"&gt;&#xD;                    &lt;a localizable class="pure-menu-link explore"&#xD;                        href="explore"&gt;Explore&lt;/a&gt;&#xD;                &lt;/li&gt;&#xD;                &lt;li class="pure-menu-item"&gt;&#xD;                    &lt;a localizable class="pure-menu-link forum"&#xD;                        href="https://forum.snap.berkeley.edu/"&gt;Forum&lt;/a&gt;&#xD;                &lt;/li&gt;&#xD;                &lt;!--   =======   Snap!Con   =======&#xD;                &lt;li class="pure-menu-item"&gt;&#xD;                    &lt;a localizable class="pure-menu-link" target="_blank"&#xD;                    href="https://www.snapcon.org"&gt;Snap&lt;em&gt;!&lt;/em&gt;Con&lt;/a&gt;&#xD;                &lt;/li&gt;&#xD;                --&gt;&#xD;            &lt;/span&gt;&#xD;            &lt;i class="pure-u-1-24"&gt;&lt;/i&gt;&#xD;            &lt;div class="search pure-u-1-6"&gt;&#xD;                &lt;form action="search"&gt;&#xD;                    &lt;input type="text" name="query"&gt;&#xD;                    &lt;i class="fas fa-search"&gt;&lt;/i&gt;&#xD;                &lt;/form&gt;&#xD;            &lt;/div&gt;&#xD;            &lt;i class="pure-u-1-24"&gt;&lt;/i&gt;&#xD;            &lt;li hidden="true" class="join pure-menu-item pure-u-1-12"&gt;&#xD;                &lt;a localizable class="pure-menu-link"&#xD;                    href="sign_up"&gt;Join&lt;/a&gt;&lt;/li&gt;&#xD;            &lt;li hidden="true" class="sign-in pure-menu-item pure-u-1-12"&gt;&#xD;                &lt;a localizable class="pure-menu-link"&#xD;                               href="login"&gt;Log In&lt;/a&gt;&lt;/li&gt;&#xD;            &lt;li hidden="true" class="pure-menu-item pure-u-1-6&#xD;                pure-menu-has-children pure-menu-allow-hover user-menu"&gt;&#xD;                &lt;a id="menuLink1" class="pure-menu-link visitor clickable"&gt;&lt;/a&gt;&#xD;                &lt;ul class="pure-menu-children"&gt;&#xD;                    &lt;li class="pure-menu-item"&gt;&#xD;                        &lt;a localizable class="pure-menu-link my-projects"&#xD;                            href="my_projects"&gt;My Projects&lt;/a&gt;&lt;/li&gt;&#xD;                    &lt;li class="pure-menu-item"&gt;&#xD;                        &lt;a localizable class="pure-menu-link my-collections"&#xD;                            href="my_collections"&gt;My Collections&lt;/a&gt;&lt;/li&gt;&#xD;                    &lt;li class="pure-menu-item"&gt;&#xD;                        &lt;a localizable class="pure-menu-link my-public-projects"&#xD;                           href=""&gt;My Public Page&lt;/a&gt;&lt;/li&gt;&#xD;                    &lt;li class="pure-menu-item"&gt;&#xD;                        &lt;a localizable class="pure-menu-link my-profile"&#xD;                            href="profile"&gt;My Profile&lt;/a&gt;&lt;/li&gt;&#xD;                    &lt;li hidden="true" class="pure-menu-item admin"&gt;&#xD;                        &lt;a localizable class="pure-menu-link"&#xD;                            href="admin"&gt;Administration&lt;/a&gt;&lt;/li&gt;&#xD;                    &lt;hr&gt;&#xD;                    &lt;li class="pure-menu-item"&gt;&#xD;                        &lt;a localizable class="pure-menu-link clickable"&#xD;                            href="javascript:SnapCloud.logout(function () {&#xD;                                sessionStorage.clear();&#xD;                                location.href = &apos;index&apos;;&#xD;                            });"&gt;Log Out&lt;/a&gt;&lt;/li&gt;&#xD;                &lt;/ul&gt;&#xD;            &lt;/li&gt;&#xD;            &lt;li class="pure-menu-item pure-u-1-24 pure-menu-has-children&#xD;                pure-menu-allow-hover language-select"&gt;&#xD;                &lt;a class="pure-menu-link clickable"&gt;&#xD;                    &lt;i class="fas fa-globe"&gt;&lt;/i&gt;&#xD;                &lt;/a&gt;&#xD;                &lt;ul class="pure-menu-children languages"&gt;&#xD;                    &lt;a class="pure-menu-link clickable"&#xD;                        onclick="localizer.setLanguage(&apos;es&apos;);"&gt;Castellano&lt;/a&gt;&#xD;                    &lt;a class="pure-menu-link clickable"&#xD;                        onclick="localizer.setLanguage(&apos;ca&apos;);"&gt;Català&lt;/a&gt;&#xD;                    &lt;a class="pure-menu-link clickable"&#xD;                        onclick="localizer.setLanguage(&apos;zh&apos;);"&gt;简体中文&lt;/a&gt;&#xD;                    &lt;a class="pure-menu-link clickable"&#xD;                        onclick="localizer.setLanguage(&apos;de&apos;);"&gt;Deutsch&lt;/a&gt;&#xD;                    &lt;a class="pure-menu-link clickable"&#xD;                        onclick="localizer.setLanguage(&apos;en&apos;);"&gt;English&lt;/a&gt;&#xD;                    &lt;a class="pure-menu-link clickable"&#xD;                        onclick="localizer.setLanguage(&apos;it&apos;);"&gt;Italiano&lt;/a&gt;&#xD;                    &lt;a class="pure-menu-link clickable"&#xD;                        onclick="localizer.setLanguage(&apos;pt&apos;);"&gt;Português&lt;/a&gt;&#xD;                    &lt;a class="pure-menu-link clickable"&#xD;                        onclick="localizer.setLanguage(&apos;tr&apos;);"&gt;Türkçe&lt;/a&gt;&#xD;                &lt;/ul&gt;&#xD;            &lt;/li&gt;&#xD;        &lt;/ul&gt;&#xD;    &lt;/div&gt;&#xD;&lt;/nav&gt;&#xD;        &lt;div id="wrapper"&gt;&#xD;&lt;script src="js/project.js"&gt;&lt;/script&gt;&#xD;&lt;link rel="stylesheet" href="style/project.css"&gt;&#xD;&#xD;&lt;!-- Thanks to www.w3schools.com --&gt;&#xD;&lt;link rel="stylesheet" href="style/banner.css"&gt;&#xD;&#xD;&lt;div class="slideshow"&gt;&#xD;    &lt;a href="collection?user=snapcloud&amp;collection=Love" target="_blank"&gt;&#xD;        &lt;div class="slide fade"&gt;&#xD;            &lt;img src="img/totm.png" style="width:100%"&gt;&#xD;        &lt;/div&gt;&#xD;    &lt;/a&gt;&#xD;&#xD;    &lt;div class="slide fade"&gt;&#xD;        &lt;img src="img/snap-byob.png" style="width:100%"&gt;&#xD;    &lt;/div&gt;&#xD;&#xD;    &lt;div class="slide fade"&gt;&#xD;        &lt;img src="img/lowfloor.png" style="width:100%"&gt;&#xD;    &lt;/div&gt;&#xD;&#xD;    &lt;div class="slide fade"&gt;&#xD;        &lt;img src="img/widewalls.png" style="width:100%"&gt;&#xD;    &lt;/div&gt;&#xD;&#xD;    &lt;div class="slide fade"&gt;&#xD;        &lt;img src="img/noceiling.png" style="width:100%"&gt;&#xD;    &lt;/div&gt;&#xD;&#xD;    &lt;a class="previous" onclick="plusSlides(-1)"&gt;&amp;#10094;&lt;/a&gt;&#xD;    &lt;a class="next" onclick="plusSlides(1)"&gt;&amp;#10095;&lt;/a&gt;&#xD;&lt;/div&gt;&#xD;&lt;br&gt;&#xD;&#xD;&lt;script&gt;&#xD;    var slideIndex = 1;&#xD;&#xD;    showSlide(slideIndex);&#xD;&#xD;    function plusSlides (n) {&#xD;        showSlide(slideIndex += n);&#xD;    };&#xD;&#xD;    function currentSlide (n) {&#xD;        showSlide(slideIndex = n);&#xD;    };&#xD;&#xD;    function showSlide (n) {&#xD;        var slides = document.querySelectorAll(&apos;.slide&apos;),&#xD;            i;&#xD;        if (n &gt; slides.length) { slideIndex = 1 }&#xD;        if (n &lt; 1) { slideIndex = slides.length }&#xD;        slides.forEach(function (slide) {&#xD;            slide.style.display = &apos;none&apos;;&#xD;        });&#xD;        slides[slideIndex-1].style.display = &apos;block&apos;;&#xD;    };&#xD;&#xD;&lt;/script&gt;&#xD;&#xD;&lt;h1&gt;&lt;span localizable&gt;Welcome to Snap&lt;/span&gt;&lt;em&gt;!&lt;/em&gt;&lt;/h1&gt;&#xD;&#xD;&lt;div class="indent bigger" localizable&gt;Snap&lt;em&gt;!&lt;/em&gt; is a broadly inviting programming language for kids and adults that&apos;s also a platform for serious study of computer science.&lt;/div&gt;&#xD;&#xD;&lt;div class="indent v-spaced"&gt;&#xD;    &lt;a href="/snap" class="pure-button" localizable&gt;Run Snap&lt;em&gt;!&lt;/em&gt; Now&lt;/a&gt;&#xD;    &lt;a href="/examples" class="pure-button" localizable&gt;Example Projects&lt;/a&gt;&#xD;    &lt;a href="/snap/help/SnapManual.pdf" class="pure-button" localizable&gt;Reference Manual&lt;/a&gt;&#xD;&lt;/div&gt;&#xD;&#xD;&lt;br class="v-spaced"&gt;&#xD;&#xD;&#xD;&lt;!--&#xD;    Any template that uses me needs to specify the following functions:&#xD;&#xD;    // Defines how to retrieve a particular page from the DB&#xD;    latest_loadPage (&#xD;        query,      // search query&#xD;        pageSize,   // amount of elements per page&#xD;        pageNumber, // current page being requested&#xD;        onSuccess   // callback called when response comes back. Just leave as&#xD;                    // `onSuccess` unless doing something very specific, as&#xD;                    // this callback is defined by the search bar itself.&#xD;    )&#xD;&#xD;    // Defines how to load a particular page&#xD;    latest_onLoadPage (&#xD;        response,      // response from the server&#xD;        targetElement  // HTML element where response should be rendered&#xD;    )&#xD;&#xD;    Once these functions have been defined, just call:&#xD;&#xD;    latest_initGrid(callback);&#xD;--&gt;&#xD;&lt;div class="latest container"&gt;&#xD;    &lt;h2 class="latest header" localizable&gt;&lt;/h2&gt;&#xD;    &lt;div class="bar"&gt;&#xD;        &lt;div hidden class="latest search"&gt;&#xD;            &lt;form action="latest"&gt;&#xD;                &lt;input type="text" name="query"&gt;&#xD;                &lt;i class="fas fa-search"&gt;&lt;/i&gt;&#xD;            &lt;/form&gt;&#xD;            &lt;script&gt;&#xD;                var latest_page = 1,&#xD;                    latest_totalPages = 1,&#xD;                    latest_maxPages = [20][0] || 0, // 0 = no limit&#xD;                    latest_pageSize = [5][0] || 150,&#xD;                    latest_keepIfEmpty = [][0];&#xD;&#xD;                if (![&apos;Latest Projects&apos;][0]) {&#xD;                    document.querySelector(&apos;.latest.header&apos;).remove();&#xD;                } else {&#xD;                    document.querySelector(&apos;.latest.header&apos;).innerHTML =&#xD;                        [&apos;Latest Projects&apos;][0];&#xD;                }&#xD;&#xD;                if ([false][0]) {&#xD;                    document.querySelector(".latest.search").hidden =&#xD;                        false;&#xD;                };&#xD;&#xD;                document.querySelector(&apos;.latest form input&apos;).value =&#xD;                    getUrlParameter(&apos;query&apos;);&#xD;&#xD;                function latest_toPage (pageNumber) {&#xD;                    var latest_div =&#xD;                            document.querySelector(&apos;.latest.container&apos;),&#xD;                        latest_listDiv =&#xD;                            document.querySelector(&apos;.latest.list&apos;),&#xD;                        latest_pageSpan =&#xD;                            document.querySelector(&#xD;                                &apos;.latest.paginator .page&apos;),&#xD;                        latest_totalPagesSpan =&#xD;                            document.querySelector(&#xD;                                &apos;.latest.paginator .total-pages&apos;),&#xD;                        height = latest_listDiv.clientHeight;&#xD;&#xD;                    // Forces grid to keep previous height when emptied out&#xD;                    if (height &gt; 0) {&#xD;                        latest_listDiv.style.height = height;&#xD;                    }&#xD;&#xD;                    latest_listDiv.innerHTML = &apos;&apos;;&#xD;                    beganLoading(&apos;.latest.list&apos;);&#xD;&#xD;                    latest_loadPage(&#xD;                        getUrlParameter(&apos;query&apos;),&#xD;                        latest_pageSize,&#xD;                        pageNumber,&#xD;                        function (response) {&#xD;                            latest_totalPages =&#xD;                                latest_maxPages || response.pages;&#xD;                            latest_totalPagesSpan.textContent =&#xD;                                latest_totalPages;&#xD;&#xD;                            if (latest_totalPages == 0 ||&#xD;                                (response.projects &amp;&amp; !response.projects[0]) ||&#xD;                                (response.collections &amp;&amp;&#xD;                                    !response.collections[0]) ||&#xD;                                (response.users &amp;&amp; !response.users[0])&#xD;                                // Until we fix the API this will do&#xD;                            ) {&#xD;                                if (!latest_keepIfEmpty) {&#xD;                                    latest_div.remove();&#xD;                                } else {&#xD;                                    doneLoading(&apos;.latest.list&apos;);&#xD;                                }&#xD;                                return;&#xD;                            } else if (latest_totalPages == 1 &amp;&amp;&#xD;                                    !latest_keepIfEmpty) {&#xD;                                document.querySelector(&#xD;                                    &apos;.latest.paginator&apos;).remove();&#xD;                            }&#xD;&#xD;                            latest_onLoadPage(response,&#xD;                                latest_listDiv);&#xD;&#xD;                            doneLoading(&apos;.latest.list&apos;);&#xD;                        }&#xD;                    );&#xD;&#xD;                    latest_page = pageNumber;&#xD;                    latest_pageSpan.textContent = pageNumber;&#xD;                };&#xD;&#xD;                function latest_initGrid (callback) {&#xD;                    latest_toPage(1);&#xD;                    if (callback) {&#xD;                        callback.call(this);&#xD;                    }&#xD;                };&#xD;&#xD;            &lt;/script&gt;&#xD;        &lt;/div&gt;&#xD;&lt;nav class="latest paginator"&gt;&#xD;    &lt;a class="clickable" onclick="latest_toPage(1);"&gt;&lt;i class="fas fa-caret-left"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="latest_toPage(latest_page - 5 &gt; 0 ? latest_page - 5 : 1);"&gt;&lt;i class="fas fa-angle-double-left"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="latest_toPage(latest_page - 1 &gt; 0 ? latest_page - 1 : latest_page);"&gt;&lt;i class="fas fa-angle-left"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;span class="page"&gt;&lt;/span&gt; / &lt;span class="total-pages"&gt;&lt;/span&gt;&#xD;    &lt;a class="clickable" onclick="latest_toPage(latest_page + 1 &lt; latest_totalPages ? latest_page + 1 : latest_totalPages);"&gt;&lt;i class="fas fa-angle-right"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="latest_toPage(latest_page + 5 &lt; latest_totalPages ? latest_page + 5 : latest_totalPages);"&gt;&lt;i class="fas fa-angle-double-right"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="latest_toPage(latest_totalPages);"&gt;&lt;i class="fas fa-caret-right"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;&lt;/nav&gt;&#xD;    &lt;/div&gt;&#xD;    &lt;div class="latest list pure-g"&gt;&lt;/div&gt;&#xD;&lt;/div&gt;&#xD;&lt;script&gt;&#xD;    latest_loadPage =&#xD;        function (query, pageSize, pageNumber, onSuccess) {&#xD;            SnapCloud.getPublishedProjectList(&#xD;                null, // no username&#xD;                pageNumber,&#xD;                pageSize,&#xD;                query,&#xD;                onSuccess,&#xD;                genericError,&#xD;                true // withThumbnail&#xD;            );&#xD;        };&#xD;&#xD;    latest_onLoadPage =&#xD;        function (response, targetElement) {&#xD;            response.projects.forEach(function (project) {&#xD;                targetElement.append(&#xD;                    newProjectDiv(&#xD;                        project,&#xD;                        {&#xD;                            size: &apos;small&apos;,&#xD;                            gridSize: 5,&#xD;                            extraFields: {&#xD;                                isPublic: &apos;ispublic&apos;,&#xD;                                isPublished: &apos;ispublished&apos;,&#xD;                                author: &apos;username&apos;&#xD;                            }&#xD;                        }&#xD;                    )&#xD;                );&#xD;            });&#xD;        };&#xD;&#xD;    latest_initGrid();&#xD;&lt;/script&gt;&#xD;&#xD;&lt;!--&#xD;    Any template that uses me needs to specify the following functions:&#xD;&#xD;    // Defines how to retrieve a particular page from the DB&#xD;    totm_loadPage (&#xD;        query,      // search query&#xD;        pageSize,   // amount of elements per page&#xD;        pageNumber, // current page being requested&#xD;        onSuccess   // callback called when response comes back. Just leave as&#xD;                    // `onSuccess` unless doing something very specific, as&#xD;                    // this callback is defined by the search bar itself.&#xD;    )&#xD;&#xD;    // Defines how to load a particular page&#xD;    totm_onLoadPage (&#xD;        response,      // response from the server&#xD;        targetElement  // HTML element where response should be rendered&#xD;    )&#xD;&#xD;    Once these functions have been defined, just call:&#xD;&#xD;    totm_initGrid(callback);&#xD;--&gt;&#xD;&lt;div class="totm container"&gt;&#xD;    &lt;h2 class="totm header" localizable&gt;&lt;/h2&gt;&#xD;    &lt;div class="bar"&gt;&#xD;        &lt;div hidden class="totm search"&gt;&#xD;            &lt;form action="totm"&gt;&#xD;                &lt;input type="text" name="query"&gt;&#xD;                &lt;i class="fas fa-search"&gt;&lt;/i&gt;&#xD;            &lt;/form&gt;&#xD;            &lt;script&gt;&#xD;                var totm_page = 1,&#xD;                    totm_totalPages = 1,&#xD;                    totm_maxPages = [0][0] || 0, // 0 = no limit&#xD;                    totm_pageSize = [5][0] || 150,&#xD;                    totm_keepIfEmpty = [][0];&#xD;&#xD;                if (![&apos;Topic of the Month: Love&apos;][0]) {&#xD;                    document.querySelector(&apos;.totm.header&apos;).remove();&#xD;                } else {&#xD;                    document.querySelector(&apos;.totm.header&apos;).innerHTML =&#xD;                        [&apos;Topic of the Month: Love&apos;][0];&#xD;                }&#xD;&#xD;                if ([false][0]) {&#xD;                    document.querySelector(".totm.search").hidden =&#xD;                        false;&#xD;                };&#xD;&#xD;                document.querySelector(&apos;.totm form input&apos;).value =&#xD;                    getUrlParameter(&apos;query&apos;);&#xD;&#xD;                function totm_toPage (pageNumber) {&#xD;                    var totm_div =&#xD;                            document.querySelector(&apos;.totm.container&apos;),&#xD;                        totm_listDiv =&#xD;                            document.querySelector(&apos;.totm.list&apos;),&#xD;                        totm_pageSpan =&#xD;                            document.querySelector(&#xD;                                &apos;.totm.paginator .page&apos;),&#xD;                        totm_totalPagesSpan =&#xD;                            document.querySelector(&#xD;                                &apos;.totm.paginator .total-pages&apos;),&#xD;                        height = totm_listDiv.clientHeight;&#xD;&#xD;                    // Forces grid to keep previous height when emptied out&#xD;                    if (height &gt; 0) {&#xD;                        totm_listDiv.style.height = height;&#xD;                    }&#xD;&#xD;                    totm_listDiv.innerHTML = &apos;&apos;;&#xD;                    beganLoading(&apos;.totm.list&apos;);&#xD;&#xD;                    totm_loadPage(&#xD;                        getUrlParameter(&apos;query&apos;),&#xD;                        totm_pageSize,&#xD;                        pageNumber,&#xD;                        function (response) {&#xD;                            totm_totalPages =&#xD;                                totm_maxPages || response.pages;&#xD;                            totm_totalPagesSpan.textContent =&#xD;                                totm_totalPages;&#xD;&#xD;                            if (totm_totalPages == 0 ||&#xD;                                (response.projects &amp;&amp; !response.projects[0]) ||&#xD;                                (response.collections &amp;&amp;&#xD;                                    !response.collections[0]) ||&#xD;                                (response.users &amp;&amp; !response.users[0])&#xD;                                // Until we fix the API this will do&#xD;                            ) {&#xD;                                if (!totm_keepIfEmpty) {&#xD;                                    totm_div.remove();&#xD;                                } else {&#xD;                                    doneLoading(&apos;.totm.list&apos;);&#xD;                                }&#xD;                                return;&#xD;                            } else if (totm_totalPages == 1 &amp;&amp;&#xD;                                    !totm_keepIfEmpty) {&#xD;                                document.querySelector(&#xD;                                    &apos;.totm.paginator&apos;).remove();&#xD;                            }&#xD;&#xD;                            totm_onLoadPage(response,&#xD;                                totm_listDiv);&#xD;&#xD;                            doneLoading(&apos;.totm.list&apos;);&#xD;                        }&#xD;                    );&#xD;&#xD;                    totm_page = pageNumber;&#xD;                    totm_pageSpan.textContent = pageNumber;&#xD;                };&#xD;&#xD;                function totm_initGrid (callback) {&#xD;                    totm_toPage(1);&#xD;                    if (callback) {&#xD;                        callback.call(this);&#xD;                    }&#xD;                };&#xD;&#xD;            &lt;/script&gt;&#xD;        &lt;/div&gt;&#xD;&lt;nav class="totm paginator"&gt;&#xD;    &lt;a class="clickable" onclick="totm_toPage(1);"&gt;&lt;i class="fas fa-caret-left"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="totm_toPage(totm_page - 5 &gt; 0 ? totm_page - 5 : 1);"&gt;&lt;i class="fas fa-angle-double-left"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="totm_toPage(totm_page - 1 &gt; 0 ? totm_page - 1 : totm_page);"&gt;&lt;i class="fas fa-angle-left"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;span class="page"&gt;&lt;/span&gt; / &lt;span class="total-pages"&gt;&lt;/span&gt;&#xD;    &lt;a class="clickable" onclick="totm_toPage(totm_page + 1 &lt; totm_totalPages ? totm_page + 1 : totm_totalPages);"&gt;&lt;i class="fas fa-angle-right"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="totm_toPage(totm_page + 5 &lt; totm_totalPages ? totm_page + 5 : totm_totalPages);"&gt;&lt;i class="fas fa-angle-double-right"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="totm_toPage(totm_totalPages);"&gt;&lt;i class="fas fa-caret-right"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;&lt;/nav&gt;&#xD;    &lt;/div&gt;&#xD;    &lt;div class="totm list pure-g"&gt;&lt;/div&gt;&#xD;&lt;/div&gt;&#xD;&lt;script&gt;&#xD;    totm_loadPage =&#xD;        function (query, pageSize, pageNumber, onSuccess) {&#xD;            SnapCloud.getCollectionProjects(&#xD;                &apos;snapcloud&apos;,&#xD;                pageNumber,&#xD;                pageSize,&#xD;                &apos;Love&apos;,&#xD;                onSuccess,&#xD;                genericError,&#xD;                true // withThumbnail&#xD;            );&#xD;        };&#xD;&#xD;    totm_onLoadPage = latest_onLoadPage;&#xD;    totm_initGrid();&#xD;&lt;/script&gt;&#xD;&#xD;&lt;!--&#xD;    Any template that uses me needs to specify the following functions:&#xD;&#xD;    // Defines how to retrieve a particular page from the DB&#xD;    featured_loadPage (&#xD;        query,      // search query&#xD;        pageSize,   // amount of elements per page&#xD;        pageNumber, // current page being requested&#xD;        onSuccess   // callback called when response comes back. Just leave as&#xD;                    // `onSuccess` unless doing something very specific, as&#xD;                    // this callback is defined by the search bar itself.&#xD;    )&#xD;&#xD;    // Defines how to load a particular page&#xD;    featured_onLoadPage (&#xD;        response,      // response from the server&#xD;        targetElement  // HTML element where response should be rendered&#xD;    )&#xD;&#xD;    Once these functions have been defined, just call:&#xD;&#xD;    featured_initGrid(callback);&#xD;--&gt;&#xD;&lt;div class="featured container"&gt;&#xD;    &lt;h2 class="featured header" localizable&gt;&lt;/h2&gt;&#xD;    &lt;div class="bar"&gt;&#xD;        &lt;div hidden class="featured search"&gt;&#xD;            &lt;form action="featured"&gt;&#xD;                &lt;input type="text" name="query"&gt;&#xD;                &lt;i class="fas fa-search"&gt;&lt;/i&gt;&#xD;            &lt;/form&gt;&#xD;            &lt;script&gt;&#xD;                var featured_page = 1,&#xD;                    featured_totalPages = 1,&#xD;                    featured_maxPages = [0][0] || 0, // 0 = no limit&#xD;                    featured_pageSize = [5][0] || 150,&#xD;                    featured_keepIfEmpty = [][0];&#xD;&#xD;                if (![&apos;Featured Projects&apos;][0]) {&#xD;                    document.querySelector(&apos;.featured.header&apos;).remove();&#xD;                } else {&#xD;                    document.querySelector(&apos;.featured.header&apos;).innerHTML =&#xD;                        [&apos;Featured Projects&apos;][0];&#xD;                }&#xD;&#xD;                if ([false][0]) {&#xD;                    document.querySelector(".featured.search").hidden =&#xD;                        false;&#xD;                };&#xD;&#xD;                document.querySelector(&apos;.featured form input&apos;).value =&#xD;                    getUrlParameter(&apos;query&apos;);&#xD;&#xD;                function featured_toPage (pageNumber) {&#xD;                    var featured_div =&#xD;                            document.querySelector(&apos;.featured.container&apos;),&#xD;                        featured_listDiv =&#xD;                            document.querySelector(&apos;.featured.list&apos;),&#xD;                        featured_pageSpan =&#xD;                            document.querySelector(&#xD;                                &apos;.featured.paginator .page&apos;),&#xD;                        featured_totalPagesSpan =&#xD;                            document.querySelector(&#xD;                                &apos;.featured.paginator .total-pages&apos;),&#xD;                        height = featured_listDiv.clientHeight;&#xD;&#xD;                    // Forces grid to keep previous height when emptied out&#xD;                    if (height &gt; 0) {&#xD;                        featured_listDiv.style.height = height;&#xD;                    }&#xD;&#xD;                    featured_listDiv.innerHTML = &apos;&apos;;&#xD;                    beganLoading(&apos;.featured.list&apos;);&#xD;&#xD;                    featured_loadPage(&#xD;                        getUrlParameter(&apos;query&apos;),&#xD;                        featured_pageSize,&#xD;                        pageNumber,&#xD;                        function (response) {&#xD;                            featured_totalPages =&#xD;                                featured_maxPages || response.pages;&#xD;                            featured_totalPagesSpan.textContent =&#xD;                                featured_totalPages;&#xD;&#xD;                            if (featured_totalPages == 0 ||&#xD;                                (response.projects &amp;&amp; !response.projects[0]) ||&#xD;                                (response.collections &amp;&amp;&#xD;                                    !response.collections[0]) ||&#xD;                                (response.users &amp;&amp; !response.users[0])&#xD;                                // Until we fix the API this will do&#xD;                            ) {&#xD;                                if (!featured_keepIfEmpty) {&#xD;                                    featured_div.remove();&#xD;                                } else {&#xD;                                    doneLoading(&apos;.featured.list&apos;);&#xD;                                }&#xD;                                return;&#xD;                            } else if (featured_totalPages == 1 &amp;&amp;&#xD;                                    !featured_keepIfEmpty) {&#xD;                                document.querySelector(&#xD;                                    &apos;.featured.paginator&apos;).remove();&#xD;                            }&#xD;&#xD;                            featured_onLoadPage(response,&#xD;                                featured_listDiv);&#xD;&#xD;                            doneLoading(&apos;.featured.list&apos;);&#xD;                        }&#xD;                    );&#xD;&#xD;                    featured_page = pageNumber;&#xD;                    featured_pageSpan.textContent = pageNumber;&#xD;                };&#xD;&#xD;                function featured_initGrid (callback) {&#xD;                    featured_toPage(1);&#xD;                    if (callback) {&#xD;                        callback.call(this);&#xD;                    }&#xD;                };&#xD;&#xD;            &lt;/script&gt;&#xD;        &lt;/div&gt;&#xD;&lt;nav class="featured paginator"&gt;&#xD;    &lt;a class="clickable" onclick="featured_toPage(1);"&gt;&lt;i class="fas fa-caret-left"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="featured_toPage(featured_page - 5 &gt; 0 ? featured_page - 5 : 1);"&gt;&lt;i class="fas fa-angle-double-left"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="featured_toPage(featured_page - 1 &gt; 0 ? featured_page - 1 : featured_page);"&gt;&lt;i class="fas fa-angle-left"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;span class="page"&gt;&lt;/span&gt; / &lt;span class="total-pages"&gt;&lt;/span&gt;&#xD;    &lt;a class="clickable" onclick="featured_toPage(featured_page + 1 &lt; featured_totalPages ? featured_page + 1 : featured_totalPages);"&gt;&lt;i class="fas fa-angle-right"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="featured_toPage(featured_page + 5 &lt; featured_totalPages ? featured_page + 5 : featured_totalPages);"&gt;&lt;i class="fas fa-angle-double-right"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="featured_toPage(featured_totalPages);"&gt;&lt;i class="fas fa-caret-right"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;&lt;/nav&gt;&#xD;    &lt;/div&gt;&#xD;    &lt;div class="featured list pure-g"&gt;&lt;/div&gt;&#xD;&lt;/div&gt;&#xD;&lt;script&gt;&#xD;    featured_loadPage =&#xD;        function (query, pageSize, pageNumber, onSuccess) {&#xD;            SnapCloud.getCollectionProjects(&#xD;                &apos;snapcloud&apos;,&#xD;                pageNumber,&#xD;                pageSize,&#xD;                &apos;Featured&apos;,&#xD;                onSuccess,&#xD;                genericError,&#xD;                true // withThumbnail&#xD;            );&#xD;        };&#xD;&#xD;    featured_onLoadPage = latest_onLoadPage;&#xD;    featured_initGrid();&#xD;&lt;/script&gt;&#xD;&#xD;&lt;!--&#xD;    Any template that uses me needs to specify the following functions:&#xD;&#xD;    // Defines how to retrieve a particular page from the DB&#xD;    snapshot_loadPage (&#xD;        query,      // search query&#xD;        pageSize,   // amount of elements per page&#xD;        pageNumber, // current page being requested&#xD;        onSuccess   // callback called when response comes back. Just leave as&#xD;                    // `onSuccess` unless doing something very specific, as&#xD;                    // this callback is defined by the search bar itself.&#xD;    )&#xD;&#xD;    // Defines how to load a particular page&#xD;    snapshot_onLoadPage (&#xD;        response,      // response from the server&#xD;        targetElement  // HTML element where response should be rendered&#xD;    )&#xD;&#xD;    Once these functions have been defined, just call:&#xD;&#xD;    snapshot_initGrid(callback);&#xD;--&gt;&#xD;&lt;div class="snapshot container"&gt;&#xD;    &lt;h2 class="snapshot header" localizable&gt;&lt;/h2&gt;&#xD;    &lt;div class="bar"&gt;&#xD;        &lt;div hidden class="snapshot search"&gt;&#xD;            &lt;form action="snapshot"&gt;&#xD;                &lt;input type="text" name="query"&gt;&#xD;                &lt;i class="fas fa-search"&gt;&lt;/i&gt;&#xD;            &lt;/form&gt;&#xD;            &lt;script&gt;&#xD;                var snapshot_page = 1,&#xD;                    snapshot_totalPages = 1,&#xD;                    snapshot_maxPages = [0][0] || 0, // 0 = no limit&#xD;                    snapshot_pageSize = [5][0] || 150,&#xD;                    snapshot_keepIfEmpty = [][0];&#xD;&#xD;                if (![&apos;Snap!Shot 2020&apos;][0]) {&#xD;                    document.querySelector(&apos;.snapshot.header&apos;).remove();&#xD;                } else {&#xD;                    document.querySelector(&apos;.snapshot.header&apos;).innerHTML =&#xD;                        [&apos;Snap!Shot 2020&apos;][0];&#xD;                }&#xD;&#xD;                if ([false][0]) {&#xD;                    document.querySelector(".snapshot.search").hidden =&#xD;                        false;&#xD;                };&#xD;&#xD;                document.querySelector(&apos;.snapshot form input&apos;).value =&#xD;                    getUrlParameter(&apos;query&apos;);&#xD;&#xD;                function snapshot_toPage (pageNumber) {&#xD;                    var snapshot_div =&#xD;                            document.querySelector(&apos;.snapshot.container&apos;),&#xD;                        snapshot_listDiv =&#xD;                            document.querySelector(&apos;.snapshot.list&apos;),&#xD;                        snapshot_pageSpan =&#xD;                            document.querySelector(&#xD;                                &apos;.snapshot.paginator .page&apos;),&#xD;                        snapshot_totalPagesSpan =&#xD;                            document.querySelector(&#xD;                                &apos;.snapshot.paginator .total-pages&apos;),&#xD;                        height = snapshot_listDiv.clientHeight;&#xD;&#xD;                    // Forces grid to keep previous height when emptied out&#xD;                    if (height &gt; 0) {&#xD;                        snapshot_listDiv.style.height = height;&#xD;                    }&#xD;&#xD;                    snapshot_listDiv.innerHTML = &apos;&apos;;&#xD;                    beganLoading(&apos;.snapshot.list&apos;);&#xD;&#xD;                    snapshot_loadPage(&#xD;                        getUrlParameter(&apos;query&apos;),&#xD;                        snapshot_pageSize,&#xD;                        pageNumber,&#xD;                        function (response) {&#xD;                            snapshot_totalPages =&#xD;                                snapshot_maxPages || response.pages;&#xD;                            snapshot_totalPagesSpan.textContent =&#xD;                                snapshot_totalPages;&#xD;&#xD;                            if (snapshot_totalPages == 0 ||&#xD;                                (response.projects &amp;&amp; !response.projects[0]) ||&#xD;                                (response.collections &amp;&amp;&#xD;                                    !response.collections[0]) ||&#xD;                                (response.users &amp;&amp; !response.users[0])&#xD;                                // Until we fix the API this will do&#xD;                            ) {&#xD;                                if (!snapshot_keepIfEmpty) {&#xD;                                    snapshot_div.remove();&#xD;                                } else {&#xD;                                    doneLoading(&apos;.snapshot.list&apos;);&#xD;                                }&#xD;                                return;&#xD;                            } else if (snapshot_totalPages == 1 &amp;&amp;&#xD;                                    !snapshot_keepIfEmpty) {&#xD;                                document.querySelector(&#xD;                                    &apos;.snapshot.paginator&apos;).remove();&#xD;                            }&#xD;&#xD;                            snapshot_onLoadPage(response,&#xD;                                snapshot_listDiv);&#xD;&#xD;                            doneLoading(&apos;.snapshot.list&apos;);&#xD;                        }&#xD;                    );&#xD;&#xD;                    snapshot_page = pageNumber;&#xD;                    snapshot_pageSpan.textContent = pageNumber;&#xD;                };&#xD;&#xD;                function snapshot_initGrid (callback) {&#xD;                    snapshot_toPage(1);&#xD;                    if (callback) {&#xD;                        callback.call(this);&#xD;                    }&#xD;                };&#xD;&#xD;            &lt;/script&gt;&#xD;        &lt;/div&gt;&#xD;&lt;nav class="snapshot paginator"&gt;&#xD;    &lt;a class="clickable" onclick="snapshot_toPage(1);"&gt;&lt;i class="fas fa-caret-left"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="snapshot_toPage(snapshot_page - 5 &gt; 0 ? snapshot_page - 5 : 1);"&gt;&lt;i class="fas fa-angle-double-left"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="snapshot_toPage(snapshot_page - 1 &gt; 0 ? snapshot_page - 1 : snapshot_page);"&gt;&lt;i class="fas fa-angle-left"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;span class="page"&gt;&lt;/span&gt; / &lt;span class="total-pages"&gt;&lt;/span&gt;&#xD;    &lt;a class="clickable" onclick="snapshot_toPage(snapshot_page + 1 &lt; snapshot_totalPages ? snapshot_page + 1 : snapshot_totalPages);"&gt;&lt;i class="fas fa-angle-right"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="snapshot_toPage(snapshot_page + 5 &lt; snapshot_totalPages ? snapshot_page + 5 : snapshot_totalPages);"&gt;&lt;i class="fas fa-angle-double-right"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="snapshot_toPage(snapshot_totalPages);"&gt;&lt;i class="fas fa-caret-right"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;&lt;/nav&gt;&#xD;    &lt;/div&gt;&#xD;    &lt;div class="snapshot list pure-g"&gt;&lt;/div&gt;&#xD;&lt;/div&gt;&#xD;&lt;script&gt;&#xD;    snapshot_loadPage =&#xD;        function (query, pageSize, pageNumber, onSuccess) {&#xD;            SnapCloud.getCollectionProjects(&#xD;                &apos;snapcloud&apos;,&#xD;                pageNumber,&#xD;                pageSize,&#xD;                &apos;Snap!Shot 2020&apos;,&#xD;                onSuccess,&#xD;                genericError,&#xD;                true // withThumbnail&#xD;            );&#xD;        };&#xD;&#xD;    snapshot_onLoadPage = latest_onLoadPage;&#xD;    snapshot_initGrid();&#xD;&lt;/script&gt;&#xD;&#xD;&lt;script&gt;&#xD;    // pick three random curated collections&#xD;    var collections =&#xD;        [ &apos;Science Projects&apos;,&#xD;            &apos;Simulations&apos;,&#xD;            &apos;3D&apos;,&#xD;            &apos;Music&apos;,&#xD;            &apos;Art Projects&apos;,&#xD;            &apos;Fractals&apos;,&#xD;            &apos;Animations&apos;,&#xD;            &apos;Games&apos; ];&#xD;&#xD;    for (var i = collections.length - 1; i &gt; 2; i --) {&#xD;        collections.splice(Math.floor(Math.random()*collections.length), 1);&#xD;    }&#xD;&#xD;&lt;/script&gt;&#xD;&lt;!--&#xD;    Any template that uses me needs to specify the following functions:&#xD;&#xD;    // Defines how to retrieve a particular page from the DB&#xD;    curated1_loadPage (&#xD;        query,      // search query&#xD;        pageSize,   // amount of elements per page&#xD;        pageNumber, // current page being requested&#xD;        onSuccess   // callback called when response comes back. Just leave as&#xD;                    // `onSuccess` unless doing something very specific, as&#xD;                    // this callback is defined by the search bar itself.&#xD;    )&#xD;&#xD;    // Defines how to load a particular page&#xD;    curated1_onLoadPage (&#xD;        response,      // response from the server&#xD;        targetElement  // HTML element where response should be rendered&#xD;    )&#xD;&#xD;    Once these functions have been defined, just call:&#xD;&#xD;    curated1_initGrid(callback);&#xD;--&gt;&#xD;&lt;div class="curated1 container"&gt;&#xD;    &lt;h2 class="curated1 header" localizable&gt;&lt;/h2&gt;&#xD;    &lt;div class="bar"&gt;&#xD;        &lt;div hidden class="curated1 search"&gt;&#xD;            &lt;form action="curated1"&gt;&#xD;                &lt;input type="text" name="query"&gt;&#xD;                &lt;i class="fas fa-search"&gt;&lt;/i&gt;&#xD;            &lt;/form&gt;&#xD;            &lt;script&gt;&#xD;                var curated1_page = 1,&#xD;                    curated1_totalPages = 1,&#xD;                    curated1_maxPages = [0][0] || 0, // 0 = no limit&#xD;                    curated1_pageSize = [5][0] || 150,&#xD;                    curated1_keepIfEmpty = [][0];&#xD;&#xD;                if (![collections[0]][0]) {&#xD;                    document.querySelector(&apos;.curated1.header&apos;).remove();&#xD;                } else {&#xD;                    document.querySelector(&apos;.curated1.header&apos;).innerHTML =&#xD;                        [collections[0]][0];&#xD;                }&#xD;&#xD;                if ([false][0]) {&#xD;                    document.querySelector(".curated1.search").hidden =&#xD;                        false;&#xD;                };&#xD;&#xD;                document.querySelector(&apos;.curated1 form input&apos;).value =&#xD;                    getUrlParameter(&apos;query&apos;);&#xD;&#xD;                function curated1_toPage (pageNumber) {&#xD;                    var curated1_div =&#xD;                            document.querySelector(&apos;.curated1.container&apos;),&#xD;                        curated1_listDiv =&#xD;                            document.querySelector(&apos;.curated1.list&apos;),&#xD;                        curated1_pageSpan =&#xD;                            document.querySelector(&#xD;                                &apos;.curated1.paginator .page&apos;),&#xD;                        curated1_totalPagesSpan =&#xD;                            document.querySelector(&#xD;                                &apos;.curated1.paginator .total-pages&apos;),&#xD;                        height = curated1_listDiv.clientHeight;&#xD;&#xD;                    // Forces grid to keep previous height when emptied out&#xD;                    if (height &gt; 0) {&#xD;                        curated1_listDiv.style.height = height;&#xD;                    }&#xD;&#xD;                    curated1_listDiv.innerHTML = &apos;&apos;;&#xD;                    beganLoading(&apos;.curated1.list&apos;);&#xD;&#xD;                    curated1_loadPage(&#xD;                        getUrlParameter(&apos;query&apos;),&#xD;                        curated1_pageSize,&#xD;                        pageNumber,&#xD;                        function (response) {&#xD;                            curated1_totalPages =&#xD;                                curated1_maxPages || response.pages;&#xD;                            curated1_totalPagesSpan.textContent =&#xD;                                curated1_totalPages;&#xD;&#xD;                            if (curated1_totalPages == 0 ||&#xD;                                (response.projects &amp;&amp; !response.projects[0]) ||&#xD;                                (response.collections &amp;&amp;&#xD;                                    !response.collections[0]) ||&#xD;                                (response.users &amp;&amp; !response.users[0])&#xD;                                // Until we fix the API this will do&#xD;                            ) {&#xD;                                if (!curated1_keepIfEmpty) {&#xD;                                    curated1_div.remove();&#xD;                                } else {&#xD;                                    doneLoading(&apos;.curated1.list&apos;);&#xD;                                }&#xD;                                return;&#xD;                            } else if (curated1_totalPages == 1 &amp;&amp;&#xD;                                    !curated1_keepIfEmpty) {&#xD;                                document.querySelector(&#xD;                                    &apos;.curated1.paginator&apos;).remove();&#xD;                            }&#xD;&#xD;                            curated1_onLoadPage(response,&#xD;                                curated1_listDiv);&#xD;&#xD;                            doneLoading(&apos;.curated1.list&apos;);&#xD;                        }&#xD;                    );&#xD;&#xD;                    curated1_page = pageNumber;&#xD;                    curated1_pageSpan.textContent = pageNumber;&#xD;                };&#xD;&#xD;                function curated1_initGrid (callback) {&#xD;                    curated1_toPage(1);&#xD;                    if (callback) {&#xD;                        callback.call(this);&#xD;                    }&#xD;                };&#xD;&#xD;            &lt;/script&gt;&#xD;        &lt;/div&gt;&#xD;&lt;nav class="curated1 paginator"&gt;&#xD;    &lt;a class="clickable" onclick="curated1_toPage(1);"&gt;&lt;i class="fas fa-caret-left"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="curated1_toPage(curated1_page - 5 &gt; 0 ? curated1_page - 5 : 1);"&gt;&lt;i class="fas fa-angle-double-left"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="curated1_toPage(curated1_page - 1 &gt; 0 ? curated1_page - 1 : curated1_page);"&gt;&lt;i class="fas fa-angle-left"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;span class="page"&gt;&lt;/span&gt; / &lt;span class="total-pages"&gt;&lt;/span&gt;&#xD;    &lt;a class="clickable" onclick="curated1_toPage(curated1_page + 1 &lt; curated1_totalPages ? curated1_page + 1 : curated1_totalPages);"&gt;&lt;i class="fas fa-angle-right"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="curated1_toPage(curated1_page + 5 &lt; curated1_totalPages ? curated1_page + 5 : curated1_totalPages);"&gt;&lt;i class="fas fa-angle-double-right"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="curated1_toPage(curated1_totalPages);"&gt;&lt;i class="fas fa-caret-right"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;&lt;/nav&gt;&#xD;    &lt;/div&gt;&#xD;    &lt;div class="curated1 list pure-g"&gt;&lt;/div&gt;&#xD;&lt;/div&gt;&#xD;&lt;script&gt;&#xD;    curated1_loadPage =&#xD;        function (query, pageSize, pageNumber, onSuccess) {&#xD;            SnapCloud.getCollectionProjects(&#xD;                &apos;snapcloud&apos;,&#xD;                pageNumber,&#xD;                pageSize,&#xD;                collections[0],&#xD;                onSuccess,&#xD;                genericError,&#xD;                true // withThumbnail&#xD;            );&#xD;        };&#xD;&#xD;    curated1_onLoadPage = latest_onLoadPage;&#xD;    curated1_initGrid();&#xD;&lt;/script&gt;&#xD;&#xD;&lt;/script&gt;&#xD;&lt;!--&#xD;    Any template that uses me needs to specify the following functions:&#xD;&#xD;    // Defines how to retrieve a particular page from the DB&#xD;    curated2_loadPage (&#xD;        query,      // search query&#xD;        pageSize,   // amount of elements per page&#xD;        pageNumber, // current page being requested&#xD;        onSuccess   // callback called when response comes back. Just leave as&#xD;                    // `onSuccess` unless doing something very specific, as&#xD;                    // this callback is defined by the search bar itself.&#xD;    )&#xD;&#xD;    // Defines how to load a particular page&#xD;    curated2_onLoadPage (&#xD;        response,      // response from the server&#xD;        targetElement  // HTML element where response should be rendered&#xD;    )&#xD;&#xD;    Once these functions have been defined, just call:&#xD;&#xD;    curated2_initGrid(callback);&#xD;--&gt;&#xD;&lt;div class="curated2 container"&gt;&#xD;    &lt;h2 class="curated2 header" localizable&gt;&lt;/h2&gt;&#xD;    &lt;div class="bar"&gt;&#xD;        &lt;div hidden class="curated2 search"&gt;&#xD;            &lt;form action="curated2"&gt;&#xD;                &lt;input type="text" name="query"&gt;&#xD;                &lt;i class="fas fa-search"&gt;&lt;/i&gt;&#xD;            &lt;/form&gt;&#xD;            &lt;script&gt;&#xD;                var curated2_page = 1,&#xD;                    curated2_totalPages = 1,&#xD;                    curated2_maxPages = [0][0] || 0, // 0 = no limit&#xD;                    curated2_pageSize = [5][0] || 150,&#xD;                    curated2_keepIfEmpty = [][0];&#xD;&#xD;                if (![collections[1]][0]) {&#xD;                    document.querySelector(&apos;.curated2.header&apos;).remove();&#xD;                } else {&#xD;                    document.querySelector(&apos;.curated2.header&apos;).innerHTML =&#xD;                        [collections[1]][0];&#xD;                }&#xD;&#xD;                if ([false][0]) {&#xD;                    document.querySelector(".curated2.search").hidden =&#xD;                        false;&#xD;                };&#xD;&#xD;                document.querySelector(&apos;.curated2 form input&apos;).value =&#xD;                    getUrlParameter(&apos;query&apos;);&#xD;&#xD;                function curated2_toPage (pageNumber) {&#xD;                    var curated2_div =&#xD;                            document.querySelector(&apos;.curated2.container&apos;),&#xD;                        curated2_listDiv =&#xD;                            document.querySelector(&apos;.curated2.list&apos;),&#xD;                        curated2_pageSpan =&#xD;                            document.querySelector(&#xD;                                &apos;.curated2.paginator .page&apos;),&#xD;                        curated2_totalPagesSpan =&#xD;                            document.querySelector(&#xD;                                &apos;.curated2.paginator .total-pages&apos;),&#xD;                        height = curated2_listDiv.clientHeight;&#xD;&#xD;                    // Forces grid to keep previous height when emptied out&#xD;                    if (height &gt; 0) {&#xD;                        curated2_listDiv.style.height = height;&#xD;                    }&#xD;&#xD;                    curated2_listDiv.innerHTML = &apos;&apos;;&#xD;                    beganLoading(&apos;.curated2.list&apos;);&#xD;&#xD;                    curated2_loadPage(&#xD;                        getUrlParameter(&apos;query&apos;),&#xD;                        curated2_pageSize,&#xD;                        pageNumber,&#xD;                        function (response) {&#xD;                            curated2_totalPages =&#xD;                                curated2_maxPages || response.pages;&#xD;                            curated2_totalPagesSpan.textContent =&#xD;                                curated2_totalPages;&#xD;&#xD;                            if (curated2_totalPages == 0 ||&#xD;                                (response.projects &amp;&amp; !response.projects[0]) ||&#xD;                                (response.collections &amp;&amp;&#xD;                                    !response.collections[0]) ||&#xD;                                (response.users &amp;&amp; !response.users[0])&#xD;                                // Until we fix the API this will do&#xD;                            ) {&#xD;                                if (!curated2_keepIfEmpty) {&#xD;                                    curated2_div.remove();&#xD;                                } else {&#xD;                                    doneLoading(&apos;.curated2.list&apos;);&#xD;                                }&#xD;                                return;&#xD;                            } else if (curated2_totalPages == 1 &amp;&amp;&#xD;                                    !curated2_keepIfEmpty) {&#xD;                                document.querySelector(&#xD;                                    &apos;.curated2.paginator&apos;).remove();&#xD;                            }&#xD;&#xD;                            curated2_onLoadPage(response,&#xD;                                curated2_listDiv);&#xD;&#xD;                            doneLoading(&apos;.curated2.list&apos;);&#xD;                        }&#xD;                    );&#xD;&#xD;                    curated2_page = pageNumber;&#xD;                    curated2_pageSpan.textContent = pageNumber;&#xD;                };&#xD;&#xD;                function curated2_initGrid (callback) {&#xD;                    curated2_toPage(1);&#xD;                    if (callback) {&#xD;                        callback.call(this);&#xD;                    }&#xD;                };&#xD;&#xD;            &lt;/script&gt;&#xD;        &lt;/div&gt;&#xD;&lt;nav class="curated2 paginator"&gt;&#xD;    &lt;a class="clickable" onclick="curated2_toPage(1);"&gt;&lt;i class="fas fa-caret-left"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="curated2_toPage(curated2_page - 5 &gt; 0 ? curated2_page - 5 : 1);"&gt;&lt;i class="fas fa-angle-double-left"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="curated2_toPage(curated2_page - 1 &gt; 0 ? curated2_page - 1 : curated2_page);"&gt;&lt;i class="fas fa-angle-left"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;span class="page"&gt;&lt;/span&gt; / &lt;span class="total-pages"&gt;&lt;/span&gt;&#xD;    &lt;a class="clickable" onclick="curated2_toPage(curated2_page + 1 &lt; curated2_totalPages ? curated2_page + 1 : curated2_totalPages);"&gt;&lt;i class="fas fa-angle-right"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="curated2_toPage(curated2_page + 5 &lt; curated2_totalPages ? curated2_page + 5 : curated2_totalPages);"&gt;&lt;i class="fas fa-angle-double-right"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="curated2_toPage(curated2_totalPages);"&gt;&lt;i class="fas fa-caret-right"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;&lt;/nav&gt;&#xD;    &lt;/div&gt;&#xD;    &lt;div class="curated2 list pure-g"&gt;&lt;/div&gt;&#xD;&lt;/div&gt;&#xD;&lt;script&gt;&#xD;    curated2_loadPage =&#xD;        function (query, pageSize, pageNumber, onSuccess) {&#xD;            SnapCloud.getCollectionProjects(&#xD;                &apos;snapcloud&apos;,&#xD;                pageNumber,&#xD;                pageSize,&#xD;                collections[1],&#xD;                onSuccess,&#xD;                genericError,&#xD;                true // withThumbnail&#xD;            );&#xD;        };&#xD;&#xD;    curated2_onLoadPage = latest_onLoadPage;&#xD;    curated2_initGrid();&#xD;&lt;/script&gt;&#xD;&#xD;&lt;/script&gt;&#xD;&lt;!--&#xD;    Any template that uses me needs to specify the following functions:&#xD;&#xD;    // Defines how to retrieve a particular page from the DB&#xD;    curated3_loadPage (&#xD;        query,      // search query&#xD;        pageSize,   // amount of elements per page&#xD;        pageNumber, // current page being requested&#xD;        onSuccess   // callback called when response comes back. Just leave as&#xD;                    // `onSuccess` unless doing something very specific, as&#xD;                    // this callback is defined by the search bar itself.&#xD;    )&#xD;&#xD;    // Defines how to load a particular page&#xD;    curated3_onLoadPage (&#xD;        response,      // response from the server&#xD;        targetElement  // HTML element where response should be rendered&#xD;    )&#xD;&#xD;    Once these functions have been defined, just call:&#xD;&#xD;    curated3_initGrid(callback);&#xD;--&gt;&#xD;&lt;div class="curated3 container"&gt;&#xD;    &lt;h2 class="curated3 header" localizable&gt;&lt;/h2&gt;&#xD;    &lt;div class="bar"&gt;&#xD;        &lt;div hidden class="curated3 search"&gt;&#xD;            &lt;form action="curated3"&gt;&#xD;                &lt;input type="text" name="query"&gt;&#xD;                &lt;i class="fas fa-search"&gt;&lt;/i&gt;&#xD;            &lt;/form&gt;&#xD;            &lt;script&gt;&#xD;                var curated3_page = 1,&#xD;                    curated3_totalPages = 1,&#xD;                    curated3_maxPages = [0][0] || 0, // 0 = no limit&#xD;                    curated3_pageSize = [5][0] || 150,&#xD;                    curated3_keepIfEmpty = [][0];&#xD;&#xD;                if (![collections[2]][0]) {&#xD;                    document.querySelector(&apos;.curated3.header&apos;).remove();&#xD;                } else {&#xD;                    document.querySelector(&apos;.curated3.header&apos;).innerHTML =&#xD;                        [collections[2]][0];&#xD;                }&#xD;&#xD;                if ([false][0]) {&#xD;                    document.querySelector(".curated3.search").hidden =&#xD;                        false;&#xD;                };&#xD;&#xD;                document.querySelector(&apos;.curated3 form input&apos;).value =&#xD;                    getUrlParameter(&apos;query&apos;);&#xD;&#xD;                function curated3_toPage (pageNumber) {&#xD;                    var curated3_div =&#xD;                            document.querySelector(&apos;.curated3.container&apos;),&#xD;                        curated3_listDiv =&#xD;                            document.querySelector(&apos;.curated3.list&apos;),&#xD;                        curated3_pageSpan =&#xD;                            document.querySelector(&#xD;                                &apos;.curated3.paginator .page&apos;),&#xD;                        curated3_totalPagesSpan =&#xD;                            document.querySelector(&#xD;                                &apos;.curated3.paginator .total-pages&apos;),&#xD;                        height = curated3_listDiv.clientHeight;&#xD;&#xD;                    // Forces grid to keep previous height when emptied out&#xD;                    if (height &gt; 0) {&#xD;                        curated3_listDiv.style.height = height;&#xD;                    }&#xD;&#xD;                    curated3_listDiv.innerHTML = &apos;&apos;;&#xD;                    beganLoading(&apos;.curated3.list&apos;);&#xD;&#xD;                    curated3_loadPage(&#xD;                        getUrlParameter(&apos;query&apos;),&#xD;                        curated3_pageSize,&#xD;                        pageNumber,&#xD;                        function (response) {&#xD;                            curated3_totalPages =&#xD;                                curated3_maxPages || response.pages;&#xD;                            curated3_totalPagesSpan.textContent =&#xD;                                curated3_totalPages;&#xD;&#xD;                            if (curated3_totalPages == 0 ||&#xD;                                (response.projects &amp;&amp; !response.projects[0]) ||&#xD;                                (response.collections &amp;&amp;&#xD;                                    !response.collections[0]) ||&#xD;                                (response.users &amp;&amp; !response.users[0])&#xD;                                // Until we fix the API this will do&#xD;                            ) {&#xD;                                if (!curated3_keepIfEmpty) {&#xD;                                    curated3_div.remove();&#xD;                                } else {&#xD;                                    doneLoading(&apos;.curated3.list&apos;);&#xD;                                }&#xD;                                return;&#xD;                            } else if (curated3_totalPages == 1 &amp;&amp;&#xD;                                    !curated3_keepIfEmpty) {&#xD;                                document.querySelector(&#xD;                                    &apos;.curated3.paginator&apos;).remove();&#xD;                            }&#xD;&#xD;                            curated3_onLoadPage(response,&#xD;                                curated3_listDiv);&#xD;&#xD;                            doneLoading(&apos;.curated3.list&apos;);&#xD;                        }&#xD;                    );&#xD;&#xD;                    curated3_page = pageNumber;&#xD;                    curated3_pageSpan.textContent = pageNumber;&#xD;                };&#xD;&#xD;                function curated3_initGrid (callback) {&#xD;                    curated3_toPage(1);&#xD;                    if (callback) {&#xD;                        callback.call(this);&#xD;                    }&#xD;                };&#xD;&#xD;            &lt;/script&gt;&#xD;        &lt;/div&gt;&#xD;&lt;nav class="curated3 paginator"&gt;&#xD;    &lt;a class="clickable" onclick="curated3_toPage(1);"&gt;&lt;i class="fas fa-caret-left"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="curated3_toPage(curated3_page - 5 &gt; 0 ? curated3_page - 5 : 1);"&gt;&lt;i class="fas fa-angle-double-left"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="curated3_toPage(curated3_page - 1 &gt; 0 ? curated3_page - 1 : curated3_page);"&gt;&lt;i class="fas fa-angle-left"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;span class="page"&gt;&lt;/span&gt; / &lt;span class="total-pages"&gt;&lt;/span&gt;&#xD;    &lt;a class="clickable" onclick="curated3_toPage(curated3_page + 1 &lt; curated3_totalPages ? curated3_page + 1 : curated3_totalPages);"&gt;&lt;i class="fas fa-angle-right"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="curated3_toPage(curated3_page + 5 &lt; curated3_totalPages ? curated3_page + 5 : curated3_totalPages);"&gt;&lt;i class="fas fa-angle-double-right"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;    &lt;a class="clickable" onclick="curated3_toPage(curated3_totalPages);"&gt;&lt;i class="fas fa-caret-right"&gt;&lt;/i&gt;&lt;/a&gt;&#xD;&lt;/nav&gt;&#xD;    &lt;/div&gt;&#xD;    &lt;div class="curated3 list pure-g"&gt;&lt;/div&gt;&#xD;&lt;/div&gt;&#xD;&lt;script&gt;&#xD;    curated3_loadPage =&#xD;        function (query, pageSize, pageNumber, onSuccess) {&#xD;            SnapCloud.getCollectionProjects(&#xD;                &apos;snapcloud&apos;,&#xD;                pageNumber,&#xD;                pageSize,&#xD;                collections[2],&#xD;                onSuccess,&#xD;                genericError,&#xD;                true // withThumbnail&#xD;            );&#xD;        };&#xD;&#xD;    curated3_onLoadPage = latest_onLoadPage;&#xD;    curated3_initGrid();&#xD;&lt;/script&gt;&#xD;&#xD;        &lt;/div&gt;&#xD;&lt;div id="footer"&gt;&#xD;    &lt;div class="links pure-g"&gt;&#xD;        &lt;div class="pure-u-1-5"&gt;&#xD;            &lt;p&gt;&lt;h4 localizable&gt;About&lt;/h4&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a localizable href="about"&gt;About Snap&lt;em&gt;!&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a localizable href="blog"&gt;Blog&lt;/a&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a localizable href="credits"&gt;Credits&lt;/a&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a localizable href="requirements"&gt;Technical Requirements&lt;/a&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a localizable href="partners"&gt;Partners&lt;/a&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a localizable href="source" &gt;Source Code&lt;/a&gt;&lt;/p&gt;&#xD;        &lt;/div&gt;&#xD;        &lt;div class="pure-u-1-5"&gt;&#xD;            &lt;p&gt;&lt;h4 localizable&gt;Learning&lt;/h4&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a localizable href="examples"&gt;Examples&lt;/a&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a localizable href="snap/help/SnapManual.pdf"&#xD;                &gt;Reference Manual&lt;/a&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a localizable href="materials"&gt;Materials&lt;/a&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a localizable href="bjc"&gt;The Beauty and Joy of Computing&lt;/a&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a localizable href="research"&gt;Research&lt;/a&gt;&lt;/p&gt;&#xD;        &lt;/div&gt;&#xD;        &lt;div class="pure-u-1-5"&gt;&#xD;            &lt;p&gt;&lt;h4 localizable&gt;Tools&lt;/h4&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a localizable href="offline"&gt;Offline Version&lt;/a&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a localizable href="extensions"&gt;Extensions&lt;/a&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a href="snapp"&gt;Snapp&lt;em&gt;!&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a href="snapinator"&gt;Snapinator&lt;/a&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a href="https://smerge.org/"&gt;Smerge&lt;/a&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a href="old_site/old-byob.html"&gt;BYOB (old Snap&lt;em&gt;!&lt;/em&gt;)&lt;/a&gt;&lt;/p&gt;&#xD;        &lt;/div&gt;&#xD;        &lt;div class="pure-u-1-5"&gt;&#xD;            &lt;p&gt;&lt;h4 localizable&gt;Support&lt;/h4&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a localizable target="_blank"&#xD;                href="https://forum.snap.berkeley.edu/"&gt;Forum&lt;/a&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a localizable href="contact"&gt;Contact Us&lt;/a&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a localizable href="mirrors"&gt;Mirrors&lt;/a&gt;&lt;/p&gt;&#xD;        &lt;/div&gt;&#xD;        &lt;div class="pure-u-1-5"&gt;&#xD;            &lt;p&gt;&lt;h4 localizable&gt;Legal&lt;/h4&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a localizable href="dmca"&gt;DMCA&lt;/a&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a localizable href="privacy"&gt;Privacy&lt;/a&gt;&lt;/p&gt;&#xD;            &lt;p&gt;&lt;a localizable href="tos"&gt;Terms of Service&lt;/a&gt;&lt;/p&gt;&#xD;        &lt;/div&gt;&#xD;    &lt;/div&gt;&#xD;&lt;/div&gt;&#xD;    &lt;/body&gt;&#xD;    &lt;script&gt;&#xD;    SnapCloud.genericError = genericError;&#xD;    document.querySelector(&apos;#top-bar .run&apos;).href = snapURL;&#xD;    if (!sessionStorage.username) {&#xD;        SnapCloud.initSession(&#xD;            function (username, role) {&#xD;                sessionStorage.username = username;&#xD;                sessionStorage.role = role;&#xD;                initForUsername(username);&#xD;            }&#xD;        );&#xD;    } else {&#xD;        initForUsername(sessionStorage.username);&#xD;    }&#xD;&#xD;    function initForUsername (username) {&#xD;        if (username) {&#xD;            SnapCloud.username = username;&#xD;            document.querySelector(&apos;li.join&apos;).hidden = true;&#xD;            document.querySelector(&apos;li.sign-in&apos;).hidden = true;&#xD;            document.querySelector(&apos;li.user-menu&apos;).hidden = false;&#xD;            document.querySelector(&apos;a.my-public-projects&apos;).href =&#xD;                &apos;user?user=&apos; + username;&#xD;            if (hasAnyOfRoles([&apos;admin&apos;, &apos;moderator&apos;, &apos;reviewer&apos;])) {&#xD;                document.querySelector(&apos;.admin&apos;).hidden = false;&#xD;            }&#xD;            fillVisitorFields();&#xD;        } else {&#xD;            document.querySelector(&apos;li.join&apos;).hidden = false;&#xD;            document.querySelector(&apos;li.sign-in&apos;).hidden = false;&#xD;            document.querySelector(&apos;li.user-menu&apos;).hidden = true;&#xD;        }&#xD;        fillUsernameFields();&#xD;        fillVisitorFields();&#xD;        doneLoading();&#xD;    }&#xD;&#xD;    // Share sessionStorage across tabs&#xD;    // http://blog.guya.net/2015/06/12/sharing-sessionstorage-between-tabs-for-secure-multi-tab-authentication/&#xD;    if (!sessionStorage.length) {&#xD;        localStorage.setItem(&apos;getSessionStorage&apos;, Date.now());&#xD;    };&#xD;    window.addEventListener(&apos;storage&apos;, function(event) {&#xD;        if (event.key == &apos;getSessionStorage&apos;) {&#xD;            localStorage.setItem(&apos;sessionStorage&apos;,&#xD;                JSON.stringify(sessionStorage));&#xD;            localStorage.removeItem(&apos;sessionStorage&apos;);&#xD;        } else if (event.key == &apos;sessionStorage&apos; &amp;&amp; !sessionStorage.length) {&#xD;            var data = JSON.parse(event.newValue), value;&#xD;            for (key in data) { sessionStorage.setItem(key, data[key]); }&#xD;        }&#xD;    });&#xD;    &lt;/script&gt;&#xD;&lt;/html&gt;&#xD;</l></variable></variables></project><media name="snap spam request demo" app="Snap! 6, https://snap.berkeley.edu" version="1"></media></snapdata>