diff --git a/.gitignore b/.gitignore
index 1829baee1994f5fae01a0aa8b2ef48750150967a..553281cad4c6e899d7a643d1f49f4ae9943be0ce 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,7 +15,10 @@ Gemfile.lock
 /.idea
 /vendor
 /log
+/config/env_vars.sh
 /db/schema.rb
 /db/development.sqlite3
 /db/test.sqlite3
 /public/assets
+/config/orientdb.yml
+/config/dspace.yml
diff --git a/Gemfile b/Gemfile
index 1039b92c5f9861d60d2bc52222bf0b9db8c93f34..7a7f64807ef4bf2ae8c2b80efd1726a3e3d43aa2 100644
--- a/Gemfile
+++ b/Gemfile
@@ -35,30 +35,15 @@ gem 'orientdb4r'
 # web server
 gem 'puma'
 
-gem 'rufus-scheduler'
-
-group :development, :test do
-  gem 'better_errors'
-  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
-  gem 'byebug'
-
-  # Access an IRB console on exception pages or by using <%= console %> in views
-  gem 'web-console', '~> 2.0'
-
-  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
-  gem 'spring'
-
-  gem 'sqlite3'
-end
-
-group :test do
-  gem 'shoulda'
-  gem 'shoulda-callback-matchers', '~> 1.1.1'
-end
+# scheduler
+gem 'whenever', :require => false
 
 # authentication
 gem 'devise'
 
+# files
+gem 'paperclip'
+
 # enable login via rest
 gem 'devise_token_auth'
 gem 'rack-cors', require: 'rack/cors'
@@ -66,6 +51,9 @@ gem 'rack-cors', require: 'rack/cors'
 #bootstrap
 gem 'bootstrap-sass'
 
+# select box used in search
+gem 'select2-rails'
+
 #Gruff (graphs and charts)
 gem 'rmagick'
 gem 'gruff'
@@ -82,17 +70,44 @@ gem 'chart-js-rails'
 #depoyment
 gem 'mina'
 
+# management visual framework
 gem 'locastyle'
+
+# paginate results
 gem 'will_paginate', '~> 3.0.5'
 
-# profilers
+# evaluate source code
 gem 'rubycritic', require: false
-gem 'rack-mini-profiler'
-gem 'bullet'
 
 # docs
 gem 'rdoc'
 
-#JavaScript runtime
-gem 'execjs'
-gem 'therubyracer'
\ No newline at end of file
+group :development, :test do
+  # profiler
+  gem 'rack-mini-profiler'
+  gem 'flamegraph'
+  # reduce queries - https://github.com/flyerhzm/bullet
+  gem 'bullet'
+
+  gem 'better_errors'
+  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
+  gem 'byebug'
+
+  # Access an IRB console on exception pages or by using <%= console %> in views
+  gem 'web-console', '~> 2.0'
+
+  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
+  gem 'spring'
+
+  gem 'sqlite3'
+
+  #JavaScript runtime
+  gem 'execjs'
+  gem 'therubyracer'
+  
+end
+
+group :test do
+  gem 'shoulda'
+  gem 'shoulda-callback-matchers', '~> 1.1.1'
+end
diff --git a/Gemfile.lock b/Gemfile.lock
index 3dbd0d2954efd3227c785199a2a06bfd44613b73..5581e23b9f1dd5365b99fcc3dfda6bf81f5982e1 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -66,6 +66,11 @@ GEM
     byebug (6.0.2)
     chart-js-rails (0.0.9)
       railties (> 3.1)
+    chronic (0.10.2)
+    climate_control (0.0.3)
+      activesupport (>= 3.0)
+    cocaine (0.5.7)
+      climate_control (>= 0.0.3, < 1.0)
     coderay (1.1.0)
     coercible (1.0.0)
       descendants_tracker (~> 0.0.1)
@@ -102,6 +107,11 @@ GEM
     equalizer (0.0.11)
     erubis (2.7.0)
     execjs (2.6.0)
+    fast_stack (0.1.0)
+      rake
+      rake-compiler
+    flamegraph (0.1.0)
+      fast_stack
     flay (2.4.0)
       ruby_parser (~> 3.0)
       sexp_processor (~> 4.0)
@@ -136,6 +146,7 @@ GEM
     memoizable (0.4.2)
       thread_safe (~> 0.3, >= 0.3.1)
     mime-types (2.6.2)
+    mimemagic (0.3.0)
     mina (0.3.7)
       open4 (~> 1.3.4)
       rake
@@ -149,6 +160,12 @@ GEM
     orientdb4r (0.5.1)
       rest-client (~> 1.7)
     orm_adapter (0.5.0)
+    paperclip (4.3.1)
+      activemodel (>= 3.2.0)
+      activesupport (>= 3.2.0)
+      cocaine (~> 0.5.5)
+      mime-types
+      mimemagic (= 0.3.0)
     parser (2.2.2.6)
       ast (>= 1.1, < 3.0)
     pg (0.18.3)
@@ -186,6 +203,8 @@ GEM
       thor (>= 0.18.1, < 2.0)
     rainbow (2.0.0)
     rake (10.4.2)
+    rake-compiler (0.9.5)
+      rake
     rdoc (4.2.0)
     reek (1.6.5)
       parser (~> 2.2.0.pre.7)
@@ -209,7 +228,6 @@ GEM
       parser (>= 2.2.0, < 3.0)
       reek (= 1.6.5)
       virtus (~> 1.0)
-    rufus-scheduler (3.1.4)
     sass (3.4.18)
     sass-rails (5.0.4)
       railties (>= 4.0.0, < 5.0)
@@ -220,6 +238,8 @@ GEM
     sdoc (0.4.1)
       json (~> 1.7, >= 1.7.7)
       rdoc (~> 4.0)
+    select2-rails (4.0.0)
+      thor (~> 0.14)
     sexp_processor (4.6.0)
     shoulda (3.5.0)
       shoulda-context (~> 1.0, >= 1.0.1)
@@ -274,6 +294,8 @@ GEM
       binding_of_caller (>= 0.7.2)
       railties (>= 4.0)
       sprockets-rails (>= 2.0, < 4.0)
+    whenever (0.9.4)
+      chronic (>= 0.6.3)
     will_paginate (3.0.7)
 
 PLATFORMS
@@ -291,6 +313,7 @@ DEPENDENCIES
   devise_token_auth
   dspace_rest_client (~> 1.1.0)
   execjs
+  flamegraph
   gruff
   jbuilder (~> 2.0)
   jquery-rails
@@ -298,6 +321,7 @@ DEPENDENCIES
   locastyle
   mina
   orientdb4r
+  paperclip
   pg
   puma
   rack-cors
@@ -307,9 +331,9 @@ DEPENDENCIES
   rmagick
   rsolr (~> 1.0.12)
   rubycritic
-  rufus-scheduler
   sass-rails (~> 5.0)
   sdoc (~> 0.4.0)
+  select2-rails
   shoulda
   shoulda-callback-matchers (~> 1.1.1)
   spring
@@ -318,6 +342,7 @@ DEPENDENCIES
   turbolinks
   uglifier (>= 1.3.0)
   web-console (~> 2.0)
+  whenever
   will_paginate (~> 3.0.5)
 
 BUNDLED WITH
diff --git a/app/assets/images/missing.svg b/app/assets/images/missing.svg
new file mode 100644
index 0000000000000000000000000000000000000000..39e55e773a922b5f1a24e0ad5acf76ad0f722223
--- /dev/null
+++ b/app/assets/images/missing.svg
@@ -0,0 +1,227 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   inkscape:export-ydpi="90.000000"
+   inkscape:export-xdpi="90.000000"
+   inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
+   width="48px"
+   height="48px"
+   id="svg11300"
+   sodipodi:version="0.32"
+   inkscape:version="0.43+devel"
+   sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/status"
+   sodipodi:docname="image-missing.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs3">
+    <linearGradient
+       id="linearGradient3563">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3565" />
+      <stop
+         style="stop-color:#939393;stop-opacity:1;"
+         offset="1"
+         id="stop3567" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3555">
+      <stop
+         style="stop-color:#f2f2f2;stop-opacity:1;"
+         offset="0"
+         id="stop3557" />
+      <stop
+         style="stop-color:#d0d0d0;stop-opacity:1;"
+         offset="1"
+         id="stop3559" />
+    </linearGradient>
+    <linearGradient
+       style="stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
+       y2="36.0328"
+       x2="31.0813"
+       y1="3.7319"
+       x1="12.4873"
+       gradientUnits="userSpaceOnUse"
+       id="aigrd1">
+      <stop
+         id="stop16177"
+         style="stop-color:#D2D2D2;stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
+         offset="0" />
+      <stop
+         id="stop16179"
+         style="stop-color:#EDEDED;stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#aigrd1"
+       id="linearGradient16280"
+       gradientUnits="userSpaceOnUse"
+       x1="12.4873"
+       y1="3.7319"
+       x2="31.0813"
+       y2="36.0328"
+       gradientTransform="matrix(1.211383,0.000000,0.000000,1.211383,-2.021433,0.189894)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient12129">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop12131" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop12133" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient12129"
+       id="radialGradient12135"
+       cx="24.218407"
+       cy="41.636040"
+       fx="24.218407"
+       fy="41.636040"
+       r="22.097088"
+       gradientTransform="matrix(1.000000,0.000000,0.000000,0.184000,0.000000,33.97501)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3555"
+       id="radialGradient3561"
+       cx="26.728037"
+       cy="38.34853"
+       fx="26.728037"
+       fy="38.34853"
+       r="17.926361"
+       gradientTransform="matrix(1.848501,-1.547102e-23,1.227926e-24,1.289078,-21.29931,-13.68176)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3563"
+       id="linearGradient3569"
+       x1="28.107494"
+       y1="34.868584"
+       x2="22.169001"
+       y2="9.8661737"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0.000000,0.883885)" />
+  </defs>
+  <sodipodi:namedview
+     stroke="#cc0000"
+     fill="#cc0000"
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="0.25490196"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.6568542"
+     inkscape:cx="21.313886"
+     inkscape:cy="27.870334"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="770"
+     inkscape:window-height="630"
+     inkscape:window-x="180"
+     inkscape:window-y="85" />
+  <metadata
+     id="metadata4">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Jakub Steiner</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:source>http://jimmac.musichall.cz</dc:source>
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+        <dc:title>Broken Image</dc:title>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>image</rdf:li>
+            <rdf:li>picture</rdf:li>
+            <rdf:li>photo</rdf:li>
+            <rdf:li>missing</rdf:li>
+            <rdf:li>broken</rdf:li>
+            <rdf:li>404</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/Reproduction" />
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/Distribution" />
+        <cc:requires
+           rdf:resource="http://web.resource.org/cc/Notice" />
+        <cc:requires
+           rdf:resource="http://web.resource.org/cc/Attribution" />
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+        <cc:requires
+           rdf:resource="http://web.resource.org/cc/ShareAlike" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       sodipodi:type="arc"
+       style="opacity:0.52763821;color:#000000;fill:url(#radialGradient12135);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.61658032;visibility:visible;display:block"
+       id="path12127"
+       sodipodi:cx="24.218407"
+       sodipodi:cy="41.63604"
+       sodipodi:rx="22.097088"
+       sodipodi:ry="4.0658641"
+       d="M 46.315495 41.63604 A 22.097088 4.0658641 0 1 1  2.1213188,41.63604 A 22.097088 4.0658641 0 1 1  46.315495 41.63604 z"
+       transform="translate(0.176777,0.900834)" />
+    <path
+       id="path16181"
+       d="M 45.343675,39.903974 C 45.343675,41.842189 43.768877,43.416987 41.830663,43.416987 L 6.3371177,43.416987 C 4.3989037,43.416987 2.8241047,41.842189 2.8241047,39.903974 L 2.8241047,7.0947821 C 2.8241047,5.1565681 4.3989037,3.581769 6.3371177,3.581769 L 41.830663,3.581769 C 43.768877,3.581769 45.343675,5.1565681 45.343675,7.0947821 L 45.343675,39.903974 L 45.343675,39.903974 z "
+       style="fill:url(#linearGradient16280);fill-rule:nonzero;stroke:#646464;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="fill:url(#radialGradient3561);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3569);stroke-width:0.99999923;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.61658032"
+       d="M 41.467991,35.25247 L 6.6152692,35.25247 L 6.6152692,11.250058 L 41.467991,11.250058 L 41.467991,35.25247 L 41.467991,35.25247 z "
+       id="path12125"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       style="fill:none;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.00000012;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.86010359"
+       d="M 44.480104,39.32848 C 44.480104,41.187964 43.499604,42.345241 41.640121,42.345241 L 6.6160507,42.345241 C 4.7565677,42.345241 3.6876787,41.276353 3.6876787,39.416869 L 3.6876787,7.5970548 C 3.6876787,5.737571 5.1985087,4.403517 7.0579927,4.403517 L 41.198179,4.403517 C 43.057662,4.403517 44.480104,5.737571 44.480104,7.5970548 L 44.480104,38.974927 L 44.480104,39.32848 z "
+       id="path11975"
+       sodipodi:nodetypes="cccccccccc" />
+    <g
+       id="g3551"
+       transform="matrix(0.772431,0.000000,0.000000,0.772431,10.05699,9.902145)">
+      <path
+         d="M 11.318692,9.2240568 C 16.641997,14.693047 22.769247,19.123651 29.210664,22.931105 L 27.441568,24.159843 C 21.101863,20.04489 15.052508,15.498993 9.1840818,10.652117 L 11.318692,9.2240568 z "
+         id="path2565"
+         style="opacity:1;color:#000000;fill:#cc0000;fill-opacity:1;fill-rule:nonzero;stroke:#cc0000;stroke-width:2.58922911;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="M 26.73892,8.9210568 C 21.867631,15.95255 15.247359,21.081199 7.9065151,25.28163 L 10.087564,23.520856 C 8.7241111,24.379297 25.574485,11.804168 23.852075,10.207903 L 26.73892,8.9210568 z "
+         id="path2575"
+         style="opacity:1;color:#000000;fill:#cc0000;fill-opacity:1;fill-rule:nonzero;stroke:#cc0000;stroke-width:2.58922839;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+    </g>
+  </g>
+</svg>
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
index 8a653cb364e172b3ed9420d3255de776c3cd4a7f..c1e8f708f3e00a670b82b076568ffd37d1350b43 100644
--- a/app/assets/javascripts/application.js
+++ b/app/assets/javascripts/application.js
@@ -15,15 +15,33 @@
 //= require turbolinks
 //= require jquery.turbolinks
 //= require bootstrap-sprockets
+//= require select2
 //= require_tree ./application
-//= require_tree ./search
+
+/*
+$('h2').each(function(index,value) {
+  $(this).css('fontSize', (parseFloat($(this).css('fontSize')) + (size_c - 15)) + 'px');
+});
+$('h3').each(function(index,value) {
+  $(this).css('fontSize', (parseFloat($(this).css('fontSize')) + (size_c - 15)) + 'px');
+});
+$('h4').each(function(index,value) {
+  $(this).css('fontSize', (parseFloat($(this).css('fontSize')) + (size_c - 15)) + 'px');
+});
+$('h5').each(function(index,value) {
+  $(this).css('fontSize', (parseFloat($(this).css('fontSize')) + (size_c - 15)) + 'px');
+});
+$('h6').each(function(index,value) {
+  $(this).css('fontSize', (parseFloat($(this).css('fontSize')) + (size_c - 15)) + 'px');
+});
+*/
 
 $(document).ready(function(){
   size_c = readCookie('fontSize');
   if (size_c != null) {
     document.body.style.fontSize = size_c + 'px';
     $('.dropdown-menu').css('fontSize', document.body.style.fontSize);
-    $('h1').each(function(index,value) {
+    $('h1,h2,h3,h4,h5,h6').each(function(index,value) {
       $(this).css('fontSize', (parseFloat($(this).css('fontSize')) + (size_c - 15)) + 'px');
     });
   }
@@ -62,22 +80,7 @@ function resizeText(increment) {
     if (size < 25) {
       document.body.style.fontSize = parseFloat(document.body.style.fontSize) + increment + "px";
       $('.dropdown-menu').css('fontSize', document.body.style.fontSize);
-      $('h1').each(function(index,value) {
-        $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px');
-      });
-      $('h2').each(function(index,value) {
-        $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px');
-      });
-      $('h3').each(function(index,value) {
-        $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px');
-      });
-      $('h4').each(function(index,value) {
-        $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px');
-      });
-      $('h5').each(function(index,value) {
-        $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px');
-      });
-      $('h6').each(function(index,value) {
+      $('h1 ,h2 ,h3, h4, h5 ,h6').each(function(index,value) {
         $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px');
       });
     }
@@ -85,22 +88,7 @@ function resizeText(increment) {
     if (size > 10) {
       document.body.style.fontSize = parseFloat(document.body.style.fontSize) + increment + "px";
       $('.dropdown-menu').css('fontSize', document.body.style.fontSize);
-      $('h1').each(function(index,value) {
-        $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px');
-      });
-      $('h2').each(function(index,value) {
-        $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px');
-      });
-      $('h3').each(function(index,value) {
-        $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px');
-      });
-      $('h4').each(function(index,value) {
-        $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px');
-      });
-      $('h5').each(function(index,value) {
-        $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px');
-      });
-      $('h6').each(function(index,value) {
+      $('h1 ,h2 ,h3, h4, h5 ,h6').each(function(index,value) {
         $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px');
       });
     }
@@ -109,73 +97,42 @@ function resizeText(increment) {
     size = parseFloat(document.body.style.fontSize);
     document.body.style.fontSize = '15px';
     $('.dropdown-menu').css('fontSize', document.body.style.fontSize);
-    $('h1').each(function(index,value) {
-      $(this).css('fontSize',Math.abs(parseFloat($(this).css('fontSize'))-(size-15)) + 'px');
-    });
-    $('h2').each(function(index,value) {
-      $(this).css('fontSize',Math.abs(parseFloat($(this).css('fontSize'))-(size-15)) + 'px');
-    });
-    $('h3').each(function(index,value) {
-      $(this).css('fontSize',Math.abs(parseFloat($(this).css('fontSize'))-(size-15)) + 'px');
-    });
-    $('h4').each(function(index,value) {
-      $(this).css('fontSize',Math.abs(parseFloat($(this).css('fontSize'))-(size-15)) + 'px');
-    });
-    $('h5').each(function(index,value) {
-      $(this).css('fontSize',Math.abs(parseFloat($(this).css('fontSize'))-(size-15)) + 'px');
-    });
-    $('h6').each(function(index,value) {
-      $(this).css('fontSize',Math.abs(parseFloat($(this).css('fontSize'))-(size-15)) + 'px');
+    $('h1 ,h2 ,h3, h4, h5 ,h6').each(function(index,value) {
+      $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px');
     });
   }
   createCookie('fontSize', parseFloat(document.body.style.fontSize), 365);
 }
 
 function changeContrast() {
-  if (readCookie('contrast') == null || readCookie('contrast') == "true") {
-    createCookie('contrast',"false",0);
-  } else {
+  if (readCookie('contrast') == null || readCookie('contrast') == "false") {
     createCookie('contrast',"true",0);
+  } else {
+    createCookie('contrast',"false",0);
   }
   Contrast();
 }
 
 function Contrast() {
   contrast_c = readCookie('contrast');
-  if (contrast_c == null || contrast_c != "false"){
-    $('body').removeClass("contraste");
-    $('body').removeClass("alto-contraste");
-    $('.searchbar').removeClass("searchbar-contraste");
-    $('header a').removeClass("link-contraste");
-    $('#footer').removeClass("footer-contraste");
-    $('#footer div').removeClass("footer-contraste");
-    $('.dropdown-menu').removeClass("dropdown-menu-contrast");
-    $('.general_highlights').removeClass("general_highlights-contrast");
-    $(".nav > li > a").css('background-color','none');
-    $(".nav > li > a").hover(
-      function(){
-        $(this).css('background-color','#eee')
-      },function(){
-        $(this).css('background-color','transparent')
-      }
-    );
+  if (contrast_c == null || contrast_c != "true"){
+    $('body').addClass('contraste');
+    $('.barra-brasil').addClass('contraste');
+    $('.search-bar').addClass('contraste');
+    $('.search-bar').css('border-top','2px solid white');
+    $('#menu-bar').addClass('menu-bar-contrast');
+    $('.object-vertical .panel').addClass('contraste');
+    $('.navbar').addClass('contraste');
+    $('.well').addClass('contraste');
   }else {
-    $('body').addClass("contraste");
-    $('body').addClass("alto-contraste");
-    $('.searchbar').addClass("searchbar-contraste");
-    $('header a').addClass("link-contraste");
-    $('#footer').addClass("footer-contraste");
-    $('#footer div').addClass("footer-contraste");
-    $('.dropdown-menu').addClass("dropdown-menu-contrast");
-    $('.general_highlights').addClass("general_highlights-contrast");
-    $(".nav > li > a").css('background-color','#transparent');
-    $(".nav > li > a").hover(
-      function(){
-        $(this).css('background-color','#000');
-      }, function() {
-        $(this).css('background-color','#transparent')
-      }
-    );
+    $('body').removeClass('contraste');
+    $('.barra-brasil').removeClass('contraste');
+    $('.search-bar').removeClass('contraste');
+    $('.search-bar').css('border-top','none');
+    $('#menu-bar').removeClass('menu-bar-contrast');
+    $('.object-vertical .panel').removeClass('contraste');
+    $('.navbar').removeClass('contraste');
+    $('.well').removeClass('contraste');
   }
 }
 
diff --git a/app/assets/javascripts/search/select2.full.js b/app/assets/javascripts/search/select2.full.js
deleted file mode 100644
index dd0e8bc74d679445338dc62a19ee756bb3bc2974..0000000000000000000000000000000000000000
--- a/app/assets/javascripts/search/select2.full.js
+++ /dev/null
@@ -1,6114 +0,0 @@
-/*!
- * Select2 4.0.0
- * https://select2.github.io
- *
- * Released under the MIT license
- * https://github.com/select2/select2/blob/master/LICENSE.md
- */
-(function (factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module.
-    define(['jquery'], factory);
-  } else if (typeof exports === 'object') {
-    // Node/CommonJS
-    factory(require('jquery'));
-  } else {
-    // Browser globals
-    factory(jQuery);
-  }
-}(function (jQuery) {
-  // This is needed so we can catch the AMD loader configuration and use it
-  // The inner file should be wrapped (by `banner.start.js`) in a function that
-  // returns the AMD loader references.
-  var S2 =
-(function () {
-  // Restore the Select2 AMD loader so it can be used
-  // Needed mostly in the language files, where the loader is not inserted
-  if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {
-    var S2 = jQuery.fn.select2.amd;
-  }
-var S2;(function () { if (!S2 || !S2.requirejs) {
-if (!S2) { S2 = {}; } else { require = S2; }
-/**
- * @license almond 0.2.9 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.
- * Available via the MIT or new BSD license.
- * see: http://github.com/jrburke/almond for details
- */
-//Going sloppy to avoid 'use strict' string cost, but strict practices should
-//be followed.
-/*jslint sloppy: true */
-/*global setTimeout: false */
-
-var requirejs, require, define;
-(function (undef) {
-    var main, req, makeMap, handlers,
-        defined = {},
-        waiting = {},
-        config = {},
-        defining = {},
-        hasOwn = Object.prototype.hasOwnProperty,
-        aps = [].slice,
-        jsSuffixRegExp = /\.js$/;
-
-    function hasProp(obj, prop) {
-        return hasOwn.call(obj, prop);
-    }
-
-    /**
-     * Given a relative module name, like ./something, normalize it to
-     * a real name that can be mapped to a path.
-     * @param {String} name the relative name
-     * @param {String} baseName a real name that the name arg is relative
-     * to.
-     * @returns {String} normalized name
-     */
-    function normalize(name, baseName) {
-        var nameParts, nameSegment, mapValue, foundMap, lastIndex,
-            foundI, foundStarMap, starI, i, j, part,
-            baseParts = baseName && baseName.split("/"),
-            map = config.map,
-            starMap = (map && map['*']) || {};
-
-        //Adjust any relative paths.
-        if (name && name.charAt(0) === ".") {
-            //If have a base name, try to normalize against it,
-            //otherwise, assume it is a top-level require that will
-            //be relative to baseUrl in the end.
-            if (baseName) {
-                //Convert baseName to array, and lop off the last part,
-                //so that . matches that "directory" and not name of the baseName's
-                //module. For instance, baseName of "one/two/three", maps to
-                //"one/two/three.js", but we want the directory, "one/two" for
-                //this normalization.
-                baseParts = baseParts.slice(0, baseParts.length - 1);
-                name = name.split('/');
-                lastIndex = name.length - 1;
-
-                // Node .js allowance:
-                if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {
-                    name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
-                }
-
-                name = baseParts.concat(name);
-
-                //start trimDots
-                for (i = 0; i < name.length; i += 1) {
-                    part = name[i];
-                    if (part === ".") {
-                        name.splice(i, 1);
-                        i -= 1;
-                    } else if (part === "..") {
-                        if (i === 1 && (name[2] === '..' || name[0] === '..')) {
-                            //End of the line. Keep at least one non-dot
-                            //path segment at the front so it can be mapped
-                            //correctly to disk. Otherwise, there is likely
-                            //no path mapping for a path starting with '..'.
-                            //This can still fail, but catches the most reasonable
-                            //uses of ..
-                            break;
-                        } else if (i > 0) {
-                            name.splice(i - 1, 2);
-                            i -= 2;
-                        }
-                    }
-                }
-                //end trimDots
-
-                name = name.join("/");
-            } else if (name.indexOf('./') === 0) {
-                // No baseName, so this is ID is resolved relative
-                // to baseUrl, pull off the leading dot.
-                name = name.substring(2);
-            }
-        }
-
-        //Apply map config if available.
-        if ((baseParts || starMap) && map) {
-            nameParts = name.split('/');
-
-            for (i = nameParts.length; i > 0; i -= 1) {
-                nameSegment = nameParts.slice(0, i).join("/");
-
-                if (baseParts) {
-                    //Find the longest baseName segment match in the config.
-                    //So, do joins on the biggest to smallest lengths of baseParts.
-                    for (j = baseParts.length; j > 0; j -= 1) {
-                        mapValue = map[baseParts.slice(0, j).join('/')];
-
-                        //baseName segment has  config, find if it has one for
-                        //this name.
-                        if (mapValue) {
-                            mapValue = mapValue[nameSegment];
-                            if (mapValue) {
-                                //Match, update name to the new value.
-                                foundMap = mapValue;
-                                foundI = i;
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                if (foundMap) {
-                    break;
-                }
-
-                //Check for a star map match, but just hold on to it,
-                //if there is a shorter segment match later in a matching
-                //config, then favor over this star map.
-                if (!foundStarMap && starMap && starMap[nameSegment]) {
-                    foundStarMap = starMap[nameSegment];
-                    starI = i;
-                }
-            }
-
-            if (!foundMap && foundStarMap) {
-                foundMap = foundStarMap;
-                foundI = starI;
-            }
-
-            if (foundMap) {
-                nameParts.splice(0, foundI, foundMap);
-                name = nameParts.join('/');
-            }
-        }
-
-        return name;
-    }
-
-    function makeRequire(relName, forceSync) {
-        return function () {
-            //A version of a require function that passes a moduleName
-            //value for items that may need to
-            //look up paths relative to the moduleName
-            return req.apply(undef, aps.call(arguments, 0).concat([relName, forceSync]));
-        };
-    }
-
-    function makeNormalize(relName) {
-        return function (name) {
-            return normalize(name, relName);
-        };
-    }
-
-    function makeLoad(depName) {
-        return function (value) {
-            defined[depName] = value;
-        };
-    }
-
-    function callDep(name) {
-        if (hasProp(waiting, name)) {
-            var args = waiting[name];
-            delete waiting[name];
-            defining[name] = true;
-            main.apply(undef, args);
-        }
-
-        if (!hasProp(defined, name) && !hasProp(defining, name)) {
-            throw new Error('No ' + name);
-        }
-        return defined[name];
-    }
-
-    //Turns a plugin!resource to [plugin, resource]
-    //with the plugin being undefined if the name
-    //did not have a plugin prefix.
-    function splitPrefix(name) {
-        var prefix,
-            index = name ? name.indexOf('!') : -1;
-        if (index > -1) {
-            prefix = name.substring(0, index);
-            name = name.substring(index + 1, name.length);
-        }
-        return [prefix, name];
-    }
-
-    /**
-     * Makes a name map, normalizing the name, and using a plugin
-     * for normalization if necessary. Grabs a ref to plugin
-     * too, as an optimization.
-     */
-    makeMap = function (name, relName) {
-        var plugin,
-            parts = splitPrefix(name),
-            prefix = parts[0];
-
-        name = parts[1];
-
-        if (prefix) {
-            prefix = normalize(prefix, relName);
-            plugin = callDep(prefix);
-        }
-
-        //Normalize according
-        if (prefix) {
-            if (plugin && plugin.normalize) {
-                name = plugin.normalize(name, makeNormalize(relName));
-            } else {
-                name = normalize(name, relName);
-            }
-        } else {
-            name = normalize(name, relName);
-            parts = splitPrefix(name);
-            prefix = parts[0];
-            name = parts[1];
-            if (prefix) {
-                plugin = callDep(prefix);
-            }
-        }
-
-        //Using ridiculous property names for space reasons
-        return {
-            f: prefix ? prefix + '!' + name : name, //fullName
-            n: name,
-            pr: prefix,
-            p: plugin
-        };
-    };
-
-    function makeConfig(name) {
-        return function () {
-            return (config && config.config && config.config[name]) || {};
-        };
-    }
-
-    handlers = {
-        require: function (name) {
-            return makeRequire(name);
-        },
-        exports: function (name) {
-            var e = defined[name];
-            if (typeof e !== 'undefined') {
-                return e;
-            } else {
-                return (defined[name] = {});
-            }
-        },
-        module: function (name) {
-            return {
-                id: name,
-                uri: '',
-                exports: defined[name],
-                config: makeConfig(name)
-            };
-        }
-    };
-
-    main = function (name, deps, callback, relName) {
-        var cjsModule, depName, ret, map, i,
-            args = [],
-            callbackType = typeof callback,
-            usingExports;
-
-        //Use name if no relName
-        relName = relName || name;
-
-        //Call the callback to define the module, if necessary.
-        if (callbackType === 'undefined' || callbackType === 'function') {
-            //Pull out the defined dependencies and pass the ordered
-            //values to the callback.
-            //Default to [require, exports, module] if no deps
-            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;
-            for (i = 0; i < deps.length; i += 1) {
-                map = makeMap(deps[i], relName);
-                depName = map.f;
-
-                //Fast path CommonJS standard dependencies.
-                if (depName === "require") {
-                    args[i] = handlers.require(name);
-                } else if (depName === "exports") {
-                    //CommonJS module spec 1.1
-                    args[i] = handlers.exports(name);
-                    usingExports = true;
-                } else if (depName === "module") {
-                    //CommonJS module spec 1.1
-                    cjsModule = args[i] = handlers.module(name);
-                } else if (hasProp(defined, depName) ||
-                           hasProp(waiting, depName) ||
-                           hasProp(defining, depName)) {
-                    args[i] = callDep(depName);
-                } else if (map.p) {
-                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});
-                    args[i] = defined[depName];
-                } else {
-                    throw new Error(name + ' missing ' + depName);
-                }
-            }
-
-            ret = callback ? callback.apply(defined[name], args) : undefined;
-
-            if (name) {
-                //If setting exports via "module" is in play,
-                //favor that over return value and exports. After that,
-                //favor a non-undefined return value over exports use.
-                if (cjsModule && cjsModule.exports !== undef &&
-                        cjsModule.exports !== defined[name]) {
-                    defined[name] = cjsModule.exports;
-                } else if (ret !== undef || !usingExports) {
-                    //Use the return value from the function.
-                    defined[name] = ret;
-                }
-            }
-        } else if (name) {
-            //May just be an object definition for the module. Only
-            //worry about defining if have a module name.
-            defined[name] = callback;
-        }
-    };
-
-    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {
-        if (typeof deps === "string") {
-            if (handlers[deps]) {
-                //callback in this case is really relName
-                return handlers[deps](callback);
-            }
-            //Just return the module wanted. In this scenario, the
-            //deps arg is the module name, and second arg (if passed)
-            //is just the relName.
-            //Normalize module name, if it contains . or ..
-            return callDep(makeMap(deps, callback).f);
-        } else if (!deps.splice) {
-            //deps is a config object, not an array.
-            config = deps;
-            if (config.deps) {
-                req(config.deps, config.callback);
-            }
-            if (!callback) {
-                return;
-            }
-
-            if (callback.splice) {
-                //callback is an array, which means it is a dependency list.
-                //Adjust args if there are dependencies
-                deps = callback;
-                callback = relName;
-                relName = null;
-            } else {
-                deps = undef;
-            }
-        }
-
-        //Support require(['a'])
-        callback = callback || function () {};
-
-        //If relName is a function, it is an errback handler,
-        //so remove it.
-        if (typeof relName === 'function') {
-            relName = forceSync;
-            forceSync = alt;
-        }
-
-        //Simulate async callback;
-        if (forceSync) {
-            main(undef, deps, callback, relName);
-        } else {
-            //Using a non-zero value because of concern for what old browsers
-            //do, and latest browsers "upgrade" to 4 if lower value is used:
-            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:
-            //If want a value immediately, use require('id') instead -- something
-            //that works in almond on the global level, but not guaranteed and
-            //unlikely to work in other AMD implementations.
-            setTimeout(function () {
-                main(undef, deps, callback, relName);
-            }, 4);
-        }
-
-        return req;
-    };
-
-    /**
-     * Just drops the config on the floor, but returns req in case
-     * the config return value is used.
-     */
-    req.config = function (cfg) {
-        return req(cfg);
-    };
-
-    /**
-     * Expose module registry for debugging and tooling
-     */
-    requirejs._defined = defined;
-
-    define = function (name, deps, callback) {
-
-        //This module may not have dependencies
-        if (!deps.splice) {
-            //deps is not an array, so probably means
-            //an object literal or factory function for
-            //the value. Adjust args.
-            callback = deps;
-            deps = [];
-        }
-
-        if (!hasProp(defined, name) && !hasProp(waiting, name)) {
-            waiting[name] = [name, deps, callback];
-        }
-    };
-
-    define.amd = {
-        jQuery: true
-    };
-}());
-
-S2.requirejs = requirejs;S2.require = require;S2.define = define;
-}
-}());
-S2.define("almond", function(){});
-
-/* global jQuery:false, $:false */
-S2.define('jquery',[],function () {
-  var _$ = jQuery || $;
-
-  if (_$ == null && console && console.error) {
-    console.error(
-      'Select2: An instance of jQuery or a jQuery-compatible library was not ' +
-      'found. Make sure that you are including jQuery before Select2 on your ' +
-      'web page.'
-    );
-  }
-
-  return _$;
-});
-
-S2.define('select2/utils',[
-  'jquery'
-], function ($) {
-  var Utils = {};
-
-  Utils.Extend = function (ChildClass, SuperClass) {
-    var __hasProp = {}.hasOwnProperty;
-
-    function BaseConstructor () {
-      this.constructor = ChildClass;
-    }
-
-    for (var key in SuperClass) {
-      if (__hasProp.call(SuperClass, key)) {
-        ChildClass[key] = SuperClass[key];
-      }
-    }
-
-    BaseConstructor.prototype = SuperClass.prototype;
-    ChildClass.prototype = new BaseConstructor();
-    ChildClass.__super__ = SuperClass.prototype;
-
-    return ChildClass;
-  };
-
-  function getMethods (theClass) {
-    var proto = theClass.prototype;
-
-    var methods = [];
-
-    for (var methodName in proto) {
-      var m = proto[methodName];
-
-      if (typeof m !== 'function') {
-        continue;
-      }
-
-      if (methodName === 'constructor') {
-        continue;
-      }
-
-      methods.push(methodName);
-    }
-
-    return methods;
-  }
-
-  Utils.Decorate = function (SuperClass, DecoratorClass) {
-    var decoratedMethods = getMethods(DecoratorClass);
-    var superMethods = getMethods(SuperClass);
-
-    function DecoratedClass () {
-      var unshift = Array.prototype.unshift;
-
-      var argCount = DecoratorClass.prototype.constructor.length;
-
-      var calledConstructor = SuperClass.prototype.constructor;
-
-      if (argCount > 0) {
-        unshift.call(arguments, SuperClass.prototype.constructor);
-
-        calledConstructor = DecoratorClass.prototype.constructor;
-      }
-
-      calledConstructor.apply(this, arguments);
-    }
-
-    DecoratorClass.displayName = SuperClass.displayName;
-
-    function ctr () {
-      this.constructor = DecoratedClass;
-    }
-
-    DecoratedClass.prototype = new ctr();
-
-    for (var m = 0; m < superMethods.length; m++) {
-        var superMethod = superMethods[m];
-
-        DecoratedClass.prototype[superMethod] =
-          SuperClass.prototype[superMethod];
-    }
-
-    var calledMethod = function (methodName) {
-      // Stub out the original method if it's not decorating an actual method
-      var originalMethod = function () {};
-
-      if (methodName in DecoratedClass.prototype) {
-        originalMethod = DecoratedClass.prototype[methodName];
-      }
-
-      var decoratedMethod = DecoratorClass.prototype[methodName];
-
-      return function () {
-        var unshift = Array.prototype.unshift;
-
-        unshift.call(arguments, originalMethod);
-
-        return decoratedMethod.apply(this, arguments);
-      };
-    };
-
-    for (var d = 0; d < decoratedMethods.length; d++) {
-      var decoratedMethod = decoratedMethods[d];
-
-      DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod);
-    }
-
-    return DecoratedClass;
-  };
-
-  var Observable = function () {
-    this.listeners = {};
-  };
-
-  Observable.prototype.on = function (event, callback) {
-    this.listeners = this.listeners || {};
-
-    if (event in this.listeners) {
-      this.listeners[event].push(callback);
-    } else {
-      this.listeners[event] = [callback];
-    }
-  };
-
-  Observable.prototype.trigger = function (event) {
-    var slice = Array.prototype.slice;
-
-    this.listeners = this.listeners || {};
-
-    if (event in this.listeners) {
-      this.invoke(this.listeners[event], slice.call(arguments, 1));
-    }
-
-    if ('*' in this.listeners) {
-      this.invoke(this.listeners['*'], arguments);
-    }
-  };
-
-  Observable.prototype.invoke = function (listeners, params) {
-    for (var i = 0, len = listeners.length; i < len; i++) {
-      listeners[i].apply(this, params);
-    }
-  };
-
-  Utils.Observable = Observable;
-
-  Utils.generateChars = function (length) {
-    var chars = '';
-
-    for (var i = 0; i < length; i++) {
-      var randomChar = Math.floor(Math.random() * 36);
-      chars += randomChar.toString(36);
-    }
-
-    return chars;
-  };
-
-  Utils.bind = function (func, context) {
-    return function () {
-      func.apply(context, arguments);
-    };
-  };
-
-  Utils._convertData = function (data) {
-    for (var originalKey in data) {
-      var keys = originalKey.split('-');
-
-      var dataLevel = data;
-
-      if (keys.length === 1) {
-        continue;
-      }
-
-      for (var k = 0; k < keys.length; k++) {
-        var key = keys[k];
-
-        // Lowercase the first letter
-        // By default, dash-separated becomes camelCase
-        key = key.substring(0, 1).toLowerCase() + key.substring(1);
-
-        if (!(key in dataLevel)) {
-          dataLevel[key] = {};
-        }
-
-        if (k == keys.length - 1) {
-          dataLevel[key] = data[originalKey];
-        }
-
-        dataLevel = dataLevel[key];
-      }
-
-      delete data[originalKey];
-    }
-
-    return data;
-  };
-
-  Utils.hasScroll = function (index, el) {
-    // Adapted from the function created by @ShadowScripter
-    // and adapted by @BillBarry on the Stack Exchange Code Review website.
-    // The original code can be found at
-    // http://codereview.stackexchange.com/q/13338
-    // and was designed to be used with the Sizzle selector engine.
-
-    var $el = $(el);
-    var overflowX = el.style.overflowX;
-    var overflowY = el.style.overflowY;
-
-    //Check both x and y declarations
-    if (overflowX === overflowY &&
-        (overflowY === 'hidden' || overflowY === 'visible')) {
-      return false;
-    }
-
-    if (overflowX === 'scroll' || overflowY === 'scroll') {
-      return true;
-    }
-
-    return ($el.innerHeight() < el.scrollHeight ||
-      $el.innerWidth() < el.scrollWidth);
-  };
-
-  Utils.escapeMarkup = function (markup) {
-    var replaceMap = {
-      '\\': '&#92;',
-      '&': '&amp;',
-      '<': '&lt;',
-      '>': '&gt;',
-      '"': '&quot;',
-      '\'': '&#39;',
-      '/': '&#47;'
-    };
-
-    // Do not try to escape the markup if it's not a string
-    if (typeof markup !== 'string') {
-      return markup;
-    }
-
-    return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
-      return replaceMap[match];
-    });
-  };
-
-  // Append an array of jQuery nodes to a given element.
-  Utils.appendMany = function ($element, $nodes) {
-    // jQuery 1.7.x does not support $.fn.append() with an array
-    // Fall back to a jQuery object collection using $.fn.add()
-    if ($.fn.jquery.substr(0, 3) === '1.7') {
-      var $jqNodes = $();
-
-      $.map($nodes, function (node) {
-        $jqNodes = $jqNodes.add(node);
-      });
-
-      $nodes = $jqNodes;
-    }
-
-    $element.append($nodes);
-  };
-
-  return Utils;
-});
-
-S2.define('select2/results',[
-  'jquery',
-  './utils'
-], function ($, Utils) {
-  function Results ($element, options, dataAdapter) {
-    this.$element = $element;
-    this.data = dataAdapter;
-    this.options = options;
-
-    Results.__super__.constructor.call(this);
-  }
-
-  Utils.Extend(Results, Utils.Observable);
-
-  Results.prototype.render = function () {
-    var $results = $(
-      '<ul class="select2-results__options" role="tree"></ul>'
-    );
-
-    if (this.options.get('multiple')) {
-      $results.attr('aria-multiselectable', 'true');
-    }
-
-    this.$results = $results;
-
-    return $results;
-  };
-
-  Results.prototype.clear = function () {
-    this.$results.empty();
-  };
-
-  Results.prototype.displayMessage = function (params) {
-    var escapeMarkup = this.options.get('escapeMarkup');
-
-    this.clear();
-    this.hideLoading();
-
-    var $message = $(
-      '<li role="treeitem" class="select2-results__option"></li>'
-    );
-
-    var message = this.options.get('translations').get(params.message);
-
-    $message.append(
-      escapeMarkup(
-        message(params.args)
-      )
-    );
-
-    this.$results.append($message);
-  };
-
-  Results.prototype.append = function (data) {
-    this.hideLoading();
-
-    var $options = [];
-
-    if (data.results == null || data.results.length === 0) {
-      if (this.$results.children().length === 0) {
-        this.trigger('results:message', {
-          message: 'noResults'
-        });
-      }
-
-      return;
-    }
-
-    data.results = this.sort(data.results);
-
-    for (var d = 0; d < data.results.length; d++) {
-      var item = data.results[d];
-
-      var $option = this.option(item);
-
-      $options.push($option);
-    }
-
-    this.$results.append($options);
-  };
-
-  Results.prototype.position = function ($results, $dropdown) {
-    var $resultsContainer = $dropdown.find('.select2-results');
-    $resultsContainer.append($results);
-  };
-
-  Results.prototype.sort = function (data) {
-    var sorter = this.options.get('sorter');
-
-    return sorter(data);
-  };
-
-  Results.prototype.setClasses = function () {
-    var self = this;
-
-    this.data.current(function (selected) {
-      var selectedIds = $.map(selected, function (s) {
-        return s.id.toString();
-      });
-
-      var $options = self.$results
-        .find('.select2-results__option[aria-selected]');
-
-      $options.each(function () {
-        var $option = $(this);
-
-        var item = $.data(this, 'data');
-
-        // id needs to be converted to a string when comparing
-        var id = '' + item.id;
-
-        if ((item.element != null && item.element.selected) ||
-            (item.element == null && $.inArray(id, selectedIds) > -1)) {
-          $option.attr('aria-selected', 'true');
-        } else {
-          $option.attr('aria-selected', 'false');
-        }
-      });
-
-      var $selected = $options.filter('[aria-selected=true]');
-
-      // Check if there are any selected options
-      if ($selected.length > 0) {
-        // If there are selected options, highlight the first
-        $selected.first().trigger('mouseenter');
-      } else {
-        // If there are no selected options, highlight the first option
-        // in the dropdown
-        $options.first().trigger('mouseenter');
-      }
-    });
-  };
-
-  Results.prototype.showLoading = function (params) {
-    this.hideLoading();
-
-    var loadingMore = this.options.get('translations').get('searching');
-
-    var loading = {
-      disabled: true,
-      loading: true,
-      text: loadingMore(params)
-    };
-    var $loading = this.option(loading);
-    $loading.className += ' loading-results';
-
-    this.$results.prepend($loading);
-  };
-
-  Results.prototype.hideLoading = function () {
-    this.$results.find('.loading-results').remove();
-  };
-
-  Results.prototype.option = function (data) {
-    var option = document.createElement('li');
-    option.className = 'select2-results__option';
-
-    var attrs = {
-      'role': 'treeitem',
-      'aria-selected': 'false'
-    };
-
-    if (data.disabled) {
-      delete attrs['aria-selected'];
-      attrs['aria-disabled'] = 'true';
-    }
-
-    if (data.id == null) {
-      delete attrs['aria-selected'];
-    }
-
-    if (data._resultId != null) {
-      option.id = data._resultId;
-    }
-
-    if (data.title) {
-      option.title = data.title;
-    }
-
-    if (data.children) {
-      attrs.role = 'group';
-      attrs['aria-label'] = data.text;
-      delete attrs['aria-selected'];
-    }
-
-    for (var attr in attrs) {
-      var val = attrs[attr];
-
-      option.setAttribute(attr, val);
-    }
-
-    if (data.children) {
-      var $option = $(option);
-
-      var label = document.createElement('strong');
-      label.className = 'select2-results__group';
-
-      var $label = $(label);
-      this.template(data, label);
-
-      var $children = [];
-
-      for (var c = 0; c < data.children.length; c++) {
-        var child = data.children[c];
-
-        var $child = this.option(child);
-
-        $children.push($child);
-      }
-
-      var $childrenContainer = $('<ul></ul>', {
-        'class': 'select2-results__options select2-results__options--nested'
-      });
-
-      $childrenContainer.append($children);
-
-      $option.append(label);
-      $option.append($childrenContainer);
-    } else {
-      this.template(data, option);
-    }
-
-    $.data(option, 'data', data);
-
-    return option;
-  };
-
-  Results.prototype.bind = function (container, $container) {
-    var self = this;
-
-    var id = container.id + '-results';
-
-    this.$results.attr('id', id);
-
-    container.on('results:all', function (params) {
-      self.clear();
-      self.append(params.data);
-
-      if (container.isOpen()) {
-        self.setClasses();
-      }
-    });
-
-    container.on('results:append', function (params) {
-      self.append(params.data);
-
-      if (container.isOpen()) {
-        self.setClasses();
-      }
-    });
-
-    container.on('query', function (params) {
-      self.showLoading(params);
-    });
-
-    container.on('select', function () {
-      if (!container.isOpen()) {
-        return;
-      }
-
-      self.setClasses();
-    });
-
-    container.on('unselect', function () {
-      if (!container.isOpen()) {
-        return;
-      }
-
-      self.setClasses();
-    });
-
-    container.on('open', function () {
-      // When the dropdown is open, aria-expended="true"
-      self.$results.attr('aria-expanded', 'true');
-      self.$results.attr('aria-hidden', 'false');
-
-      self.setClasses();
-      self.ensureHighlightVisible();
-    });
-
-    container.on('close', function () {
-      // When the dropdown is closed, aria-expended="false"
-      self.$results.attr('aria-expanded', 'false');
-      self.$results.attr('aria-hidden', 'true');
-      self.$results.removeAttr('aria-activedescendant');
-    });
-
-    container.on('results:toggle', function () {
-      var $highlighted = self.getHighlightedResults();
-
-      if ($highlighted.length === 0) {
-        return;
-      }
-
-      $highlighted.trigger('mouseup');
-    });
-
-    container.on('results:select', function () {
-      var $highlighted = self.getHighlightedResults();
-
-      if ($highlighted.length === 0) {
-        return;
-      }
-
-      var data = $highlighted.data('data');
-
-      if ($highlighted.attr('aria-selected') == 'true') {
-        self.trigger('close');
-      } else {
-        self.trigger('select', {
-          data: data
-        });
-      }
-    });
-
-    container.on('results:previous', function () {
-      var $highlighted = self.getHighlightedResults();
-
-      var $options = self.$results.find('[aria-selected]');
-
-      var currentIndex = $options.index($highlighted);
-
-      // If we are already at te top, don't move further
-      if (currentIndex === 0) {
-        return;
-      }
-
-      var nextIndex = currentIndex - 1;
-
-      // If none are highlighted, highlight the first
-      if ($highlighted.length === 0) {
-        nextIndex = 0;
-      }
-
-      var $next = $options.eq(nextIndex);
-
-      $next.trigger('mouseenter');
-
-      var currentOffset = self.$results.offset().top;
-      var nextTop = $next.offset().top;
-      var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset);
-
-      if (nextIndex === 0) {
-        self.$results.scrollTop(0);
-      } else if (nextTop - currentOffset < 0) {
-        self.$results.scrollTop(nextOffset);
-      }
-    });
-
-    container.on('results:next', function () {
-      var $highlighted = self.getHighlightedResults();
-
-      var $options = self.$results.find('[aria-selected]');
-
-      var currentIndex = $options.index($highlighted);
-
-      var nextIndex = currentIndex + 1;
-
-      // If we are at the last option, stay there
-      if (nextIndex >= $options.length) {
-        return;
-      }
-
-      var $next = $options.eq(nextIndex);
-
-      $next.trigger('mouseenter');
-
-      var currentOffset = self.$results.offset().top +
-        self.$results.outerHeight(false);
-      var nextBottom = $next.offset().top + $next.outerHeight(false);
-      var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset;
-
-      if (nextIndex === 0) {
-        self.$results.scrollTop(0);
-      } else if (nextBottom > currentOffset) {
-        self.$results.scrollTop(nextOffset);
-      }
-    });
-
-    container.on('results:focus', function (params) {
-      params.element.addClass('select2-results__option--highlighted');
-    });
-
-    container.on('results:message', function (params) {
-      self.displayMessage(params);
-    });
-
-    if ($.fn.mousewheel) {
-      this.$results.on('mousewheel', function (e) {
-        var top = self.$results.scrollTop();
-
-        var bottom = (
-          self.$results.get(0).scrollHeight -
-          self.$results.scrollTop() +
-          e.deltaY
-        );
-
-        var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;
-        var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();
-
-        if (isAtTop) {
-          self.$results.scrollTop(0);
-
-          e.preventDefault();
-          e.stopPropagation();
-        } else if (isAtBottom) {
-          self.$results.scrollTop(
-            self.$results.get(0).scrollHeight - self.$results.height()
-          );
-
-          e.preventDefault();
-          e.stopPropagation();
-        }
-      });
-    }
-
-    this.$results.on('mouseup', '.select2-results__option[aria-selected]',
-      function (evt) {
-      var $this = $(this);
-
-      var data = $this.data('data');
-
-      if ($this.attr('aria-selected') === 'true') {
-        if (self.options.get('multiple')) {
-          self.trigger('unselect', {
-            originalEvent: evt,
-            data: data
-          });
-        } else {
-          self.trigger('close');
-        }
-
-        return;
-      }
-
-      self.trigger('select', {
-        originalEvent: evt,
-        data: data
-      });
-    });
-
-    this.$results.on('mouseenter', '.select2-results__option[aria-selected]',
-      function (evt) {
-      var data = $(this).data('data');
-
-      self.getHighlightedResults()
-          .removeClass('select2-results__option--highlighted');
-
-      self.trigger('results:focus', {
-        data: data,
-        element: $(this)
-      });
-    });
-  };
-
-  Results.prototype.getHighlightedResults = function () {
-    var $highlighted = this.$results
-    .find('.select2-results__option--highlighted');
-
-    return $highlighted;
-  };
-
-  Results.prototype.destroy = function () {
-    this.$results.remove();
-  };
-
-  Results.prototype.ensureHighlightVisible = function () {
-    var $highlighted = this.getHighlightedResults();
-
-    if ($highlighted.length === 0) {
-      return;
-    }
-
-    var $options = this.$results.find('[aria-selected]');
-
-    var currentIndex = $options.index($highlighted);
-
-    var currentOffset = this.$results.offset().top;
-    var nextTop = $highlighted.offset().top;
-    var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset);
-
-    var offsetDelta = nextTop - currentOffset;
-    nextOffset -= $highlighted.outerHeight(false) * 2;
-
-    if (currentIndex <= 2) {
-      this.$results.scrollTop(0);
-    } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) {
-      this.$results.scrollTop(nextOffset);
-    }
-  };
-
-  Results.prototype.template = function (result, container) {
-    var template = this.options.get('templateResult');
-    var escapeMarkup = this.options.get('escapeMarkup');
-
-    var content = template(result);
-
-    if (content == null) {
-      container.style.display = 'none';
-    } else if (typeof content === 'string') {
-      container.innerHTML = escapeMarkup(content);
-    } else {
-      $(container).append(content);
-    }
-  };
-
-  return Results;
-});
-
-S2.define('select2/keys',[
-
-], function () {
-  var KEYS = {
-    BACKSPACE: 8,
-    TAB: 9,
-    ENTER: 13,
-    SHIFT: 16,
-    CTRL: 17,
-    ALT: 18,
-    ESC: 27,
-    SPACE: 32,
-    PAGE_UP: 33,
-    PAGE_DOWN: 34,
-    END: 35,
-    HOME: 36,
-    LEFT: 37,
-    UP: 38,
-    RIGHT: 39,
-    DOWN: 40,
-    DELETE: 46
-  };
-
-  return KEYS;
-});
-
-S2.define('select2/selection/base',[
-  'jquery',
-  '../utils',
-  '../keys'
-], function ($, Utils, KEYS) {
-  function BaseSelection ($element, options) {
-    this.$element = $element;
-    this.options = options;
-
-    BaseSelection.__super__.constructor.call(this);
-  }
-
-  Utils.Extend(BaseSelection, Utils.Observable);
-
-  BaseSelection.prototype.render = function () {
-    var $selection = $(
-      '<span class="select2-selection" role="combobox" ' +
-      'aria-autocomplete="list" aria-haspopup="true" aria-expanded="false">' +
-      '</span>'
-    );
-
-    this._tabindex = 0;
-
-    if (this.$element.data('old-tabindex') != null) {
-      this._tabindex = this.$element.data('old-tabindex');
-    } else if (this.$element.attr('tabindex') != null) {
-      this._tabindex = this.$element.attr('tabindex');
-    }
-
-    $selection.attr('title', this.$element.attr('title'));
-    $selection.attr('tabindex', this._tabindex);
-
-    this.$selection = $selection;
-
-    return $selection;
-  };
-
-  BaseSelection.prototype.bind = function (container, $container) {
-    var self = this;
-
-    var id = container.id + '-container';
-    var resultsId = container.id + '-results';
-
-    this.container = container;
-
-    this.$selection.on('focus', function (evt) {
-      self.trigger('focus', evt);
-    });
-
-    this.$selection.on('blur', function (evt) {
-      self.trigger('blur', evt);
-    });
-
-    this.$selection.on('keydown', function (evt) {
-      self.trigger('keypress', evt);
-
-      if (evt.which === KEYS.SPACE) {
-        evt.preventDefault();
-      }
-    });
-
-    container.on('results:focus', function (params) {
-      self.$selection.attr('aria-activedescendant', params.data._resultId);
-    });
-
-    container.on('selection:update', function (params) {
-      self.update(params.data);
-    });
-
-    container.on('open', function () {
-      // When the dropdown is open, aria-expanded="true"
-      self.$selection.attr('aria-expanded', 'true');
-      self.$selection.attr('aria-owns', resultsId);
-
-      self._attachCloseHandler(container);
-    });
-
-    container.on('close', function () {
-      // When the dropdown is closed, aria-expanded="false"
-      self.$selection.attr('aria-expanded', 'false');
-      self.$selection.removeAttr('aria-activedescendant');
-      self.$selection.removeAttr('aria-owns');
-
-      self.$selection.focus();
-
-      self._detachCloseHandler(container);
-    });
-
-    container.on('enable', function () {
-      self.$selection.attr('tabindex', self._tabindex);
-    });
-
-    container.on('disable', function () {
-      self.$selection.attr('tabindex', '-1');
-    });
-  };
-
-  BaseSelection.prototype._attachCloseHandler = function (container) {
-    var self = this;
-
-    $(document.body).on('mousedown.select2.' + container.id, function (e) {
-      var $target = $(e.target);
-
-      var $select = $target.closest('.select2');
-
-      var $all = $('.select2.select2-container--open');
-
-      $all.each(function () {
-        var $this = $(this);
-
-        if (this == $select[0]) {
-          return;
-        }
-
-        var $element = $this.data('element');
-
-        $element.select2('close');
-      });
-    });
-  };
-
-  BaseSelection.prototype._detachCloseHandler = function (container) {
-    $(document.body).off('mousedown.select2.' + container.id);
-  };
-
-  BaseSelection.prototype.position = function ($selection, $container) {
-    var $selectionContainer = $container.find('.selection');
-    $selectionContainer.append($selection);
-  };
-
-  BaseSelection.prototype.destroy = function () {
-    this._detachCloseHandler(this.container);
-  };
-
-  BaseSelection.prototype.update = function (data) {
-    throw new Error('The `update` method must be defined in child classes.');
-  };
-
-  return BaseSelection;
-});
-
-S2.define('select2/selection/single',[
-  'jquery',
-  './base',
-  '../utils',
-  '../keys'
-], function ($, BaseSelection, Utils, KEYS) {
-  function SingleSelection () {
-    SingleSelection.__super__.constructor.apply(this, arguments);
-  }
-
-  Utils.Extend(SingleSelection, BaseSelection);
-
-  SingleSelection.prototype.render = function () {
-    var $selection = SingleSelection.__super__.render.call(this);
-
-    $selection.addClass('select2-selection--single');
-
-    $selection.html(
-      '<span class="select2-selection__rendered"></span>' +
-      '<span class="select2-selection__arrow" role="presentation">' +
-        '<b role="presentation"></b>' +
-      '</span>'
-    );
-
-    return $selection;
-  };
-
-  SingleSelection.prototype.bind = function (container, $container) {
-    var self = this;
-
-    SingleSelection.__super__.bind.apply(this, arguments);
-
-    var id = container.id + '-container';
-
-    this.$selection.find('.select2-selection__rendered').attr('id', id);
-    this.$selection.attr('aria-labelledby', id);
-
-    this.$selection.on('mousedown', function (evt) {
-      // Only respond to left clicks
-      if (evt.which !== 1) {
-        return;
-      }
-
-      self.trigger('toggle', {
-        originalEvent: evt
-      });
-    });
-
-    this.$selection.on('focus', function (evt) {
-      // User focuses on the container
-    });
-
-    this.$selection.on('blur', function (evt) {
-      // User exits the container
-    });
-
-    container.on('selection:update', function (params) {
-      self.update(params.data);
-    });
-  };
-
-  SingleSelection.prototype.clear = function () {
-    this.$selection.find('.select2-selection__rendered').empty();
-  };
-
-  SingleSelection.prototype.display = function (data) {
-    var template = this.options.get('templateSelection');
-    var escapeMarkup = this.options.get('escapeMarkup');
-
-    return escapeMarkup(template(data));
-  };
-
-  SingleSelection.prototype.selectionContainer = function () {
-    return $('<span></span>');
-  };
-
-  SingleSelection.prototype.update = function (data) {
-    if (data.length === 0) {
-      this.clear();
-      return;
-    }
-
-    var selection = data[0];
-
-    var formatted = this.display(selection);
-
-    var $rendered = this.$selection.find('.select2-selection__rendered');
-    $rendered.empty().append(formatted);
-    $rendered.prop('title', selection.title || selection.text);
-  };
-
-  return SingleSelection;
-});
-
-S2.define('select2/selection/multiple',[
-  'jquery',
-  './base',
-  '../utils'
-], function ($, BaseSelection, Utils) {
-  function MultipleSelection ($element, options) {
-    MultipleSelection.__super__.constructor.apply(this, arguments);
-  }
-
-  Utils.Extend(MultipleSelection, BaseSelection);
-
-  MultipleSelection.prototype.render = function () {
-    var $selection = MultipleSelection.__super__.render.call(this);
-
-    $selection.addClass('select2-selection--multiple');
-
-    $selection.html(
-      '<ul class="select2-selection__rendered"></ul>'
-    );
-
-    return $selection;
-  };
-
-  MultipleSelection.prototype.bind = function (container, $container) {
-    var self = this;
-
-    MultipleSelection.__super__.bind.apply(this, arguments);
-
-    this.$selection.on('click', function (evt) {
-      self.trigger('toggle', {
-        originalEvent: evt
-      });
-    });
-
-    this.$selection.on('click', '.select2-selection__choice__remove',
-      function (evt) {
-      var $remove = $(this);
-      var $selection = $remove.parent();
-
-      var data = $selection.data('data');
-
-      self.trigger('unselect', {
-        originalEvent: evt,
-        data: data
-      });
-    });
-  };
-
-  MultipleSelection.prototype.clear = function () {
-    this.$selection.find('.select2-selection__rendered').empty();
-  };
-
-  MultipleSelection.prototype.display = function (data) {
-    var template = this.options.get('templateSelection');
-    var escapeMarkup = this.options.get('escapeMarkup');
-
-    return escapeMarkup(template(data));
-  };
-
-  MultipleSelection.prototype.selectionContainer = function () {
-    var $container = $(
-      '<li class="select2-selection__choice">' +
-        '<span class="select2-selection__choice__remove" role="presentation">' +
-          '&times;' +
-        '</span>' +
-      '</li>'
-    );
-
-    return $container;
-  };
-
-  MultipleSelection.prototype.update = function (data) {
-    this.clear();
-
-    if (data.length === 0) {
-      return;
-    }
-
-    var $selections = [];
-
-    for (var d = 0; d < data.length; d++) {
-      var selection = data[d];
-
-      var formatted = this.display(selection);
-      var $selection = this.selectionContainer();
-
-      $selection.append(formatted);
-      $selection.prop('title', selection.title || selection.text);
-
-      $selection.data('data', selection);
-
-      $selections.push($selection);
-    }
-
-    var $rendered = this.$selection.find('.select2-selection__rendered');
-
-    Utils.appendMany($rendered, $selections);
-  };
-
-  return MultipleSelection;
-});
-
-S2.define('select2/selection/placeholder',[
-  '../utils'
-], function (Utils) {
-  function Placeholder (decorated, $element, options) {
-    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
-
-    decorated.call(this, $element, options);
-  }
-
-  Placeholder.prototype.normalizePlaceholder = function (_, placeholder) {
-    if (typeof placeholder === 'string') {
-      placeholder = {
-        id: '',
-        text: placeholder
-      };
-    }
-
-    return placeholder;
-  };
-
-  Placeholder.prototype.createPlaceholder = function (decorated, placeholder) {
-    var $placeholder = this.selectionContainer();
-
-    $placeholder.html(this.display(placeholder));
-    $placeholder.addClass('select2-selection__placeholder')
-                .removeClass('select2-selection__choice');
-
-    return $placeholder;
-  };
-
-  Placeholder.prototype.update = function (decorated, data) {
-    var singlePlaceholder = (
-      data.length == 1 && data[0].id != this.placeholder.id
-    );
-    var multipleSelections = data.length > 1;
-
-    if (multipleSelections || singlePlaceholder) {
-      return decorated.call(this, data);
-    }
-
-    this.clear();
-
-    var $placeholder = this.createPlaceholder(this.placeholder);
-
-    this.$selection.find('.select2-selection__rendered').append($placeholder);
-  };
-
-  return Placeholder;
-});
-
-S2.define('select2/selection/allowClear',[
-  'jquery',
-  '../keys'
-], function ($, KEYS) {
-  function AllowClear () { }
-
-  AllowClear.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-
-    decorated.call(this, container, $container);
-
-    if (this.placeholder == null) {
-      if (this.options.get('debug') && window.console && console.error) {
-        console.error(
-          'Select2: The `allowClear` option should be used in combination ' +
-          'with the `placeholder` option.'
-        );
-      }
-    }
-
-    this.$selection.on('mousedown', '.select2-selection__clear',
-      function (evt) {
-        self._handleClear(evt);
-    });
-
-    container.on('keypress', function (evt) {
-      self._handleKeyboardClear(evt, container);
-    });
-  };
-
-  AllowClear.prototype._handleClear = function (_, evt) {
-    // Ignore the event if it is disabled
-    if (this.options.get('disabled')) {
-      return;
-    }
-
-    var $clear = this.$selection.find('.select2-selection__clear');
-
-    // Ignore the event if nothing has been selected
-    if ($clear.length === 0) {
-      return;
-    }
-
-    evt.stopPropagation();
-
-    var data = $clear.data('data');
-
-    for (var d = 0; d < data.length; d++) {
-      var unselectData = {
-        data: data[d]
-      };
-
-      // Trigger the `unselect` event, so people can prevent it from being
-      // cleared.
-      this.trigger('unselect', unselectData);
-
-      // If the event was prevented, don't clear it out.
-      if (unselectData.prevented) {
-        return;
-      }
-    }
-
-    this.$element.val(this.placeholder.id).trigger('change');
-
-    this.trigger('toggle');
-  };
-
-  AllowClear.prototype._handleKeyboardClear = function (_, evt, container) {
-    if (container.isOpen()) {
-      return;
-    }
-
-    if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) {
-      this._handleClear(evt);
-    }
-  };
-
-  AllowClear.prototype.update = function (decorated, data) {
-    decorated.call(this, data);
-
-    if (this.$selection.find('.select2-selection__placeholder').length > 0 ||
-        data.length === 0) {
-      return;
-    }
-
-    var $remove = $(
-      '<span class="select2-selection__clear">' +
-        '&times;' +
-      '</span>'
-    );
-    $remove.data('data', data);
-
-    this.$selection.find('.select2-selection__rendered').prepend($remove);
-  };
-
-  return AllowClear;
-});
-
-S2.define('select2/selection/search',[
-  'jquery',
-  '../utils',
-  '../keys'
-], function ($, Utils, KEYS) {
-  function Search (decorated, $element, options) {
-    decorated.call(this, $element, options);
-  }
-
-  Search.prototype.render = function (decorated) {
-    var $search = $(
-      '<li class="select2-search select2-search--inline">' +
-        '<input class="select2-search__field" type="search" tabindex="-1"' +
-        ' autocomplete="off" autocorrect="off" autocapitalize="off"' +
-        ' spellcheck="false" role="textbox" />' +
-      '</li>'
-    );
-
-    this.$searchContainer = $search;
-    this.$search = $search.find('input');
-
-    var $rendered = decorated.call(this);
-
-    return $rendered;
-  };
-
-  Search.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-
-    decorated.call(this, container, $container);
-
-    container.on('open', function () {
-      self.$search.attr('tabindex', 0);
-
-      self.$search.focus();
-    });
-
-    container.on('close', function () {
-      self.$search.attr('tabindex', -1);
-
-      self.$search.val('');
-      self.$search.focus();
-    });
-
-    container.on('enable', function () {
-      self.$search.prop('disabled', false);
-    });
-
-    container.on('disable', function () {
-      self.$search.prop('disabled', true);
-    });
-
-    this.$selection.on('focusin', '.select2-search--inline', function (evt) {
-      self.trigger('focus', evt);
-    });
-
-    this.$selection.on('focusout', '.select2-search--inline', function (evt) {
-      self.trigger('blur', evt);
-    });
-
-    this.$selection.on('keydown', '.select2-search--inline', function (evt) {
-      evt.stopPropagation();
-
-      self.trigger('keypress', evt);
-
-      self._keyUpPrevented = evt.isDefaultPrevented();
-
-      var key = evt.which;
-
-      if (key === KEYS.BACKSPACE && self.$search.val() === '') {
-        var $previousChoice = self.$searchContainer
-          .prev('.select2-selection__choice');
-
-        if ($previousChoice.length > 0) {
-          var item = $previousChoice.data('data');
-
-          self.searchRemoveChoice(item);
-
-          evt.preventDefault();
-        }
-      }
-    });
-
-    // Workaround for browsers which do not support the `input` event
-    // This will prevent double-triggering of events for browsers which support
-    // both the `keyup` and `input` events.
-    this.$selection.on('input', '.select2-search--inline', function (evt) {
-      // Unbind the duplicated `keyup` event
-      self.$selection.off('keyup.search');
-    });
-
-    this.$selection.on('keyup.search input', '.select2-search--inline',
-        function (evt) {
-      self.handleSearch(evt);
-    });
-  };
-
-  Search.prototype.createPlaceholder = function (decorated, placeholder) {
-    this.$search.attr('placeholder', placeholder.text);
-  };
-
-  Search.prototype.update = function (decorated, data) {
-    this.$search.attr('placeholder', '');
-
-    decorated.call(this, data);
-
-    this.$selection.find('.select2-selection__rendered')
-                   .append(this.$searchContainer);
-
-    this.resizeSearch();
-  };
-
-  Search.prototype.handleSearch = function () {
-    this.resizeSearch();
-
-    if (!this._keyUpPrevented) {
-      var input = this.$search.val();
-
-      this.trigger('query', {
-        term: input
-      });
-    }
-
-    this._keyUpPrevented = false;
-  };
-
-  Search.prototype.searchRemoveChoice = function (decorated, item) {
-    this.trigger('unselect', {
-      data: item
-    });
-
-    this.trigger('open');
-
-    this.$search.val(item.text + ' ');
-  };
-
-  Search.prototype.resizeSearch = function () {
-    this.$search.css('width', '25px');
-
-    var width = '';
-
-    if (this.$search.attr('placeholder') !== '') {
-      width = this.$selection.find('.select2-selection__rendered').innerWidth();
-    } else {
-      var minimumWidth = this.$search.val().length + 1;
-
-      width = (minimumWidth * 0.75) + 'em';
-    }
-
-    this.$search.css('width', width);
-  };
-
-  return Search;
-});
-
-S2.define('select2/selection/eventRelay',[
-  'jquery'
-], function ($) {
-  function EventRelay () { }
-
-  EventRelay.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-    var relayEvents = [
-      'open', 'opening',
-      'close', 'closing',
-      'select', 'selecting',
-      'unselect', 'unselecting'
-    ];
-
-    var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting'];
-
-    decorated.call(this, container, $container);
-
-    container.on('*', function (name, params) {
-      // Ignore events that should not be relayed
-      if ($.inArray(name, relayEvents) === -1) {
-        return;
-      }
-
-      // The parameters should always be an object
-      params = params || {};
-
-      // Generate the jQuery event for the Select2 event
-      var evt = $.Event('select2:' + name, {
-        params: params
-      });
-
-      self.$element.trigger(evt);
-
-      // Only handle preventable events if it was one
-      if ($.inArray(name, preventableEvents) === -1) {
-        return;
-      }
-
-      params.prevented = evt.isDefaultPrevented();
-    });
-  };
-
-  return EventRelay;
-});
-
-S2.define('select2/translation',[
-  'jquery',
-  'require'
-], function ($, require) {
-  function Translation (dict) {
-    this.dict = dict || {};
-  }
-
-  Translation.prototype.all = function () {
-    return this.dict;
-  };
-
-  Translation.prototype.get = function (key) {
-    return this.dict[key];
-  };
-
-  Translation.prototype.extend = function (translation) {
-    this.dict = $.extend({}, translation.all(), this.dict);
-  };
-
-  // Static functions
-
-  Translation._cache = {};
-
-  Translation.loadPath = function (path) {
-    if (!(path in Translation._cache)) {
-      var translations = require(path);
-
-      Translation._cache[path] = translations;
-    }
-
-    return new Translation(Translation._cache[path]);
-  };
-
-  return Translation;
-});
-
-S2.define('select2/diacritics',[
-
-], function () {
-  var diacritics = {
-    '\u24B6': 'A',
-    '\uFF21': 'A',
-    '\u00C0': 'A',
-    '\u00C1': 'A',
-    '\u00C2': 'A',
-    '\u1EA6': 'A',
-    '\u1EA4': 'A',
-    '\u1EAA': 'A',
-    '\u1EA8': 'A',
-    '\u00C3': 'A',
-    '\u0100': 'A',
-    '\u0102': 'A',
-    '\u1EB0': 'A',
-    '\u1EAE': 'A',
-    '\u1EB4': 'A',
-    '\u1EB2': 'A',
-    '\u0226': 'A',
-    '\u01E0': 'A',
-    '\u00C4': 'A',
-    '\u01DE': 'A',
-    '\u1EA2': 'A',
-    '\u00C5': 'A',
-    '\u01FA': 'A',
-    '\u01CD': 'A',
-    '\u0200': 'A',
-    '\u0202': 'A',
-    '\u1EA0': 'A',
-    '\u1EAC': 'A',
-    '\u1EB6': 'A',
-    '\u1E00': 'A',
-    '\u0104': 'A',
-    '\u023A': 'A',
-    '\u2C6F': 'A',
-    '\uA732': 'AA',
-    '\u00C6': 'AE',
-    '\u01FC': 'AE',
-    '\u01E2': 'AE',
-    '\uA734': 'AO',
-    '\uA736': 'AU',
-    '\uA738': 'AV',
-    '\uA73A': 'AV',
-    '\uA73C': 'AY',
-    '\u24B7': 'B',
-    '\uFF22': 'B',
-    '\u1E02': 'B',
-    '\u1E04': 'B',
-    '\u1E06': 'B',
-    '\u0243': 'B',
-    '\u0182': 'B',
-    '\u0181': 'B',
-    '\u24B8': 'C',
-    '\uFF23': 'C',
-    '\u0106': 'C',
-    '\u0108': 'C',
-    '\u010A': 'C',
-    '\u010C': 'C',
-    '\u00C7': 'C',
-    '\u1E08': 'C',
-    '\u0187': 'C',
-    '\u023B': 'C',
-    '\uA73E': 'C',
-    '\u24B9': 'D',
-    '\uFF24': 'D',
-    '\u1E0A': 'D',
-    '\u010E': 'D',
-    '\u1E0C': 'D',
-    '\u1E10': 'D',
-    '\u1E12': 'D',
-    '\u1E0E': 'D',
-    '\u0110': 'D',
-    '\u018B': 'D',
-    '\u018A': 'D',
-    '\u0189': 'D',
-    '\uA779': 'D',
-    '\u01F1': 'DZ',
-    '\u01C4': 'DZ',
-    '\u01F2': 'Dz',
-    '\u01C5': 'Dz',
-    '\u24BA': 'E',
-    '\uFF25': 'E',
-    '\u00C8': 'E',
-    '\u00C9': 'E',
-    '\u00CA': 'E',
-    '\u1EC0': 'E',
-    '\u1EBE': 'E',
-    '\u1EC4': 'E',
-    '\u1EC2': 'E',
-    '\u1EBC': 'E',
-    '\u0112': 'E',
-    '\u1E14': 'E',
-    '\u1E16': 'E',
-    '\u0114': 'E',
-    '\u0116': 'E',
-    '\u00CB': 'E',
-    '\u1EBA': 'E',
-    '\u011A': 'E',
-    '\u0204': 'E',
-    '\u0206': 'E',
-    '\u1EB8': 'E',
-    '\u1EC6': 'E',
-    '\u0228': 'E',
-    '\u1E1C': 'E',
-    '\u0118': 'E',
-    '\u1E18': 'E',
-    '\u1E1A': 'E',
-    '\u0190': 'E',
-    '\u018E': 'E',
-    '\u24BB': 'F',
-    '\uFF26': 'F',
-    '\u1E1E': 'F',
-    '\u0191': 'F',
-    '\uA77B': 'F',
-    '\u24BC': 'G',
-    '\uFF27': 'G',
-    '\u01F4': 'G',
-    '\u011C': 'G',
-    '\u1E20': 'G',
-    '\u011E': 'G',
-    '\u0120': 'G',
-    '\u01E6': 'G',
-    '\u0122': 'G',
-    '\u01E4': 'G',
-    '\u0193': 'G',
-    '\uA7A0': 'G',
-    '\uA77D': 'G',
-    '\uA77E': 'G',
-    '\u24BD': 'H',
-    '\uFF28': 'H',
-    '\u0124': 'H',
-    '\u1E22': 'H',
-    '\u1E26': 'H',
-    '\u021E': 'H',
-    '\u1E24': 'H',
-    '\u1E28': 'H',
-    '\u1E2A': 'H',
-    '\u0126': 'H',
-    '\u2C67': 'H',
-    '\u2C75': 'H',
-    '\uA78D': 'H',
-    '\u24BE': 'I',
-    '\uFF29': 'I',
-    '\u00CC': 'I',
-    '\u00CD': 'I',
-    '\u00CE': 'I',
-    '\u0128': 'I',
-    '\u012A': 'I',
-    '\u012C': 'I',
-    '\u0130': 'I',
-    '\u00CF': 'I',
-    '\u1E2E': 'I',
-    '\u1EC8': 'I',
-    '\u01CF': 'I',
-    '\u0208': 'I',
-    '\u020A': 'I',
-    '\u1ECA': 'I',
-    '\u012E': 'I',
-    '\u1E2C': 'I',
-    '\u0197': 'I',
-    '\u24BF': 'J',
-    '\uFF2A': 'J',
-    '\u0134': 'J',
-    '\u0248': 'J',
-    '\u24C0': 'K',
-    '\uFF2B': 'K',
-    '\u1E30': 'K',
-    '\u01E8': 'K',
-    '\u1E32': 'K',
-    '\u0136': 'K',
-    '\u1E34': 'K',
-    '\u0198': 'K',
-    '\u2C69': 'K',
-    '\uA740': 'K',
-    '\uA742': 'K',
-    '\uA744': 'K',
-    '\uA7A2': 'K',
-    '\u24C1': 'L',
-    '\uFF2C': 'L',
-    '\u013F': 'L',
-    '\u0139': 'L',
-    '\u013D': 'L',
-    '\u1E36': 'L',
-    '\u1E38': 'L',
-    '\u013B': 'L',
-    '\u1E3C': 'L',
-    '\u1E3A': 'L',
-    '\u0141': 'L',
-    '\u023D': 'L',
-    '\u2C62': 'L',
-    '\u2C60': 'L',
-    '\uA748': 'L',
-    '\uA746': 'L',
-    '\uA780': 'L',
-    '\u01C7': 'LJ',
-    '\u01C8': 'Lj',
-    '\u24C2': 'M',
-    '\uFF2D': 'M',
-    '\u1E3E': 'M',
-    '\u1E40': 'M',
-    '\u1E42': 'M',
-    '\u2C6E': 'M',
-    '\u019C': 'M',
-    '\u24C3': 'N',
-    '\uFF2E': 'N',
-    '\u01F8': 'N',
-    '\u0143': 'N',
-    '\u00D1': 'N',
-    '\u1E44': 'N',
-    '\u0147': 'N',
-    '\u1E46': 'N',
-    '\u0145': 'N',
-    '\u1E4A': 'N',
-    '\u1E48': 'N',
-    '\u0220': 'N',
-    '\u019D': 'N',
-    '\uA790': 'N',
-    '\uA7A4': 'N',
-    '\u01CA': 'NJ',
-    '\u01CB': 'Nj',
-    '\u24C4': 'O',
-    '\uFF2F': 'O',
-    '\u00D2': 'O',
-    '\u00D3': 'O',
-    '\u00D4': 'O',
-    '\u1ED2': 'O',
-    '\u1ED0': 'O',
-    '\u1ED6': 'O',
-    '\u1ED4': 'O',
-    '\u00D5': 'O',
-    '\u1E4C': 'O',
-    '\u022C': 'O',
-    '\u1E4E': 'O',
-    '\u014C': 'O',
-    '\u1E50': 'O',
-    '\u1E52': 'O',
-    '\u014E': 'O',
-    '\u022E': 'O',
-    '\u0230': 'O',
-    '\u00D6': 'O',
-    '\u022A': 'O',
-    '\u1ECE': 'O',
-    '\u0150': 'O',
-    '\u01D1': 'O',
-    '\u020C': 'O',
-    '\u020E': 'O',
-    '\u01A0': 'O',
-    '\u1EDC': 'O',
-    '\u1EDA': 'O',
-    '\u1EE0': 'O',
-    '\u1EDE': 'O',
-    '\u1EE2': 'O',
-    '\u1ECC': 'O',
-    '\u1ED8': 'O',
-    '\u01EA': 'O',
-    '\u01EC': 'O',
-    '\u00D8': 'O',
-    '\u01FE': 'O',
-    '\u0186': 'O',
-    '\u019F': 'O',
-    '\uA74A': 'O',
-    '\uA74C': 'O',
-    '\u01A2': 'OI',
-    '\uA74E': 'OO',
-    '\u0222': 'OU',
-    '\u24C5': 'P',
-    '\uFF30': 'P',
-    '\u1E54': 'P',
-    '\u1E56': 'P',
-    '\u01A4': 'P',
-    '\u2C63': 'P',
-    '\uA750': 'P',
-    '\uA752': 'P',
-    '\uA754': 'P',
-    '\u24C6': 'Q',
-    '\uFF31': 'Q',
-    '\uA756': 'Q',
-    '\uA758': 'Q',
-    '\u024A': 'Q',
-    '\u24C7': 'R',
-    '\uFF32': 'R',
-    '\u0154': 'R',
-    '\u1E58': 'R',
-    '\u0158': 'R',
-    '\u0210': 'R',
-    '\u0212': 'R',
-    '\u1E5A': 'R',
-    '\u1E5C': 'R',
-    '\u0156': 'R',
-    '\u1E5E': 'R',
-    '\u024C': 'R',
-    '\u2C64': 'R',
-    '\uA75A': 'R',
-    '\uA7A6': 'R',
-    '\uA782': 'R',
-    '\u24C8': 'S',
-    '\uFF33': 'S',
-    '\u1E9E': 'S',
-    '\u015A': 'S',
-    '\u1E64': 'S',
-    '\u015C': 'S',
-    '\u1E60': 'S',
-    '\u0160': 'S',
-    '\u1E66': 'S',
-    '\u1E62': 'S',
-    '\u1E68': 'S',
-    '\u0218': 'S',
-    '\u015E': 'S',
-    '\u2C7E': 'S',
-    '\uA7A8': 'S',
-    '\uA784': 'S',
-    '\u24C9': 'T',
-    '\uFF34': 'T',
-    '\u1E6A': 'T',
-    '\u0164': 'T',
-    '\u1E6C': 'T',
-    '\u021A': 'T',
-    '\u0162': 'T',
-    '\u1E70': 'T',
-    '\u1E6E': 'T',
-    '\u0166': 'T',
-    '\u01AC': 'T',
-    '\u01AE': 'T',
-    '\u023E': 'T',
-    '\uA786': 'T',
-    '\uA728': 'TZ',
-    '\u24CA': 'U',
-    '\uFF35': 'U',
-    '\u00D9': 'U',
-    '\u00DA': 'U',
-    '\u00DB': 'U',
-    '\u0168': 'U',
-    '\u1E78': 'U',
-    '\u016A': 'U',
-    '\u1E7A': 'U',
-    '\u016C': 'U',
-    '\u00DC': 'U',
-    '\u01DB': 'U',
-    '\u01D7': 'U',
-    '\u01D5': 'U',
-    '\u01D9': 'U',
-    '\u1EE6': 'U',
-    '\u016E': 'U',
-    '\u0170': 'U',
-    '\u01D3': 'U',
-    '\u0214': 'U',
-    '\u0216': 'U',
-    '\u01AF': 'U',
-    '\u1EEA': 'U',
-    '\u1EE8': 'U',
-    '\u1EEE': 'U',
-    '\u1EEC': 'U',
-    '\u1EF0': 'U',
-    '\u1EE4': 'U',
-    '\u1E72': 'U',
-    '\u0172': 'U',
-    '\u1E76': 'U',
-    '\u1E74': 'U',
-    '\u0244': 'U',
-    '\u24CB': 'V',
-    '\uFF36': 'V',
-    '\u1E7C': 'V',
-    '\u1E7E': 'V',
-    '\u01B2': 'V',
-    '\uA75E': 'V',
-    '\u0245': 'V',
-    '\uA760': 'VY',
-    '\u24CC': 'W',
-    '\uFF37': 'W',
-    '\u1E80': 'W',
-    '\u1E82': 'W',
-    '\u0174': 'W',
-    '\u1E86': 'W',
-    '\u1E84': 'W',
-    '\u1E88': 'W',
-    '\u2C72': 'W',
-    '\u24CD': 'X',
-    '\uFF38': 'X',
-    '\u1E8A': 'X',
-    '\u1E8C': 'X',
-    '\u24CE': 'Y',
-    '\uFF39': 'Y',
-    '\u1EF2': 'Y',
-    '\u00DD': 'Y',
-    '\u0176': 'Y',
-    '\u1EF8': 'Y',
-    '\u0232': 'Y',
-    '\u1E8E': 'Y',
-    '\u0178': 'Y',
-    '\u1EF6': 'Y',
-    '\u1EF4': 'Y',
-    '\u01B3': 'Y',
-    '\u024E': 'Y',
-    '\u1EFE': 'Y',
-    '\u24CF': 'Z',
-    '\uFF3A': 'Z',
-    '\u0179': 'Z',
-    '\u1E90': 'Z',
-    '\u017B': 'Z',
-    '\u017D': 'Z',
-    '\u1E92': 'Z',
-    '\u1E94': 'Z',
-    '\u01B5': 'Z',
-    '\u0224': 'Z',
-    '\u2C7F': 'Z',
-    '\u2C6B': 'Z',
-    '\uA762': 'Z',
-    '\u24D0': 'a',
-    '\uFF41': 'a',
-    '\u1E9A': 'a',
-    '\u00E0': 'a',
-    '\u00E1': 'a',
-    '\u00E2': 'a',
-    '\u1EA7': 'a',
-    '\u1EA5': 'a',
-    '\u1EAB': 'a',
-    '\u1EA9': 'a',
-    '\u00E3': 'a',
-    '\u0101': 'a',
-    '\u0103': 'a',
-    '\u1EB1': 'a',
-    '\u1EAF': 'a',
-    '\u1EB5': 'a',
-    '\u1EB3': 'a',
-    '\u0227': 'a',
-    '\u01E1': 'a',
-    '\u00E4': 'a',
-    '\u01DF': 'a',
-    '\u1EA3': 'a',
-    '\u00E5': 'a',
-    '\u01FB': 'a',
-    '\u01CE': 'a',
-    '\u0201': 'a',
-    '\u0203': 'a',
-    '\u1EA1': 'a',
-    '\u1EAD': 'a',
-    '\u1EB7': 'a',
-    '\u1E01': 'a',
-    '\u0105': 'a',
-    '\u2C65': 'a',
-    '\u0250': 'a',
-    '\uA733': 'aa',
-    '\u00E6': 'ae',
-    '\u01FD': 'ae',
-    '\u01E3': 'ae',
-    '\uA735': 'ao',
-    '\uA737': 'au',
-    '\uA739': 'av',
-    '\uA73B': 'av',
-    '\uA73D': 'ay',
-    '\u24D1': 'b',
-    '\uFF42': 'b',
-    '\u1E03': 'b',
-    '\u1E05': 'b',
-    '\u1E07': 'b',
-    '\u0180': 'b',
-    '\u0183': 'b',
-    '\u0253': 'b',
-    '\u24D2': 'c',
-    '\uFF43': 'c',
-    '\u0107': 'c',
-    '\u0109': 'c',
-    '\u010B': 'c',
-    '\u010D': 'c',
-    '\u00E7': 'c',
-    '\u1E09': 'c',
-    '\u0188': 'c',
-    '\u023C': 'c',
-    '\uA73F': 'c',
-    '\u2184': 'c',
-    '\u24D3': 'd',
-    '\uFF44': 'd',
-    '\u1E0B': 'd',
-    '\u010F': 'd',
-    '\u1E0D': 'd',
-    '\u1E11': 'd',
-    '\u1E13': 'd',
-    '\u1E0F': 'd',
-    '\u0111': 'd',
-    '\u018C': 'd',
-    '\u0256': 'd',
-    '\u0257': 'd',
-    '\uA77A': 'd',
-    '\u01F3': 'dz',
-    '\u01C6': 'dz',
-    '\u24D4': 'e',
-    '\uFF45': 'e',
-    '\u00E8': 'e',
-    '\u00E9': 'e',
-    '\u00EA': 'e',
-    '\u1EC1': 'e',
-    '\u1EBF': 'e',
-    '\u1EC5': 'e',
-    '\u1EC3': 'e',
-    '\u1EBD': 'e',
-    '\u0113': 'e',
-    '\u1E15': 'e',
-    '\u1E17': 'e',
-    '\u0115': 'e',
-    '\u0117': 'e',
-    '\u00EB': 'e',
-    '\u1EBB': 'e',
-    '\u011B': 'e',
-    '\u0205': 'e',
-    '\u0207': 'e',
-    '\u1EB9': 'e',
-    '\u1EC7': 'e',
-    '\u0229': 'e',
-    '\u1E1D': 'e',
-    '\u0119': 'e',
-    '\u1E19': 'e',
-    '\u1E1B': 'e',
-    '\u0247': 'e',
-    '\u025B': 'e',
-    '\u01DD': 'e',
-    '\u24D5': 'f',
-    '\uFF46': 'f',
-    '\u1E1F': 'f',
-    '\u0192': 'f',
-    '\uA77C': 'f',
-    '\u24D6': 'g',
-    '\uFF47': 'g',
-    '\u01F5': 'g',
-    '\u011D': 'g',
-    '\u1E21': 'g',
-    '\u011F': 'g',
-    '\u0121': 'g',
-    '\u01E7': 'g',
-    '\u0123': 'g',
-    '\u01E5': 'g',
-    '\u0260': 'g',
-    '\uA7A1': 'g',
-    '\u1D79': 'g',
-    '\uA77F': 'g',
-    '\u24D7': 'h',
-    '\uFF48': 'h',
-    '\u0125': 'h',
-    '\u1E23': 'h',
-    '\u1E27': 'h',
-    '\u021F': 'h',
-    '\u1E25': 'h',
-    '\u1E29': 'h',
-    '\u1E2B': 'h',
-    '\u1E96': 'h',
-    '\u0127': 'h',
-    '\u2C68': 'h',
-    '\u2C76': 'h',
-    '\u0265': 'h',
-    '\u0195': 'hv',
-    '\u24D8': 'i',
-    '\uFF49': 'i',
-    '\u00EC': 'i',
-    '\u00ED': 'i',
-    '\u00EE': 'i',
-    '\u0129': 'i',
-    '\u012B': 'i',
-    '\u012D': 'i',
-    '\u00EF': 'i',
-    '\u1E2F': 'i',
-    '\u1EC9': 'i',
-    '\u01D0': 'i',
-    '\u0209': 'i',
-    '\u020B': 'i',
-    '\u1ECB': 'i',
-    '\u012F': 'i',
-    '\u1E2D': 'i',
-    '\u0268': 'i',
-    '\u0131': 'i',
-    '\u24D9': 'j',
-    '\uFF4A': 'j',
-    '\u0135': 'j',
-    '\u01F0': 'j',
-    '\u0249': 'j',
-    '\u24DA': 'k',
-    '\uFF4B': 'k',
-    '\u1E31': 'k',
-    '\u01E9': 'k',
-    '\u1E33': 'k',
-    '\u0137': 'k',
-    '\u1E35': 'k',
-    '\u0199': 'k',
-    '\u2C6A': 'k',
-    '\uA741': 'k',
-    '\uA743': 'k',
-    '\uA745': 'k',
-    '\uA7A3': 'k',
-    '\u24DB': 'l',
-    '\uFF4C': 'l',
-    '\u0140': 'l',
-    '\u013A': 'l',
-    '\u013E': 'l',
-    '\u1E37': 'l',
-    '\u1E39': 'l',
-    '\u013C': 'l',
-    '\u1E3D': 'l',
-    '\u1E3B': 'l',
-    '\u017F': 'l',
-    '\u0142': 'l',
-    '\u019A': 'l',
-    '\u026B': 'l',
-    '\u2C61': 'l',
-    '\uA749': 'l',
-    '\uA781': 'l',
-    '\uA747': 'l',
-    '\u01C9': 'lj',
-    '\u24DC': 'm',
-    '\uFF4D': 'm',
-    '\u1E3F': 'm',
-    '\u1E41': 'm',
-    '\u1E43': 'm',
-    '\u0271': 'm',
-    '\u026F': 'm',
-    '\u24DD': 'n',
-    '\uFF4E': 'n',
-    '\u01F9': 'n',
-    '\u0144': 'n',
-    '\u00F1': 'n',
-    '\u1E45': 'n',
-    '\u0148': 'n',
-    '\u1E47': 'n',
-    '\u0146': 'n',
-    '\u1E4B': 'n',
-    '\u1E49': 'n',
-    '\u019E': 'n',
-    '\u0272': 'n',
-    '\u0149': 'n',
-    '\uA791': 'n',
-    '\uA7A5': 'n',
-    '\u01CC': 'nj',
-    '\u24DE': 'o',
-    '\uFF4F': 'o',
-    '\u00F2': 'o',
-    '\u00F3': 'o',
-    '\u00F4': 'o',
-    '\u1ED3': 'o',
-    '\u1ED1': 'o',
-    '\u1ED7': 'o',
-    '\u1ED5': 'o',
-    '\u00F5': 'o',
-    '\u1E4D': 'o',
-    '\u022D': 'o',
-    '\u1E4F': 'o',
-    '\u014D': 'o',
-    '\u1E51': 'o',
-    '\u1E53': 'o',
-    '\u014F': 'o',
-    '\u022F': 'o',
-    '\u0231': 'o',
-    '\u00F6': 'o',
-    '\u022B': 'o',
-    '\u1ECF': 'o',
-    '\u0151': 'o',
-    '\u01D2': 'o',
-    '\u020D': 'o',
-    '\u020F': 'o',
-    '\u01A1': 'o',
-    '\u1EDD': 'o',
-    '\u1EDB': 'o',
-    '\u1EE1': 'o',
-    '\u1EDF': 'o',
-    '\u1EE3': 'o',
-    '\u1ECD': 'o',
-    '\u1ED9': 'o',
-    '\u01EB': 'o',
-    '\u01ED': 'o',
-    '\u00F8': 'o',
-    '\u01FF': 'o',
-    '\u0254': 'o',
-    '\uA74B': 'o',
-    '\uA74D': 'o',
-    '\u0275': 'o',
-    '\u01A3': 'oi',
-    '\u0223': 'ou',
-    '\uA74F': 'oo',
-    '\u24DF': 'p',
-    '\uFF50': 'p',
-    '\u1E55': 'p',
-    '\u1E57': 'p',
-    '\u01A5': 'p',
-    '\u1D7D': 'p',
-    '\uA751': 'p',
-    '\uA753': 'p',
-    '\uA755': 'p',
-    '\u24E0': 'q',
-    '\uFF51': 'q',
-    '\u024B': 'q',
-    '\uA757': 'q',
-    '\uA759': 'q',
-    '\u24E1': 'r',
-    '\uFF52': 'r',
-    '\u0155': 'r',
-    '\u1E59': 'r',
-    '\u0159': 'r',
-    '\u0211': 'r',
-    '\u0213': 'r',
-    '\u1E5B': 'r',
-    '\u1E5D': 'r',
-    '\u0157': 'r',
-    '\u1E5F': 'r',
-    '\u024D': 'r',
-    '\u027D': 'r',
-    '\uA75B': 'r',
-    '\uA7A7': 'r',
-    '\uA783': 'r',
-    '\u24E2': 's',
-    '\uFF53': 's',
-    '\u00DF': 's',
-    '\u015B': 's',
-    '\u1E65': 's',
-    '\u015D': 's',
-    '\u1E61': 's',
-    '\u0161': 's',
-    '\u1E67': 's',
-    '\u1E63': 's',
-    '\u1E69': 's',
-    '\u0219': 's',
-    '\u015F': 's',
-    '\u023F': 's',
-    '\uA7A9': 's',
-    '\uA785': 's',
-    '\u1E9B': 's',
-    '\u24E3': 't',
-    '\uFF54': 't',
-    '\u1E6B': 't',
-    '\u1E97': 't',
-    '\u0165': 't',
-    '\u1E6D': 't',
-    '\u021B': 't',
-    '\u0163': 't',
-    '\u1E71': 't',
-    '\u1E6F': 't',
-    '\u0167': 't',
-    '\u01AD': 't',
-    '\u0288': 't',
-    '\u2C66': 't',
-    '\uA787': 't',
-    '\uA729': 'tz',
-    '\u24E4': 'u',
-    '\uFF55': 'u',
-    '\u00F9': 'u',
-    '\u00FA': 'u',
-    '\u00FB': 'u',
-    '\u0169': 'u',
-    '\u1E79': 'u',
-    '\u016B': 'u',
-    '\u1E7B': 'u',
-    '\u016D': 'u',
-    '\u00FC': 'u',
-    '\u01DC': 'u',
-    '\u01D8': 'u',
-    '\u01D6': 'u',
-    '\u01DA': 'u',
-    '\u1EE7': 'u',
-    '\u016F': 'u',
-    '\u0171': 'u',
-    '\u01D4': 'u',
-    '\u0215': 'u',
-    '\u0217': 'u',
-    '\u01B0': 'u',
-    '\u1EEB': 'u',
-    '\u1EE9': 'u',
-    '\u1EEF': 'u',
-    '\u1EED': 'u',
-    '\u1EF1': 'u',
-    '\u1EE5': 'u',
-    '\u1E73': 'u',
-    '\u0173': 'u',
-    '\u1E77': 'u',
-    '\u1E75': 'u',
-    '\u0289': 'u',
-    '\u24E5': 'v',
-    '\uFF56': 'v',
-    '\u1E7D': 'v',
-    '\u1E7F': 'v',
-    '\u028B': 'v',
-    '\uA75F': 'v',
-    '\u028C': 'v',
-    '\uA761': 'vy',
-    '\u24E6': 'w',
-    '\uFF57': 'w',
-    '\u1E81': 'w',
-    '\u1E83': 'w',
-    '\u0175': 'w',
-    '\u1E87': 'w',
-    '\u1E85': 'w',
-    '\u1E98': 'w',
-    '\u1E89': 'w',
-    '\u2C73': 'w',
-    '\u24E7': 'x',
-    '\uFF58': 'x',
-    '\u1E8B': 'x',
-    '\u1E8D': 'x',
-    '\u24E8': 'y',
-    '\uFF59': 'y',
-    '\u1EF3': 'y',
-    '\u00FD': 'y',
-    '\u0177': 'y',
-    '\u1EF9': 'y',
-    '\u0233': 'y',
-    '\u1E8F': 'y',
-    '\u00FF': 'y',
-    '\u1EF7': 'y',
-    '\u1E99': 'y',
-    '\u1EF5': 'y',
-    '\u01B4': 'y',
-    '\u024F': 'y',
-    '\u1EFF': 'y',
-    '\u24E9': 'z',
-    '\uFF5A': 'z',
-    '\u017A': 'z',
-    '\u1E91': 'z',
-    '\u017C': 'z',
-    '\u017E': 'z',
-    '\u1E93': 'z',
-    '\u1E95': 'z',
-    '\u01B6': 'z',
-    '\u0225': 'z',
-    '\u0240': 'z',
-    '\u2C6C': 'z',
-    '\uA763': 'z',
-    '\u0386': '\u0391',
-    '\u0388': '\u0395',
-    '\u0389': '\u0397',
-    '\u038A': '\u0399',
-    '\u03AA': '\u0399',
-    '\u038C': '\u039F',
-    '\u038E': '\u03A5',
-    '\u03AB': '\u03A5',
-    '\u038F': '\u03A9',
-    '\u03AC': '\u03B1',
-    '\u03AD': '\u03B5',
-    '\u03AE': '\u03B7',
-    '\u03AF': '\u03B9',
-    '\u03CA': '\u03B9',
-    '\u0390': '\u03B9',
-    '\u03CC': '\u03BF',
-    '\u03CD': '\u03C5',
-    '\u03CB': '\u03C5',
-    '\u03B0': '\u03C5',
-    '\u03C9': '\u03C9',
-    '\u03C2': '\u03C3'
-  };
-
-  return diacritics;
-});
-
-S2.define('select2/data/base',[
-  '../utils'
-], function (Utils) {
-  function BaseAdapter ($element, options) {
-    BaseAdapter.__super__.constructor.call(this);
-  }
-
-  Utils.Extend(BaseAdapter, Utils.Observable);
-
-  BaseAdapter.prototype.current = function (callback) {
-    throw new Error('The `current` method must be defined in child classes.');
-  };
-
-  BaseAdapter.prototype.query = function (params, callback) {
-    throw new Error('The `query` method must be defined in child classes.');
-  };
-
-  BaseAdapter.prototype.bind = function (container, $container) {
-    // Can be implemented in subclasses
-  };
-
-  BaseAdapter.prototype.destroy = function () {
-    // Can be implemented in subclasses
-  };
-
-  BaseAdapter.prototype.generateResultId = function (container, data) {
-    var id = container.id + '-result-';
-
-    id += Utils.generateChars(4);
-
-    if (data.id != null) {
-      id += '-' + data.id.toString();
-    } else {
-      id += '-' + Utils.generateChars(4);
-    }
-    return id;
-  };
-
-  return BaseAdapter;
-});
-
-S2.define('select2/data/select',[
-  './base',
-  '../utils',
-  'jquery'
-], function (BaseAdapter, Utils, $) {
-  function SelectAdapter ($element, options) {
-    this.$element = $element;
-    this.options = options;
-
-    SelectAdapter.__super__.constructor.call(this);
-  }
-
-  Utils.Extend(SelectAdapter, BaseAdapter);
-
-  SelectAdapter.prototype.current = function (callback) {
-    var data = [];
-    var self = this;
-
-    this.$element.find(':selected').each(function () {
-      var $option = $(this);
-
-      var option = self.item($option);
-
-      data.push(option);
-    });
-
-    callback(data);
-  };
-
-  SelectAdapter.prototype.select = function (data) {
-    var self = this;
-
-    data.selected = true;
-
-    // If data.element is a DOM node, use it instead
-    if ($(data.element).is('option')) {
-      data.element.selected = true;
-
-      this.$element.trigger('change');
-
-      return;
-    }
-
-    if (this.$element.prop('multiple')) {
-      this.current(function (currentData) {
-        var val = [];
-
-        data = [data];
-        data.push.apply(data, currentData);
-
-        for (var d = 0; d < data.length; d++) {
-          var id = data[d].id;
-
-          if ($.inArray(id, val) === -1) {
-            val.push(id);
-          }
-        }
-
-        self.$element.val(val);
-        self.$element.trigger('change');
-      });
-    } else {
-      var val = data.id;
-
-      this.$element.val(val);
-      this.$element.trigger('change');
-    }
-  };
-
-  SelectAdapter.prototype.unselect = function (data) {
-    var self = this;
-
-    if (!this.$element.prop('multiple')) {
-      return;
-    }
-
-    data.selected = false;
-
-    if ($(data.element).is('option')) {
-      data.element.selected = false;
-
-      this.$element.trigger('change');
-
-      return;
-    }
-
-    this.current(function (currentData) {
-      var val = [];
-
-      for (var d = 0; d < currentData.length; d++) {
-        var id = currentData[d].id;
-
-        if (id !== data.id && $.inArray(id, val) === -1) {
-          val.push(id);
-        }
-      }
-
-      self.$element.val(val);
-
-      self.$element.trigger('change');
-    });
-  };
-
-  SelectAdapter.prototype.bind = function (container, $container) {
-    var self = this;
-
-    this.container = container;
-
-    container.on('select', function (params) {
-      self.select(params.data);
-    });
-
-    container.on('unselect', function (params) {
-      self.unselect(params.data);
-    });
-  };
-
-  SelectAdapter.prototype.destroy = function () {
-    // Remove anything added to child elements
-    this.$element.find('*').each(function () {
-      // Remove any custom data set by Select2
-      $.removeData(this, 'data');
-    });
-  };
-
-  SelectAdapter.prototype.query = function (params, callback) {
-    var data = [];
-    var self = this;
-
-    var $options = this.$element.children();
-
-    $options.each(function () {
-      var $option = $(this);
-
-      if (!$option.is('option') && !$option.is('optgroup')) {
-        return;
-      }
-
-      var option = self.item($option);
-
-      var matches = self.matches(params, option);
-
-      if (matches !== null) {
-        data.push(matches);
-      }
-    });
-
-    callback({
-      results: data
-    });
-  };
-
-  SelectAdapter.prototype.addOptions = function ($options) {
-    Utils.appendMany(this.$element, $options);
-  };
-
-  SelectAdapter.prototype.option = function (data) {
-    var option;
-
-    if (data.children) {
-      option = document.createElement('optgroup');
-      option.label = data.text;
-    } else {
-      option = document.createElement('option');
-
-      if (option.textContent !== undefined) {
-        option.textContent = data.text;
-      } else {
-        option.innerText = data.text;
-      }
-    }
-
-    if (data.id) {
-      option.value = data.id;
-    }
-
-    if (data.disabled) {
-      option.disabled = true;
-    }
-
-    if (data.selected) {
-      option.selected = true;
-    }
-
-    if (data.title) {
-      option.title = data.title;
-    }
-
-    var $option = $(option);
-
-    var normalizedData = this._normalizeItem(data);
-    normalizedData.element = option;
-
-    // Override the option's data with the combined data
-    $.data(option, 'data', normalizedData);
-
-    return $option;
-  };
-
-  SelectAdapter.prototype.item = function ($option) {
-    var data = {};
-
-    data = $.data($option[0], 'data');
-
-    if (data != null) {
-      return data;
-    }
-
-    if ($option.is('option')) {
-      data = {
-        id: $option.val(),
-        text: $option.text(),
-        disabled: $option.prop('disabled'),
-        selected: $option.prop('selected'),
-        title: $option.prop('title')
-      };
-    } else if ($option.is('optgroup')) {
-      data = {
-        text: $option.prop('label'),
-        children: [],
-        title: $option.prop('title')
-      };
-
-      var $children = $option.children('option');
-      var children = [];
-
-      for (var c = 0; c < $children.length; c++) {
-        var $child = $($children[c]);
-
-        var child = this.item($child);
-
-        children.push(child);
-      }
-
-      data.children = children;
-    }
-
-    data = this._normalizeItem(data);
-    data.element = $option[0];
-
-    $.data($option[0], 'data', data);
-
-    return data;
-  };
-
-  SelectAdapter.prototype._normalizeItem = function (item) {
-    if (!$.isPlainObject(item)) {
-      item = {
-        id: item,
-        text: item
-      };
-    }
-
-    item = $.extend({}, {
-      text: ''
-    }, item);
-
-    var defaults = {
-      selected: false,
-      disabled: false
-    };
-
-    if (item.id != null) {
-      item.id = item.id.toString();
-    }
-
-    if (item.text != null) {
-      item.text = item.text.toString();
-    }
-
-    if (item._resultId == null && item.id && this.container != null) {
-      item._resultId = this.generateResultId(this.container, item);
-    }
-
-    return $.extend({}, defaults, item);
-  };
-
-  SelectAdapter.prototype.matches = function (params, data) {
-    var matcher = this.options.get('matcher');
-
-    return matcher(params, data);
-  };
-
-  return SelectAdapter;
-});
-
-S2.define('select2/data/array',[
-  './select',
-  '../utils',
-  'jquery'
-], function (SelectAdapter, Utils, $) {
-  function ArrayAdapter ($element, options) {
-    var data = options.get('data') || [];
-
-    ArrayAdapter.__super__.constructor.call(this, $element, options);
-
-    this.addOptions(this.convertToOptions(data));
-  }
-
-  Utils.Extend(ArrayAdapter, SelectAdapter);
-
-  ArrayAdapter.prototype.select = function (data) {
-    var $option = this.$element.find('option').filter(function (i, elm) {
-      return elm.value == data.id.toString();
-    });
-
-    if ($option.length === 0) {
-      $option = this.option(data);
-
-      this.addOptions($option);
-    }
-
-    ArrayAdapter.__super__.select.call(this, data);
-  };
-
-  ArrayAdapter.prototype.convertToOptions = function (data) {
-    var self = this;
-
-    var $existing = this.$element.find('option');
-    var existingIds = $existing.map(function () {
-      return self.item($(this)).id;
-    }).get();
-
-    var $options = [];
-
-    // Filter out all items except for the one passed in the argument
-    function onlyItem (item) {
-      return function () {
-        return $(this).val() == item.id;
-      };
-    }
-
-    for (var d = 0; d < data.length; d++) {
-      var item = this._normalizeItem(data[d]);
-
-      // Skip items which were pre-loaded, only merge the data
-      if ($.inArray(item.id, existingIds) >= 0) {
-        var $existingOption = $existing.filter(onlyItem(item));
-
-        var existingData = this.item($existingOption);
-        var newData = $.extend(true, {}, existingData, item);
-
-        var $newOption = this.option(existingData);
-
-        $existingOption.replaceWith($newOption);
-
-        continue;
-      }
-
-      var $option = this.option(item);
-
-      if (item.children) {
-        var $children = this.convertToOptions(item.children);
-
-        Utils.appendMany($option, $children);
-      }
-
-      $options.push($option);
-    }
-
-    return $options;
-  };
-
-  return ArrayAdapter;
-});
-
-S2.define('select2/data/ajax',[
-  './array',
-  '../utils',
-  'jquery'
-], function (ArrayAdapter, Utils, $) {
-  function AjaxAdapter ($element, options) {
-    this.ajaxOptions = this._applyDefaults(options.get('ajax'));
-
-    if (this.ajaxOptions.processResults != null) {
-      this.processResults = this.ajaxOptions.processResults;
-    }
-
-    ArrayAdapter.__super__.constructor.call(this, $element, options);
-  }
-
-  Utils.Extend(AjaxAdapter, ArrayAdapter);
-
-  AjaxAdapter.prototype._applyDefaults = function (options) {
-    var defaults = {
-      data: function (params) {
-        return {
-          q: params.term
-        };
-      },
-      transport: function (params, success, failure) {
-        var $request = $.ajax(params);
-
-        $request.then(success);
-        $request.fail(failure);
-
-        return $request;
-      }
-    };
-
-    return $.extend({}, defaults, options, true);
-  };
-
-  AjaxAdapter.prototype.processResults = function (results) {
-    return results;
-  };
-
-  AjaxAdapter.prototype.query = function (params, callback) {
-    var matches = [];
-    var self = this;
-
-    if (this._request != null) {
-      // JSONP requests cannot always be aborted
-      if ($.isFunction(this._request.abort)) {
-        this._request.abort();
-      }
-
-      this._request = null;
-    }
-
-    var options = $.extend({
-      type: 'GET'
-    }, this.ajaxOptions);
-
-    if (typeof options.url === 'function') {
-      options.url = options.url(params);
-    }
-
-    if (typeof options.data === 'function') {
-      options.data = options.data(params);
-    }
-
-    function request () {
-      var $request = options.transport(options, function (data) {
-        var results = self.processResults(data, params);
-
-        if (self.options.get('debug') && window.console && console.error) {
-          // Check to make sure that the response included a `results` key.
-          if (!results || !results.results || !$.isArray(results.results)) {
-            console.error(
-              'Select2: The AJAX results did not return an array in the ' +
-              '`results` key of the response.'
-            );
-          }
-        }
-
-        callback(results);
-      }, function () {
-        // TODO: Handle AJAX errors
-      });
-
-      self._request = $request;
-    }
-
-    if (this.ajaxOptions.delay && params.term !== '') {
-      if (this._queryTimeout) {
-        window.clearTimeout(this._queryTimeout);
-      }
-
-      this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);
-    } else {
-      request();
-    }
-  };
-
-  return AjaxAdapter;
-});
-
-S2.define('select2/data/tags',[
-  'jquery'
-], function ($) {
-  function Tags (decorated, $element, options) {
-    var tags = options.get('tags');
-
-    var createTag = options.get('createTag');
-
-    if (createTag !== undefined) {
-      this.createTag = createTag;
-    }
-
-    decorated.call(this, $element, options);
-
-    if ($.isArray(tags)) {
-      for (var t = 0; t < tags.length; t++) {
-        var tag = tags[t];
-        var item = this._normalizeItem(tag);
-
-        var $option = this.option(item);
-
-        this.$element.append($option);
-      }
-    }
-  }
-
-  Tags.prototype.query = function (decorated, params, callback) {
-    var self = this;
-
-    this._removeOldTags();
-
-    if (params.term == null || params.page != null) {
-      decorated.call(this, params, callback);
-      return;
-    }
-
-    function wrapper (obj, child) {
-      var data = obj.results;
-
-      for (var i = 0; i < data.length; i++) {
-        var option = data[i];
-
-        var checkChildren = (
-          option.children != null &&
-          !wrapper({
-            results: option.children
-          }, true)
-        );
-
-        var checkText = option.text === params.term;
-
-        if (checkText || checkChildren) {
-          if (child) {
-            return false;
-          }
-
-          obj.data = data;
-          callback(obj);
-
-          return;
-        }
-      }
-
-      if (child) {
-        return true;
-      }
-
-      var tag = self.createTag(params);
-
-      if (tag != null) {
-        var $option = self.option(tag);
-        $option.attr('data-select2-tag', true);
-
-        self.addOptions([$option]);
-
-        self.insertTag(data, tag);
-      }
-
-      obj.results = data;
-
-      callback(obj);
-    }
-
-    decorated.call(this, params, wrapper);
-  };
-
-  Tags.prototype.createTag = function (decorated, params) {
-    var term = $.trim(params.term);
-
-    if (term === '') {
-      return null;
-    }
-
-    return {
-      id: term,
-      text: term
-    };
-  };
-
-  Tags.prototype.insertTag = function (_, data, tag) {
-    data.unshift(tag);
-  };
-
-  Tags.prototype._removeOldTags = function (_) {
-    var tag = this._lastTag;
-
-    var $options = this.$element.find('option[data-select2-tag]');
-
-    $options.each(function () {
-      if (this.selected) {
-        return;
-      }
-
-      $(this).remove();
-    });
-  };
-
-  return Tags;
-});
-
-S2.define('select2/data/tokenizer',[
-  'jquery'
-], function ($) {
-  function Tokenizer (decorated, $element, options) {
-    var tokenizer = options.get('tokenizer');
-
-    if (tokenizer !== undefined) {
-      this.tokenizer = tokenizer;
-    }
-
-    decorated.call(this, $element, options);
-  }
-
-  Tokenizer.prototype.bind = function (decorated, container, $container) {
-    decorated.call(this, container, $container);
-
-    this.$search =  container.dropdown.$search || container.selection.$search ||
-      $container.find('.select2-search__field');
-  };
-
-  Tokenizer.prototype.query = function (decorated, params, callback) {
-    var self = this;
-
-    function select (data) {
-      self.select(data);
-    }
-
-    params.term = params.term || '';
-
-    var tokenData = this.tokenizer(params, this.options, select);
-
-    if (tokenData.term !== params.term) {
-      // Replace the search term if we have the search box
-      if (this.$search.length) {
-        this.$search.val(tokenData.term);
-        this.$search.focus();
-      }
-
-      params.term = tokenData.term;
-    }
-
-    decorated.call(this, params, callback);
-  };
-
-  Tokenizer.prototype.tokenizer = function (_, params, options, callback) {
-    var separators = options.get('tokenSeparators') || [];
-    var term = params.term;
-    var i = 0;
-
-    var createTag = this.createTag || function (params) {
-      return {
-        id: params.term,
-        text: params.term
-      };
-    };
-
-    while (i < term.length) {
-      var termChar = term[i];
-
-      if ($.inArray(termChar, separators) === -1) {
-        i++;
-
-        continue;
-      }
-
-      var part = term.substr(0, i);
-      var partParams = $.extend({}, params, {
-        term: part
-      });
-
-      var data = createTag(partParams);
-
-      callback(data);
-
-      // Reset the term to not include the tokenized portion
-      term = term.substr(i + 1) || '';
-      i = 0;
-    }
-
-    return {
-      term: term
-    };
-  };
-
-  return Tokenizer;
-});
-
-S2.define('select2/data/minimumInputLength',[
-
-], function () {
-  function MinimumInputLength (decorated, $e, options) {
-    this.minimumInputLength = options.get('minimumInputLength');
-
-    decorated.call(this, $e, options);
-  }
-
-  MinimumInputLength.prototype.query = function (decorated, params, callback) {
-    params.term = params.term || '';
-
-    if (params.term.length < this.minimumInputLength) {
-      this.trigger('results:message', {
-        message: 'inputTooShort',
-        args: {
-          minimum: this.minimumInputLength,
-          input: params.term,
-          params: params
-        }
-      });
-
-      return;
-    }
-
-    decorated.call(this, params, callback);
-  };
-
-  return MinimumInputLength;
-});
-
-S2.define('select2/data/maximumInputLength',[
-
-], function () {
-  function MaximumInputLength (decorated, $e, options) {
-    this.maximumInputLength = options.get('maximumInputLength');
-
-    decorated.call(this, $e, options);
-  }
-
-  MaximumInputLength.prototype.query = function (decorated, params, callback) {
-    params.term = params.term || '';
-
-    if (this.maximumInputLength > 0 &&
-        params.term.length > this.maximumInputLength) {
-      this.trigger('results:message', {
-        message: 'inputTooLong',
-        args: {
-          maximum: this.maximumInputLength,
-          input: params.term,
-          params: params
-        }
-      });
-
-      return;
-    }
-
-    decorated.call(this, params, callback);
-  };
-
-  return MaximumInputLength;
-});
-
-S2.define('select2/data/maximumSelectionLength',[
-
-], function (){
-  function MaximumSelectionLength (decorated, $e, options) {
-    this.maximumSelectionLength = options.get('maximumSelectionLength');
-
-    decorated.call(this, $e, options);
-  }
-
-  MaximumSelectionLength.prototype.query =
-    function (decorated, params, callback) {
-      var self = this;
-
-      this.current(function (currentData) {
-        var count = currentData != null ? currentData.length : 0;
-        if (self.maximumSelectionLength > 0 &&
-          count >= self.maximumSelectionLength) {
-          self.trigger('results:message', {
-            message: 'maximumSelected',
-            args: {
-              maximum: self.maximumSelectionLength
-            }
-          });
-          return;
-        }
-        decorated.call(self, params, callback);
-      });
-  };
-
-  return MaximumSelectionLength;
-});
-
-S2.define('select2/dropdown',[
-  'jquery',
-  './utils'
-], function ($, Utils) {
-  function Dropdown ($element, options) {
-    this.$element = $element;
-    this.options = options;
-
-    Dropdown.__super__.constructor.call(this);
-  }
-
-  Utils.Extend(Dropdown, Utils.Observable);
-
-  Dropdown.prototype.render = function () {
-    var $dropdown = $(
-      '<span class="select2-dropdown">' +
-        '<span class="select2-results"></span>' +
-      '</span>'
-    );
-
-    $dropdown.attr('dir', this.options.get('dir'));
-
-    this.$dropdown = $dropdown;
-
-    return $dropdown;
-  };
-
-  Dropdown.prototype.position = function ($dropdown, $container) {
-    // Should be implmented in subclasses
-  };
-
-  Dropdown.prototype.destroy = function () {
-    // Remove the dropdown from the DOM
-    this.$dropdown.remove();
-  };
-
-  return Dropdown;
-});
-
-S2.define('select2/dropdown/search',[
-  'jquery',
-  '../utils'
-], function ($, Utils) {
-  function Search () { }
-
-  Search.prototype.render = function (decorated) {
-    var $rendered = decorated.call(this);
-
-    var $search = $(
-      '<span class="select2-search select2-search--dropdown">' +
-        '<input class="select2-search__field" type="search" tabindex="-1"' +
-        ' autocomplete="off" autocorrect="off" autocapitalize="off"' +
-        ' spellcheck="false" role="textbox" />' +
-      '</span>'
-    );
-
-    this.$searchContainer = $search;
-    this.$search = $search.find('input');
-
-    $rendered.prepend($search);
-
-    return $rendered;
-  };
-
-  Search.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-
-    decorated.call(this, container, $container);
-
-    this.$search.on('keydown', function (evt) {
-      self.trigger('keypress', evt);
-
-      self._keyUpPrevented = evt.isDefaultPrevented();
-    });
-
-    // Workaround for browsers which do not support the `input` event
-    // This will prevent double-triggering of events for browsers which support
-    // both the `keyup` and `input` events.
-    this.$search.on('input', function (evt) {
-      // Unbind the duplicated `keyup` event
-      $(this).off('keyup');
-    });
-
-    this.$search.on('keyup input', function (evt) {
-      self.handleSearch(evt);
-    });
-
-    container.on('open', function () {
-      self.$search.attr('tabindex', 0);
-
-      self.$search.focus();
-
-      window.setTimeout(function () {
-        self.$search.focus();
-      }, 0);
-    });
-
-    container.on('close', function () {
-      self.$search.attr('tabindex', -1);
-
-      self.$search.val('');
-    });
-
-    container.on('results:all', function (params) {
-      if (params.query.term == null || params.query.term === '') {
-        var showSearch = self.showSearch(params);
-
-        if (showSearch) {
-          self.$searchContainer.removeClass('select2-search--hide');
-        } else {
-          self.$searchContainer.addClass('select2-search--hide');
-        }
-      }
-    });
-  };
-
-  Search.prototype.handleSearch = function (evt) {
-    if (!this._keyUpPrevented) {
-      var input = this.$search.val();
-
-      this.trigger('query', {
-        term: input
-      });
-    }
-
-    this._keyUpPrevented = false;
-  };
-
-  Search.prototype.showSearch = function (_, params) {
-    return true;
-  };
-
-  return Search;
-});
-
-S2.define('select2/dropdown/hidePlaceholder',[
-
-], function () {
-  function HidePlaceholder (decorated, $element, options, dataAdapter) {
-    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
-
-    decorated.call(this, $element, options, dataAdapter);
-  }
-
-  HidePlaceholder.prototype.append = function (decorated, data) {
-    data.results = this.removePlaceholder(data.results);
-
-    decorated.call(this, data);
-  };
-
-  HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) {
-    if (typeof placeholder === 'string') {
-      placeholder = {
-        id: '',
-        text: placeholder
-      };
-    }
-
-    return placeholder;
-  };
-
-  HidePlaceholder.prototype.removePlaceholder = function (_, data) {
-    var modifiedData = data.slice(0);
-
-    for (var d = data.length - 1; d >= 0; d--) {
-      var item = data[d];
-
-      if (this.placeholder.id === item.id) {
-        modifiedData.splice(d, 1);
-      }
-    }
-
-    return modifiedData;
-  };
-
-  return HidePlaceholder;
-});
-
-S2.define('select2/dropdown/infiniteScroll',[
-  'jquery'
-], function ($) {
-  function InfiniteScroll (decorated, $element, options, dataAdapter) {
-    this.lastParams = {};
-
-    decorated.call(this, $element, options, dataAdapter);
-
-    this.$loadingMore = this.createLoadingMore();
-    this.loading = false;
-  }
-
-  InfiniteScroll.prototype.append = function (decorated, data) {
-    this.$loadingMore.remove();
-    this.loading = false;
-
-    decorated.call(this, data);
-
-    if (this.showLoadingMore(data)) {
-      this.$results.append(this.$loadingMore);
-    }
-  };
-
-  InfiniteScroll.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-
-    decorated.call(this, container, $container);
-
-    container.on('query', function (params) {
-      self.lastParams = params;
-      self.loading = true;
-    });
-
-    container.on('query:append', function (params) {
-      self.lastParams = params;
-      self.loading = true;
-    });
-
-    this.$results.on('scroll', function () {
-      var isLoadMoreVisible = $.contains(
-        document.documentElement,
-        self.$loadingMore[0]
-      );
-
-      if (self.loading || !isLoadMoreVisible) {
-        return;
-      }
-
-      var currentOffset = self.$results.offset().top +
-        self.$results.outerHeight(false);
-      var loadingMoreOffset = self.$loadingMore.offset().top +
-        self.$loadingMore.outerHeight(false);
-
-      if (currentOffset + 50 >= loadingMoreOffset) {
-        self.loadMore();
-      }
-    });
-  };
-
-  InfiniteScroll.prototype.loadMore = function () {
-    this.loading = true;
-
-    var params = $.extend({}, {page: 1}, this.lastParams);
-
-    params.page++;
-
-    this.trigger('query:append', params);
-  };
-
-  InfiniteScroll.prototype.showLoadingMore = function (_, data) {
-    return data.pagination && data.pagination.more;
-  };
-
-  InfiniteScroll.prototype.createLoadingMore = function () {
-    var $option = $(
-      '<li class="option load-more" role="treeitem"></li>'
-    );
-
-    var message = this.options.get('translations').get('loadingMore');
-
-    $option.html(message(this.lastParams));
-
-    return $option;
-  };
-
-  return InfiniteScroll;
-});
-
-S2.define('select2/dropdown/attachBody',[
-  'jquery',
-  '../utils'
-], function ($, Utils) {
-  function AttachBody (decorated, $element, options) {
-    this.$dropdownParent = options.get('dropdownParent') || document.body;
-
-    decorated.call(this, $element, options);
-  }
-
-  AttachBody.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-
-    var setupResultsEvents = false;
-
-    decorated.call(this, container, $container);
-
-    container.on('open', function () {
-      self._showDropdown();
-      self._attachPositioningHandler(container);
-
-      if (!setupResultsEvents) {
-        setupResultsEvents = true;
-
-        container.on('results:all', function () {
-          self._positionDropdown();
-          self._resizeDropdown();
-        });
-
-        container.on('results:append', function () {
-          self._positionDropdown();
-          self._resizeDropdown();
-        });
-      }
-    });
-
-    container.on('close', function () {
-      self._hideDropdown();
-      self._detachPositioningHandler(container);
-    });
-
-    this.$dropdownContainer.on('mousedown', function (evt) {
-      evt.stopPropagation();
-    });
-  };
-
-  AttachBody.prototype.position = function (decorated, $dropdown, $container) {
-    // Clone all of the container classes
-    $dropdown.attr('class', $container.attr('class'));
-
-    $dropdown.removeClass('select2');
-    $dropdown.addClass('select2-container--open');
-
-    $dropdown.css({
-      position: 'absolute',
-      top: -999999
-    });
-
-    this.$container = $container;
-  };
-
-  AttachBody.prototype.render = function (decorated) {
-    var $container = $('<span></span>');
-
-    var $dropdown = decorated.call(this);
-    $container.append($dropdown);
-
-    this.$dropdownContainer = $container;
-
-    return $container;
-  };
-
-  AttachBody.prototype._hideDropdown = function (decorated) {
-    this.$dropdownContainer.detach();
-  };
-
-  AttachBody.prototype._attachPositioningHandler = function (container) {
-    var self = this;
-
-    var scrollEvent = 'scroll.select2.' + container.id;
-    var resizeEvent = 'resize.select2.' + container.id;
-    var orientationEvent = 'orientationchange.select2.' + container.id;
-
-    var $watchers = this.$container.parents().filter(Utils.hasScroll);
-    $watchers.each(function () {
-      $(this).data('select2-scroll-position', {
-        x: $(this).scrollLeft(),
-        y: $(this).scrollTop()
-      });
-    });
-
-    $watchers.on(scrollEvent, function (ev) {
-      var position = $(this).data('select2-scroll-position');
-      $(this).scrollTop(position.y);
-    });
-
-    $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent,
-      function (e) {
-      self._positionDropdown();
-      self._resizeDropdown();
-    });
-  };
-
-  AttachBody.prototype._detachPositioningHandler = function (container) {
-    var scrollEvent = 'scroll.select2.' + container.id;
-    var resizeEvent = 'resize.select2.' + container.id;
-    var orientationEvent = 'orientationchange.select2.' + container.id;
-
-    var $watchers = this.$container.parents().filter(Utils.hasScroll);
-    $watchers.off(scrollEvent);
-
-    $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent);
-  };
-
-  AttachBody.prototype._positionDropdown = function () {
-    var $window = $(window);
-
-    var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above');
-    var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below');
-
-    var newDirection = null;
-
-    var position = this.$container.position();
-    var offset = this.$container.offset();
-
-    offset.bottom = offset.top + this.$container.outerHeight(false);
-
-    var container = {
-      height: this.$container.outerHeight(false)
-    };
-
-    container.top = offset.top;
-    container.bottom = offset.top + container.height;
-
-    var dropdown = {
-      height: this.$dropdown.outerHeight(false)
-    };
-
-    var viewport = {
-      top: $window.scrollTop(),
-      bottom: $window.scrollTop() + $window.height()
-    };
-
-    var enoughRoomAbove = viewport.top < (offset.top - dropdown.height);
-    var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height);
-
-    var css = {
-      left: offset.left,
-      top: container.bottom
-    };
-
-    if (!isCurrentlyAbove && !isCurrentlyBelow) {
-      newDirection = 'below';
-    }
-
-    if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {
-      newDirection = 'above';
-    } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {
-      newDirection = 'below';
-    }
-
-    if (newDirection == 'above' ||
-      (isCurrentlyAbove && newDirection !== 'below')) {
-      css.top = container.top - dropdown.height;
-    }
-
-    if (newDirection != null) {
-      this.$dropdown
-        .removeClass('select2-dropdown--below select2-dropdown--above')
-        .addClass('select2-dropdown--' + newDirection);
-      this.$container
-        .removeClass('select2-container--below select2-container--above')
-        .addClass('select2-container--' + newDirection);
-    }
-
-    this.$dropdownContainer.css(css);
-  };
-
-  AttachBody.prototype._resizeDropdown = function () {
-    this.$dropdownContainer.width();
-
-    var css = {
-      width: this.$container.outerWidth(false) + 'px'
-    };
-
-    if (this.options.get('dropdownAutoWidth')) {
-      css.minWidth = css.width;
-      css.width = 'auto';
-    }
-
-    this.$dropdown.css(css);
-  };
-
-  AttachBody.prototype._showDropdown = function (decorated) {
-    this.$dropdownContainer.appendTo(this.$dropdownParent);
-
-    this._positionDropdown();
-    this._resizeDropdown();
-  };
-
-  return AttachBody;
-});
-
-S2.define('select2/dropdown/minimumResultsForSearch',[
-
-], function () {
-  function countResults (data) {
-    var count = 0;
-
-    for (var d = 0; d < data.length; d++) {
-      var item = data[d];
-
-      if (item.children) {
-        count += countResults(item.children);
-      } else {
-        count++;
-      }
-    }
-
-    return count;
-  }
-
-  function MinimumResultsForSearch (decorated, $element, options, dataAdapter) {
-    this.minimumResultsForSearch = options.get('minimumResultsForSearch');
-
-    if (this.minimumResultsForSearch < 0) {
-      this.minimumResultsForSearch = Infinity;
-    }
-
-    decorated.call(this, $element, options, dataAdapter);
-  }
-
-  MinimumResultsForSearch.prototype.showSearch = function (decorated, params) {
-    if (countResults(params.data.results) < this.minimumResultsForSearch) {
-      return false;
-    }
-
-    return decorated.call(this, params);
-  };
-
-  return MinimumResultsForSearch;
-});
-
-S2.define('select2/dropdown/selectOnClose',[
-
-], function () {
-  function SelectOnClose () { }
-
-  SelectOnClose.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-
-    decorated.call(this, container, $container);
-
-    container.on('close', function () {
-      self._handleSelectOnClose();
-    });
-  };
-
-  SelectOnClose.prototype._handleSelectOnClose = function () {
-    var $highlightedResults = this.getHighlightedResults();
-
-    if ($highlightedResults.length < 1) {
-      return;
-    }
-
-    this.trigger('select', {
-        data: $highlightedResults.data('data')
-    });
-  };
-
-  return SelectOnClose;
-});
-
-S2.define('select2/dropdown/closeOnSelect',[
-
-], function () {
-  function CloseOnSelect () { }
-
-  CloseOnSelect.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-
-    decorated.call(this, container, $container);
-
-    container.on('select', function (evt) {
-      self._selectTriggered(evt);
-    });
-
-    container.on('unselect', function (evt) {
-      self._selectTriggered(evt);
-    });
-  };
-
-  CloseOnSelect.prototype._selectTriggered = function (_, evt) {
-    var originalEvent = evt.originalEvent;
-
-    // Don't close if the control key is being held
-    if (originalEvent && originalEvent.ctrlKey) {
-      return;
-    }
-
-    this.trigger('close');
-  };
-
-  return CloseOnSelect;
-});
-
-S2.define('select2/i18n/en',[],function () {
-  // English
-  return {
-    errorLoading: function () {
-      return 'The results could not be loaded.';
-    },
-    inputTooLong: function (args) {
-      var overChars = args.input.length - args.maximum;
-
-      var message = 'Please delete ' + overChars + ' character';
-
-      if (overChars != 1) {
-        message += 's';
-      }
-
-      return message;
-    },
-    inputTooShort: function (args) {
-      var remainingChars = args.minimum - args.input.length;
-
-      var message = 'Please enter ' + remainingChars + ' or more characters';
-
-      return message;
-    },
-    loadingMore: function () {
-      return 'Loading more results…';
-    },
-    maximumSelected: function (args) {
-      var message = 'You can only select ' + args.maximum + ' item';
-
-      if (args.maximum != 1) {
-        message += 's';
-      }
-
-      return message;
-    },
-    noResults: function () {
-      return 'No results found';
-    },
-    searching: function () {
-      return 'Searching…';
-    }
-  };
-});
-
-S2.define('select2/defaults',[
-  'jquery',
-  'require',
-
-  './results',
-
-  './selection/single',
-  './selection/multiple',
-  './selection/placeholder',
-  './selection/allowClear',
-  './selection/search',
-  './selection/eventRelay',
-
-  './utils',
-  './translation',
-  './diacritics',
-
-  './data/select',
-  './data/array',
-  './data/ajax',
-  './data/tags',
-  './data/tokenizer',
-  './data/minimumInputLength',
-  './data/maximumInputLength',
-  './data/maximumSelectionLength',
-
-  './dropdown',
-  './dropdown/search',
-  './dropdown/hidePlaceholder',
-  './dropdown/infiniteScroll',
-  './dropdown/attachBody',
-  './dropdown/minimumResultsForSearch',
-  './dropdown/selectOnClose',
-  './dropdown/closeOnSelect',
-
-  './i18n/en'
-], function ($, require,
-
-             ResultsList,
-
-             SingleSelection, MultipleSelection, Placeholder, AllowClear,
-             SelectionSearch, EventRelay,
-
-             Utils, Translation, DIACRITICS,
-
-             SelectData, ArrayData, AjaxData, Tags, Tokenizer,
-             MinimumInputLength, MaximumInputLength, MaximumSelectionLength,
-
-             Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll,
-             AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect,
-
-             EnglishTranslation) {
-  function Defaults () {
-    this.reset();
-  }
-
-  Defaults.prototype.apply = function (options) {
-    options = $.extend({}, this.defaults, options);
-
-    if (options.dataAdapter == null) {
-      if (options.ajax != null) {
-        options.dataAdapter = AjaxData;
-      } else if (options.data != null) {
-        options.dataAdapter = ArrayData;
-      } else {
-        options.dataAdapter = SelectData;
-      }
-
-      if (options.minimumInputLength > 0) {
-        options.dataAdapter = Utils.Decorate(
-          options.dataAdapter,
-          MinimumInputLength
-        );
-      }
-
-      if (options.maximumInputLength > 0) {
-        options.dataAdapter = Utils.Decorate(
-          options.dataAdapter,
-          MaximumInputLength
-        );
-      }
-
-      if (options.maximumSelectionLength > 0) {
-        options.dataAdapter = Utils.Decorate(
-          options.dataAdapter,
-          MaximumSelectionLength
-        );
-      }
-
-      if (options.tags) {
-        options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);
-      }
-
-      if (options.tokenSeparators != null || options.tokenizer != null) {
-        options.dataAdapter = Utils.Decorate(
-          options.dataAdapter,
-          Tokenizer
-        );
-      }
-
-      if (options.query != null) {
-        var Query = require(options.amdBase + 'compat/query');
-
-        options.dataAdapter = Utils.Decorate(
-          options.dataAdapter,
-          Query
-        );
-      }
-
-      if (options.initSelection != null) {
-        var InitSelection = require(options.amdBase + 'compat/initSelection');
-
-        options.dataAdapter = Utils.Decorate(
-          options.dataAdapter,
-          InitSelection
-        );
-      }
-    }
-
-    if (options.resultsAdapter == null) {
-      options.resultsAdapter = ResultsList;
-
-      if (options.ajax != null) {
-        options.resultsAdapter = Utils.Decorate(
-          options.resultsAdapter,
-          InfiniteScroll
-        );
-      }
-
-      if (options.placeholder != null) {
-        options.resultsAdapter = Utils.Decorate(
-          options.resultsAdapter,
-          HidePlaceholder
-        );
-      }
-
-      if (options.selectOnClose) {
-        options.resultsAdapter = Utils.Decorate(
-          options.resultsAdapter,
-          SelectOnClose
-        );
-      }
-    }
-
-    if (options.dropdownAdapter == null) {
-      if (options.multiple) {
-        options.dropdownAdapter = Dropdown;
-      } else {
-        var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch);
-
-        options.dropdownAdapter = SearchableDropdown;
-      }
-
-      if (options.minimumResultsForSearch !== 0) {
-        options.dropdownAdapter = Utils.Decorate(
-          options.dropdownAdapter,
-          MinimumResultsForSearch
-        );
-      }
-
-      if (options.closeOnSelect) {
-        options.dropdownAdapter = Utils.Decorate(
-          options.dropdownAdapter,
-          CloseOnSelect
-        );
-      }
-
-      if (
-        options.dropdownCssClass != null ||
-        options.dropdownCss != null ||
-        options.adaptDropdownCssClass != null
-      ) {
-        var DropdownCSS = require(options.amdBase + 'compat/dropdownCss');
-
-        options.dropdownAdapter = Utils.Decorate(
-          options.dropdownAdapter,
-          DropdownCSS
-        );
-      }
-
-      options.dropdownAdapter = Utils.Decorate(
-        options.dropdownAdapter,
-        AttachBody
-      );
-    }
-
-    if (options.selectionAdapter == null) {
-      if (options.multiple) {
-        options.selectionAdapter = MultipleSelection;
-      } else {
-        options.selectionAdapter = SingleSelection;
-      }
-
-      // Add the placeholder mixin if a placeholder was specified
-      if (options.placeholder != null) {
-        options.selectionAdapter = Utils.Decorate(
-          options.selectionAdapter,
-          Placeholder
-        );
-      }
-
-      if (options.allowClear) {
-        options.selectionAdapter = Utils.Decorate(
-          options.selectionAdapter,
-          AllowClear
-        );
-      }
-
-      if (options.multiple) {
-        options.selectionAdapter = Utils.Decorate(
-          options.selectionAdapter,
-          SelectionSearch
-        );
-      }
-
-      if (
-        options.containerCssClass != null ||
-        options.containerCss != null ||
-        options.adaptContainerCssClass != null
-      ) {
-        var ContainerCSS = require(options.amdBase + 'compat/containerCss');
-
-        options.selectionAdapter = Utils.Decorate(
-          options.selectionAdapter,
-          ContainerCSS
-        );
-      }
-
-      options.selectionAdapter = Utils.Decorate(
-        options.selectionAdapter,
-        EventRelay
-      );
-    }
-
-    if (typeof options.language === 'string') {
-      // Check if the language is specified with a region
-      if (options.language.indexOf('-') > 0) {
-        // Extract the region information if it is included
-        var languageParts = options.language.split('-');
-        var baseLanguage = languageParts[0];
-
-        options.language = [options.language, baseLanguage];
-      } else {
-        options.language = [options.language];
-      }
-    }
-
-    if ($.isArray(options.language)) {
-      var languages = new Translation();
-      options.language.push('en');
-
-      var languageNames = options.language;
-
-      for (var l = 0; l < languageNames.length; l++) {
-        var name = languageNames[l];
-        var language = {};
-
-        try {
-          // Try to load it with the original name
-          language = Translation.loadPath(name);
-        } catch (e) {
-          try {
-            // If we couldn't load it, check if it wasn't the full path
-            name = this.defaults.amdLanguageBase + name;
-            language = Translation.loadPath(name);
-          } catch (ex) {
-            // The translation could not be loaded at all. Sometimes this is
-            // because of a configuration problem, other times this can be
-            // because of how Select2 helps load all possible translation files.
-            if (options.debug && window.console && console.warn) {
-              console.warn(
-                'Select2: The language file for "' + name + '" could not be ' +
-                'automatically loaded. A fallback will be used instead.'
-              );
-            }
-
-            continue;
-          }
-        }
-
-        languages.extend(language);
-      }
-
-      options.translations = languages;
-    } else {
-      var baseTranslation = Translation.loadPath(
-        this.defaults.amdLanguageBase + 'en'
-      );
-      var customTranslation = new Translation(options.language);
-
-      customTranslation.extend(baseTranslation);
-
-      options.translations = customTranslation;
-    }
-
-    return options;
-  };
-
-  Defaults.prototype.reset = function () {
-    function stripDiacritics (text) {
-      // Used 'uni range + named function' from http://jsperf.com/diacritics/18
-      function match(a) {
-        return DIACRITICS[a] || a;
-      }
-
-      return text.replace(/[^\u0000-\u007E]/g, match);
-    }
-
-    function matcher (params, data) {
-      // Always return the object if there is nothing to compare
-      if ($.trim(params.term) === '') {
-        return data;
-      }
-
-      // Do a recursive check for options with children
-      if (data.children && data.children.length > 0) {
-        // Clone the data object if there are children
-        // This is required as we modify the object to remove any non-matches
-        var match = $.extend(true, {}, data);
-
-        // Check each child of the option
-        for (var c = data.children.length - 1; c >= 0; c--) {
-          var child = data.children[c];
-
-          var matches = matcher(params, child);
-
-          // If there wasn't a match, remove the object in the array
-          if (matches == null) {
-            match.children.splice(c, 1);
-          }
-        }
-
-        // If any children matched, return the new object
-        if (match.children.length > 0) {
-          return match;
-        }
-
-        // If there were no matching children, check just the plain object
-        return matcher(params, match);
-      }
-
-      var original = stripDiacritics(data.text).toUpperCase();
-      var term = stripDiacritics(params.term).toUpperCase();
-
-      // Check if the text contains the term
-      if (original.indexOf(term) > -1) {
-        return data;
-      }
-
-      // If it doesn't contain the term, don't return anything
-      return null;
-    }
-
-    this.defaults = {
-      amdBase: './',
-      amdLanguageBase: './i18n/',
-      closeOnSelect: true,
-      debug: false,
-      dropdownAutoWidth: false,
-      escapeMarkup: Utils.escapeMarkup,
-      language: EnglishTranslation,
-      matcher: matcher,
-      minimumInputLength: 0,
-      maximumInputLength: 0,
-      maximumSelectionLength: 0,
-      minimumResultsForSearch: 0,
-      selectOnClose: false,
-      sorter: function (data) {
-        return data;
-      },
-      templateResult: function (result) {
-        return result.text;
-      },
-      templateSelection: function (selection) {
-        return selection.text;
-      },
-      theme: 'default',
-      width: 'resolve'
-    };
-  };
-
-  Defaults.prototype.set = function (key, value) {
-    var camelKey = $.camelCase(key);
-
-    var data = {};
-    data[camelKey] = value;
-
-    var convertedData = Utils._convertData(data);
-
-    $.extend(this.defaults, convertedData);
-  };
-
-  var defaults = new Defaults();
-
-  return defaults;
-});
-
-S2.define('select2/options',[
-  'require',
-  'jquery',
-  './defaults',
-  './utils'
-], function (require, $, Defaults, Utils) {
-  function Options (options, $element) {
-    this.options = options;
-
-    if ($element != null) {
-      this.fromElement($element);
-    }
-
-    this.options = Defaults.apply(this.options);
-
-    if ($element && $element.is('input')) {
-      var InputCompat = require(this.get('amdBase') + 'compat/inputData');
-
-      this.options.dataAdapter = Utils.Decorate(
-        this.options.dataAdapter,
-        InputCompat
-      );
-    }
-  }
-
-  Options.prototype.fromElement = function ($e) {
-    var excludedData = ['select2'];
-
-    if (this.options.multiple == null) {
-      this.options.multiple = $e.prop('multiple');
-    }
-
-    if (this.options.disabled == null) {
-      this.options.disabled = $e.prop('disabled');
-    }
-
-    if (this.options.language == null) {
-      if ($e.prop('lang')) {
-        this.options.language = $e.prop('lang').toLowerCase();
-      } else if ($e.closest('[lang]').prop('lang')) {
-        this.options.language = $e.closest('[lang]').prop('lang');
-      }
-    }
-
-    if (this.options.dir == null) {
-      if ($e.prop('dir')) {
-        this.options.dir = $e.prop('dir');
-      } else if ($e.closest('[dir]').prop('dir')) {
-        this.options.dir = $e.closest('[dir]').prop('dir');
-      } else {
-        this.options.dir = 'ltr';
-      }
-    }
-
-    $e.prop('disabled', this.options.disabled);
-    $e.prop('multiple', this.options.multiple);
-
-    if ($e.data('select2Tags')) {
-      if (this.options.debug && window.console && console.warn) {
-        console.warn(
-          'Select2: The `data-select2-tags` attribute has been changed to ' +
-          'use the `data-data` and `data-tags="true"` attributes and will be ' +
-          'removed in future versions of Select2.'
-        );
-      }
-
-      $e.data('data', $e.data('select2Tags'));
-      $e.data('tags', true);
-    }
-
-    if ($e.data('ajaxUrl')) {
-      if (this.options.debug && window.console && console.warn) {
-        console.warn(
-          'Select2: The `data-ajax-url` attribute has been changed to ' +
-          '`data-ajax--url` and support for the old attribute will be removed' +
-          ' in future versions of Select2.'
-        );
-      }
-
-      $e.attr('ajax--url', $e.data('ajaxUrl'));
-      $e.data('ajax--url', $e.data('ajaxUrl'));
-    }
-
-    var dataset = {};
-
-    // Prefer the element's `dataset` attribute if it exists
-    // jQuery 1.x does not correctly handle data attributes with multiple dashes
-    if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
-      dataset = $.extend(true, {}, $e[0].dataset, $e.data());
-    } else {
-      dataset = $e.data();
-    }
-
-    var data = $.extend(true, {}, dataset);
-
-    data = Utils._convertData(data);
-
-    for (var key in data) {
-      if ($.inArray(key, excludedData) > -1) {
-        continue;
-      }
-
-      if ($.isPlainObject(this.options[key])) {
-        $.extend(this.options[key], data[key]);
-      } else {
-        this.options[key] = data[key];
-      }
-    }
-
-    return this;
-  };
-
-  Options.prototype.get = function (key) {
-    return this.options[key];
-  };
-
-  Options.prototype.set = function (key, val) {
-    this.options[key] = val;
-  };
-
-  return Options;
-});
-
-S2.define('select2/core',[
-  'jquery',
-  './options',
-  './utils',
-  './keys'
-], function ($, Options, Utils, KEYS) {
-  var Select2 = function ($element, options) {
-    if ($element.data('select2') != null) {
-      $element.data('select2').destroy();
-    }
-
-    this.$element = $element;
-
-    this.id = this._generateId($element);
-
-    options = options || {};
-
-    this.options = new Options(options, $element);
-
-    Select2.__super__.constructor.call(this);
-
-    // Set up the tabindex
-
-    var tabindex = $element.attr('tabindex') || 0;
-    $element.data('old-tabindex', tabindex);
-    $element.attr('tabindex', '-1');
-
-    // Set up containers and adapters
-
-    var DataAdapter = this.options.get('dataAdapter');
-    this.dataAdapter = new DataAdapter($element, this.options);
-
-    var $container = this.render();
-
-    this._placeContainer($container);
-
-    var SelectionAdapter = this.options.get('selectionAdapter');
-    this.selection = new SelectionAdapter($element, this.options);
-    this.$selection = this.selection.render();
-
-    this.selection.position(this.$selection, $container);
-
-    var DropdownAdapter = this.options.get('dropdownAdapter');
-    this.dropdown = new DropdownAdapter($element, this.options);
-    this.$dropdown = this.dropdown.render();
-
-    this.dropdown.position(this.$dropdown, $container);
-
-    var ResultsAdapter = this.options.get('resultsAdapter');
-    this.results = new ResultsAdapter($element, this.options, this.dataAdapter);
-    this.$results = this.results.render();
-
-    this.results.position(this.$results, this.$dropdown);
-
-    // Bind events
-
-    var self = this;
-
-    // Bind the container to all of the adapters
-    this._bindAdapters();
-
-    // Register any DOM event handlers
-    this._registerDomEvents();
-
-    // Register any internal event handlers
-    this._registerDataEvents();
-    this._registerSelectionEvents();
-    this._registerDropdownEvents();
-    this._registerResultsEvents();
-    this._registerEvents();
-
-    // Set the initial state
-    this.dataAdapter.current(function (initialData) {
-      self.trigger('selection:update', {
-        data: initialData
-      });
-    });
-
-    // Hide the original select
-    $element.addClass('select2-hidden-accessible');
-	$element.attr('aria-hidden', 'true');
-	
-    // Synchronize any monitored attributes
-    this._syncAttributes();
-
-    $element.data('select2', this);
-  };
-
-  Utils.Extend(Select2, Utils.Observable);
-
-  Select2.prototype._generateId = function ($element) {
-    var id = '';
-
-    if ($element.attr('id') != null) {
-      id = $element.attr('id');
-    } else if ($element.attr('name') != null) {
-      id = $element.attr('name') + '-' + Utils.generateChars(2);
-    } else {
-      id = Utils.generateChars(4);
-    }
-
-    id = 'select2-' + id;
-
-    return id;
-  };
-
-  Select2.prototype._placeContainer = function ($container) {
-    $container.insertAfter(this.$element);
-
-    var width = this._resolveWidth(this.$element, this.options.get('width'));
-
-    if (width != null) {
-      $container.css('width', width);
-    }
-  };
-
-  Select2.prototype._resolveWidth = function ($element, method) {
-    var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;
-
-    if (method == 'resolve') {
-      var styleWidth = this._resolveWidth($element, 'style');
-
-      if (styleWidth != null) {
-        return styleWidth;
-      }
-
-      return this._resolveWidth($element, 'element');
-    }
-
-    if (method == 'element') {
-      var elementWidth = $element.outerWidth(false);
-
-      if (elementWidth <= 0) {
-        return 'auto';
-      }
-
-      return elementWidth + 'px';
-    }
-
-    if (method == 'style') {
-      var style = $element.attr('style');
-
-      if (typeof(style) !== 'string') {
-        return null;
-      }
-
-      var attrs = style.split(';');
-
-      for (var i = 0, l = attrs.length; i < l; i = i + 1) {
-        var attr = attrs[i].replace(/\s/g, '');
-        var matches = attr.match(WIDTH);
-
-        if (matches !== null && matches.length >= 1) {
-          return matches[1];
-        }
-      }
-
-      return null;
-    }
-
-    return method;
-  };
-
-  Select2.prototype._bindAdapters = function () {
-    this.dataAdapter.bind(this, this.$container);
-    this.selection.bind(this, this.$container);
-
-    this.dropdown.bind(this, this.$container);
-    this.results.bind(this, this.$container);
-  };
-
-  Select2.prototype._registerDomEvents = function () {
-    var self = this;
-
-    this.$element.on('change.select2', function () {
-      self.dataAdapter.current(function (data) {
-        self.trigger('selection:update', {
-          data: data
-        });
-      });
-    });
-
-    this._sync = Utils.bind(this._syncAttributes, this);
-
-    if (this.$element[0].attachEvent) {
-      this.$element[0].attachEvent('onpropertychange', this._sync);
-    }
-
-    var observer = window.MutationObserver ||
-      window.WebKitMutationObserver ||
-      window.MozMutationObserver
-    ;
-
-    if (observer != null) {
-      this._observer = new observer(function (mutations) {
-        $.each(mutations, self._sync);
-      });
-      this._observer.observe(this.$element[0], {
-        attributes: true,
-        subtree: false
-      });
-    } else if (this.$element[0].addEventListener) {
-      this.$element[0].addEventListener('DOMAttrModified', self._sync, false);
-    }
-  };
-
-  Select2.prototype._registerDataEvents = function () {
-    var self = this;
-
-    this.dataAdapter.on('*', function (name, params) {
-      self.trigger(name, params);
-    });
-  };
-
-  Select2.prototype._registerSelectionEvents = function () {
-    var self = this;
-    var nonRelayEvents = ['toggle'];
-
-    this.selection.on('toggle', function () {
-      self.toggleDropdown();
-    });
-
-    this.selection.on('*', function (name, params) {
-      if ($.inArray(name, nonRelayEvents) !== -1) {
-        return;
-      }
-
-      self.trigger(name, params);
-    });
-  };
-
-  Select2.prototype._registerDropdownEvents = function () {
-    var self = this;
-
-    this.dropdown.on('*', function (name, params) {
-      self.trigger(name, params);
-    });
-  };
-
-  Select2.prototype._registerResultsEvents = function () {
-    var self = this;
-
-    this.results.on('*', function (name, params) {
-      self.trigger(name, params);
-    });
-  };
-
-  Select2.prototype._registerEvents = function () {
-    var self = this;
-
-    this.on('open', function () {
-      self.$container.addClass('select2-container--open');
-    });
-
-    this.on('close', function () {
-      self.$container.removeClass('select2-container--open');
-    });
-
-    this.on('enable', function () {
-      self.$container.removeClass('select2-container--disabled');
-    });
-
-    this.on('disable', function () {
-      self.$container.addClass('select2-container--disabled');
-    });
-
-    this.on('focus', function () {
-      self.$container.addClass('select2-container--focus');
-    });
-
-    this.on('blur', function () {
-      self.$container.removeClass('select2-container--focus');
-    });
-
-    this.on('query', function (params) {
-      if (!self.isOpen()) {
-        self.trigger('open');
-      }
-
-      this.dataAdapter.query(params, function (data) {
-        self.trigger('results:all', {
-          data: data,
-          query: params
-        });
-      });
-    });
-
-    this.on('query:append', function (params) {
-      this.dataAdapter.query(params, function (data) {
-        self.trigger('results:append', {
-          data: data,
-          query: params
-        });
-      });
-    });
-
-    this.on('keypress', function (evt) {
-      var key = evt.which;
-
-      if (self.isOpen()) {
-        if (key === KEYS.ENTER) {
-          self.trigger('results:select');
-
-          evt.preventDefault();
-        } else if ((key === KEYS.SPACE && evt.ctrlKey)) {
-          self.trigger('results:toggle');
-
-          evt.preventDefault();
-        } else if (key === KEYS.UP) {
-          self.trigger('results:previous');
-
-          evt.preventDefault();
-        } else if (key === KEYS.DOWN) {
-          self.trigger('results:next');
-
-          evt.preventDefault();
-        } else if (key === KEYS.ESC || key === KEYS.TAB) {
-          self.close();
-
-          evt.preventDefault();
-        }
-      } else {
-        if (key === KEYS.ENTER || key === KEYS.SPACE ||
-            ((key === KEYS.DOWN || key === KEYS.UP) && evt.altKey)) {
-          self.open();
-
-          evt.preventDefault();
-        }
-      }
-    });
-  };
-
-  Select2.prototype._syncAttributes = function () {
-    this.options.set('disabled', this.$element.prop('disabled'));
-
-    if (this.options.get('disabled')) {
-      if (this.isOpen()) {
-        this.close();
-      }
-
-      this.trigger('disable');
-    } else {
-      this.trigger('enable');
-    }
-  };
-
-  /**
-   * Override the trigger method to automatically trigger pre-events when
-   * there are events that can be prevented.
-   */
-  Select2.prototype.trigger = function (name, args) {
-    var actualTrigger = Select2.__super__.trigger;
-    var preTriggerMap = {
-      'open': 'opening',
-      'close': 'closing',
-      'select': 'selecting',
-      'unselect': 'unselecting'
-    };
-
-    if (name in preTriggerMap) {
-      var preTriggerName = preTriggerMap[name];
-      var preTriggerArgs = {
-        prevented: false,
-        name: name,
-        args: args
-      };
-
-      actualTrigger.call(this, preTriggerName, preTriggerArgs);
-
-      if (preTriggerArgs.prevented) {
-        args.prevented = true;
-
-        return;
-      }
-    }
-
-    actualTrigger.call(this, name, args);
-  };
-
-  Select2.prototype.toggleDropdown = function () {
-    if (this.options.get('disabled')) {
-      return;
-    }
-
-    if (this.isOpen()) {
-      this.close();
-    } else {
-      this.open();
-    }
-  };
-
-  Select2.prototype.open = function () {
-    if (this.isOpen()) {
-      return;
-    }
-
-    this.trigger('query', {});
-
-    this.trigger('open');
-  };
-
-  Select2.prototype.close = function () {
-    if (!this.isOpen()) {
-      return;
-    }
-
-    this.trigger('close');
-  };
-
-  Select2.prototype.isOpen = function () {
-    return this.$container.hasClass('select2-container--open');
-  };
-
-  Select2.prototype.enable = function (args) {
-    if (this.options.get('debug') && window.console && console.warn) {
-      console.warn(
-        'Select2: The `select2("enable")` method has been deprecated and will' +
-        ' be removed in later Select2 versions. Use $element.prop("disabled")' +
-        ' instead.'
-      );
-    }
-
-    if (args == null || args.length === 0) {
-      args = [true];
-    }
-
-    var disabled = !args[0];
-
-    this.$element.prop('disabled', disabled);
-  };
-
-  Select2.prototype.data = function () {
-    if (this.options.get('debug') &&
-        arguments.length > 0 && window.console && console.warn) {
-      console.warn(
-        'Select2: Data can no longer be set using `select2("data")`. You ' +
-        'should consider setting the value instead using `$element.val()`.'
-      );
-    }
-
-    var data = [];
-
-    this.dataAdapter.current(function (currentData) {
-      data = currentData;
-    });
-
-    return data;
-  };
-
-  Select2.prototype.val = function (args) {
-    if (this.options.get('debug') && window.console && console.warn) {
-      console.warn(
-        'Select2: The `select2("val")` method has been deprecated and will be' +
-        ' removed in later Select2 versions. Use $element.val() instead.'
-      );
-    }
-
-    if (args == null || args.length === 0) {
-      return this.$element.val();
-    }
-
-    var newVal = args[0];
-
-    if ($.isArray(newVal)) {
-      newVal = $.map(newVal, function (obj) {
-        return obj.toString();
-      });
-    }
-
-    this.$element.val(newVal).trigger('change');
-  };
-
-  Select2.prototype.destroy = function () {
-    this.$container.remove();
-
-    if (this.$element[0].detachEvent) {
-      this.$element[0].detachEvent('onpropertychange', this._sync);
-    }
-
-    if (this._observer != null) {
-      this._observer.disconnect();
-      this._observer = null;
-    } else if (this.$element[0].removeEventListener) {
-      this.$element[0]
-        .removeEventListener('DOMAttrModified', this._sync, false);
-    }
-
-    this._sync = null;
-
-    this.$element.off('.select2');
-    this.$element.attr('tabindex', this.$element.data('old-tabindex'));
-
-    this.$element.removeClass('select2-hidden-accessible');
-	this.$element.attr('aria-hidden', 'false');
-    this.$element.removeData('select2');
-
-    this.dataAdapter.destroy();
-    this.selection.destroy();
-    this.dropdown.destroy();
-    this.results.destroy();
-
-    this.dataAdapter = null;
-    this.selection = null;
-    this.dropdown = null;
-    this.results = null;
-  };
-
-  Select2.prototype.render = function () {
-    var $container = $(
-      '<span class="select2 select2-container">' +
-        '<span class="selection"></span>' +
-        '<span class="dropdown-wrapper" aria-hidden="true"></span>' +
-      '</span>'
-    );
-
-    $container.attr('dir', this.options.get('dir'));
-
-    this.$container = $container;
-
-    this.$container.addClass('select2-container--' + this.options.get('theme'));
-
-    $container.data('element', this.$element);
-
-    return $container;
-  };
-
-  return Select2;
-});
-
-S2.define('select2/compat/utils',[
-  'jquery'
-], function ($) {
-  function syncCssClasses ($dest, $src, adapter) {
-    var classes, replacements = [], adapted;
-
-    classes = $.trim($dest.attr('class'));
-
-    if (classes) {
-      classes = '' + classes; // for IE which returns object
-
-      $(classes.split(/\s+/)).each(function () {
-        // Save all Select2 classes
-        if (this.indexOf('select2-') === 0) {
-          replacements.push(this);
-        }
-      });
-    }
-
-    classes = $.trim($src.attr('class'));
-
-    if (classes) {
-      classes = '' + classes; // for IE which returns object
-
-      $(classes.split(/\s+/)).each(function () {
-        // Only adapt non-Select2 classes
-        if (this.indexOf('select2-') !== 0) {
-          adapted = adapter(this);
-
-          if (adapted != null) {
-            replacements.push(adapted);
-          }
-        }
-      });
-    }
-
-    $dest.attr('class', replacements.join(' '));
-  }
-
-  return {
-    syncCssClasses: syncCssClasses
-  };
-});
-
-S2.define('select2/compat/containerCss',[
-  'jquery',
-  './utils'
-], function ($, CompatUtils) {
-  // No-op CSS adapter that discards all classes by default
-  function _containerAdapter (clazz) {
-    return null;
-  }
-
-  function ContainerCSS () { }
-
-  ContainerCSS.prototype.render = function (decorated) {
-    var $container = decorated.call(this);
-
-    var containerCssClass = this.options.get('containerCssClass') || '';
-
-    if ($.isFunction(containerCssClass)) {
-      containerCssClass = containerCssClass(this.$element);
-    }
-
-    var containerCssAdapter = this.options.get('adaptContainerCssClass');
-    containerCssAdapter = containerCssAdapter || _containerAdapter;
-
-    if (containerCssClass.indexOf(':all:') !== -1) {
-      containerCssClass = containerCssClass.replace(':all', '');
-
-      var _cssAdapter = containerCssAdapter;
-
-      containerCssAdapter = function (clazz) {
-        var adapted = _cssAdapter(clazz);
-
-        if (adapted != null) {
-          // Append the old one along with the adapted one
-          return adapted + ' ' + clazz;
-        }
-
-        return clazz;
-      };
-    }
-
-    var containerCss = this.options.get('containerCss') || {};
-
-    if ($.isFunction(containerCss)) {
-      containerCss = containerCss(this.$element);
-    }
-
-    CompatUtils.syncCssClasses($container, this.$element, containerCssAdapter);
-
-    $container.css(containerCss);
-    $container.addClass(containerCssClass);
-
-    return $container;
-  };
-
-  return ContainerCSS;
-});
-
-S2.define('select2/compat/dropdownCss',[
-  'jquery',
-  './utils'
-], function ($, CompatUtils) {
-  // No-op CSS adapter that discards all classes by default
-  function _dropdownAdapter (clazz) {
-    return null;
-  }
-
-  function DropdownCSS () { }
-
-  DropdownCSS.prototype.render = function (decorated) {
-    var $dropdown = decorated.call(this);
-
-    var dropdownCssClass = this.options.get('dropdownCssClass') || '';
-
-    if ($.isFunction(dropdownCssClass)) {
-      dropdownCssClass = dropdownCssClass(this.$element);
-    }
-
-    var dropdownCssAdapter = this.options.get('adaptDropdownCssClass');
-    dropdownCssAdapter = dropdownCssAdapter || _dropdownAdapter;
-
-    if (dropdownCssClass.indexOf(':all:') !== -1) {
-      dropdownCssClass = dropdownCssClass.replace(':all', '');
-
-      var _cssAdapter = dropdownCssAdapter;
-
-      dropdownCssAdapter = function (clazz) {
-        var adapted = _cssAdapter(clazz);
-
-        if (adapted != null) {
-          // Append the old one along with the adapted one
-          return adapted + ' ' + clazz;
-        }
-
-        return clazz;
-      };
-    }
-
-    var dropdownCss = this.options.get('dropdownCss') || {};
-
-    if ($.isFunction(dropdownCss)) {
-      dropdownCss = dropdownCss(this.$element);
-    }
-
-    CompatUtils.syncCssClasses($dropdown, this.$element, dropdownCssAdapter);
-
-    $dropdown.css(dropdownCss);
-    $dropdown.addClass(dropdownCssClass);
-
-    return $dropdown;
-  };
-
-  return DropdownCSS;
-});
-
-S2.define('select2/compat/initSelection',[
-  'jquery'
-], function ($) {
-  function InitSelection (decorated, $element, options) {
-    if (options.get('debug') && window.console && console.warn) {
-      console.warn(
-        'Select2: The `initSelection` option has been deprecated in favor' +
-        ' of a custom data adapter that overrides the `current` method. ' +
-        'This method is now called multiple times instead of a single ' +
-        'time when the instance is initialized. Support will be removed ' +
-        'for the `initSelection` option in future versions of Select2'
-      );
-    }
-
-    this.initSelection = options.get('initSelection');
-    this._isInitialized = false;
-
-    decorated.call(this, $element, options);
-  }
-
-  InitSelection.prototype.current = function (decorated, callback) {
-    var self = this;
-
-    if (this._isInitialized) {
-      decorated.call(this, callback);
-
-      return;
-    }
-
-    this.initSelection.call(null, this.$element, function (data) {
-      self._isInitialized = true;
-
-      if (!$.isArray(data)) {
-        data = [data];
-      }
-
-      callback(data);
-    });
-  };
-
-  return InitSelection;
-});
-
-S2.define('select2/compat/inputData',[
-  'jquery'
-], function ($) {
-  function InputData (decorated, $element, options) {
-    this._currentData = [];
-    this._valueSeparator = options.get('valueSeparator') || ',';
-
-    if ($element.prop('type') === 'hidden') {
-      if (options.get('debug') && console && console.warn) {
-        console.warn(
-          'Select2: Using a hidden input with Select2 is no longer ' +
-          'supported and may stop working in the future. It is recommended ' +
-          'to use a `<select>` element instead.'
-        );
-      }
-    }
-
-    decorated.call(this, $element, options);
-  }
-
-  InputData.prototype.current = function (_, callback) {
-    function getSelected (data, selectedIds) {
-      var selected = [];
-
-      if (data.selected || $.inArray(data.id, selectedIds) !== -1) {
-        data.selected = true;
-        selected.push(data);
-      } else {
-        data.selected = false;
-      }
-
-      if (data.children) {
-        selected.push.apply(selected, getSelected(data.children, selectedIds));
-      }
-
-      return selected;
-    }
-
-    var selected = [];
-
-    for (var d = 0; d < this._currentData.length; d++) {
-      var data = this._currentData[d];
-
-      selected.push.apply(
-        selected,
-        getSelected(
-          data,
-          this.$element.val().split(
-            this._valueSeparator
-          )
-        )
-      );
-    }
-
-    callback(selected);
-  };
-
-  InputData.prototype.select = function (_, data) {
-    if (!this.options.get('multiple')) {
-      this.current(function (allData) {
-        $.map(allData, function (data) {
-          data.selected = false;
-        });
-      });
-
-      this.$element.val(data.id);
-      this.$element.trigger('change');
-    } else {
-      var value = this.$element.val();
-      value += this._valueSeparator + data.id;
-
-      this.$element.val(value);
-      this.$element.trigger('change');
-    }
-  };
-
-  InputData.prototype.unselect = function (_, data) {
-    var self = this;
-
-    data.selected = false;
-
-    this.current(function (allData) {
-      var values = [];
-
-      for (var d = 0; d < allData.length; d++) {
-        var item = allData[d];
-
-        if (data.id == item.id) {
-          continue;
-        }
-
-        values.push(item.id);
-      }
-
-      self.$element.val(values.join(self._valueSeparator));
-      self.$element.trigger('change');
-    });
-  };
-
-  InputData.prototype.query = function (_, params, callback) {
-    var results = [];
-
-    for (var d = 0; d < this._currentData.length; d++) {
-      var data = this._currentData[d];
-
-      var matches = this.matches(params, data);
-
-      if (matches !== null) {
-        results.push(matches);
-      }
-    }
-
-    callback({
-      results: results
-    });
-  };
-
-  InputData.prototype.addOptions = function (_, $options) {
-    var options = $.map($options, function ($option) {
-      return $.data($option[0], 'data');
-    });
-
-    this._currentData.push.apply(this._currentData, options);
-  };
-
-  return InputData;
-});
-
-S2.define('select2/compat/matcher',[
-  'jquery'
-], function ($) {
-  function oldMatcher (matcher) {
-    function wrappedMatcher (params, data) {
-      var match = $.extend(true, {}, data);
-
-      if (params.term == null || $.trim(params.term) === '') {
-        return match;
-      }
-
-      if (data.children) {
-        for (var c = data.children.length - 1; c >= 0; c--) {
-          var child = data.children[c];
-
-          // Check if the child object matches
-          // The old matcher returned a boolean true or false
-          var doesMatch = matcher(params.term, child.text, child);
-
-          // If the child didn't match, pop it off
-          if (!doesMatch) {
-            match.children.splice(c, 1);
-          }
-        }
-
-        if (match.children.length > 0) {
-          return match;
-        }
-      }
-
-      if (matcher(params.term, data.text, data)) {
-        return match;
-      }
-
-      return null;
-    }
-
-    return wrappedMatcher;
-  }
-
-  return oldMatcher;
-});
-
-S2.define('select2/compat/query',[
-
-], function () {
-  function Query (decorated, $element, options) {
-    if (options.get('debug') && window.console && console.warn) {
-      console.warn(
-        'Select2: The `query` option has been deprecated in favor of a ' +
-        'custom data adapter that overrides the `query` method. Support ' +
-        'will be removed for the `query` option in future versions of ' +
-        'Select2.'
-      );
-    }
-
-    decorated.call(this, $element, options);
-  }
-
-  Query.prototype.query = function (_, params, callback) {
-    params.callback = callback;
-
-    var query = this.options.get('query');
-
-    query.call(null, params);
-  };
-
-  return Query;
-});
-
-S2.define('select2/dropdown/attachContainer',[
-
-], function () {
-  function AttachContainer (decorated, $element, options) {
-    decorated.call(this, $element, options);
-  }
-
-  AttachContainer.prototype.position =
-    function (decorated, $dropdown, $container) {
-    var $dropdownContainer = $container.find('.dropdown-wrapper');
-    $dropdownContainer.append($dropdown);
-
-    $dropdown.addClass('select2-dropdown--below');
-    $container.addClass('select2-container--below');
-  };
-
-  return AttachContainer;
-});
-
-S2.define('select2/dropdown/stopPropagation',[
-
-], function () {
-  function StopPropagation () { }
-
-  StopPropagation.prototype.bind = function (decorated, container, $container) {
-    decorated.call(this, container, $container);
-
-    var stoppedEvents = [
-    'blur',
-    'change',
-    'click',
-    'dblclick',
-    'focus',
-    'focusin',
-    'focusout',
-    'input',
-    'keydown',
-    'keyup',
-    'keypress',
-    'mousedown',
-    'mouseenter',
-    'mouseleave',
-    'mousemove',
-    'mouseover',
-    'mouseup',
-    'search',
-    'touchend',
-    'touchstart'
-    ];
-
-    this.$dropdown.on(stoppedEvents.join(' '), function (evt) {
-      evt.stopPropagation();
-    });
-  };
-
-  return StopPropagation;
-});
-
-S2.define('select2/selection/stopPropagation',[
-
-], function () {
-  function StopPropagation () { }
-
-  StopPropagation.prototype.bind = function (decorated, container, $container) {
-    decorated.call(this, container, $container);
-
-    var stoppedEvents = [
-      'blur',
-      'change',
-      'click',
-      'dblclick',
-      'focus',
-      'focusin',
-      'focusout',
-      'input',
-      'keydown',
-      'keyup',
-      'keypress',
-      'mousedown',
-      'mouseenter',
-      'mouseleave',
-      'mousemove',
-      'mouseover',
-      'mouseup',
-      'search',
-      'touchend',
-      'touchstart'
-    ];
-
-    this.$selection.on(stoppedEvents.join(' '), function (evt) {
-      evt.stopPropagation();
-    });
-  };
-
-  return StopPropagation;
-});
-
-S2.define('jquery.select2',[
-  'jquery',
-  'require',
-
-  './select2/core',
-  './select2/defaults'
-], function ($, require, Select2, Defaults) {
-  // Force jQuery.mousewheel to be loaded if it hasn't already
-  require('jquery.mousewheel');
-
-  if ($.fn.select2 == null) {
-    // All methods that should return the element
-    var thisMethods = ['open', 'close', 'destroy'];
-
-    $.fn.select2 = function (options) {
-      options = options || {};
-
-      if (typeof options === 'object') {
-        this.each(function () {
-          var instanceOptions = $.extend({}, options, true);
-
-          var instance = new Select2($(this), instanceOptions);
-        });
-
-        return this;
-      } else if (typeof options === 'string') {
-        var instance = this.data('select2');
-
-        if (instance == null && window.console && console.error) {
-          console.error(
-            'The select2(\'' + options + '\') method was called on an ' +
-            'element that is not using Select2.'
-          );
-        }
-
-        var args = Array.prototype.slice.call(arguments, 1);
-
-        var ret = instance[options](args);
-
-        // Check if we should be returning `this`
-        if ($.inArray(options, thisMethods) > -1) {
-          return this;
-        }
-
-        return ret;
-      } else {
-        throw new Error('Invalid arguments for Select2: ' + options);
-      }
-    };
-  }
-
-  if ($.fn.select2.defaults == null) {
-    $.fn.select2.defaults = Defaults;
-  }
-
-  return Select2;
-});
-
-/*!
- * jQuery Mousewheel 3.1.12
- *
- * Copyright 2014 jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-(function (factory) {
-    if ( typeof S2.define === 'function' && S2.define.amd ) {
-        // AMD. Register as an anonymous module.
-        S2.define('jquery.mousewheel',['jquery'], factory);
-    } else if (typeof exports === 'object') {
-        // Node/CommonJS style for Browserify
-        module.exports = factory;
-    } else {
-        // Browser globals
-        factory(jQuery);
-    }
-}(function ($) {
-
-    var toFix  = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],
-        toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?
-                    ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],
-        slice  = Array.prototype.slice,
-        nullLowestDeltaTimeout, lowestDelta;
-
-    if ( $.event.fixHooks ) {
-        for ( var i = toFix.length; i; ) {
-            $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;
-        }
-    }
-
-    var special = $.event.special.mousewheel = {
-        version: '3.1.12',
-
-        setup: function() {
-            if ( this.addEventListener ) {
-                for ( var i = toBind.length; i; ) {
-                    this.addEventListener( toBind[--i], handler, false );
-                }
-            } else {
-                this.onmousewheel = handler;
-            }
-            // Store the line height and page height for this particular element
-            $.data(this, 'mousewheel-line-height', special.getLineHeight(this));
-            $.data(this, 'mousewheel-page-height', special.getPageHeight(this));
-        },
-
-        teardown: function() {
-            if ( this.removeEventListener ) {
-                for ( var i = toBind.length; i; ) {
-                    this.removeEventListener( toBind[--i], handler, false );
-                }
-            } else {
-                this.onmousewheel = null;
-            }
-            // Clean up the data we added to the element
-            $.removeData(this, 'mousewheel-line-height');
-            $.removeData(this, 'mousewheel-page-height');
-        },
-
-        getLineHeight: function(elem) {
-            var $elem = $(elem),
-                $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent']();
-            if (!$parent.length) {
-                $parent = $('body');
-            }
-            return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16;
-        },
-
-        getPageHeight: function(elem) {
-            return $(elem).height();
-        },
-
-        settings: {
-            adjustOldDeltas: true, // see shouldAdjustOldDeltas() below
-            normalizeOffset: true  // calls getBoundingClientRect for each event
-        }
-    };
-
-    $.fn.extend({
-        mousewheel: function(fn) {
-            return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');
-        },
-
-        unmousewheel: function(fn) {
-            return this.unbind('mousewheel', fn);
-        }
-    });
-
-
-    function handler(event) {
-        var orgEvent   = event || window.event,
-            args       = slice.call(arguments, 1),
-            delta      = 0,
-            deltaX     = 0,
-            deltaY     = 0,
-            absDelta   = 0,
-            offsetX    = 0,
-            offsetY    = 0;
-        event = $.event.fix(orgEvent);
-        event.type = 'mousewheel';
-
-        // Old school scrollwheel delta
-        if ( 'detail'      in orgEvent ) { deltaY = orgEvent.detail * -1;      }
-        if ( 'wheelDelta'  in orgEvent ) { deltaY = orgEvent.wheelDelta;       }
-        if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY;      }
-        if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }
-
-        // Firefox < 17 horizontal scrolling related to DOMMouseScroll event
-        if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {
-            deltaX = deltaY * -1;
-            deltaY = 0;
-        }
-
-        // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy
-        delta = deltaY === 0 ? deltaX : deltaY;
-
-        // New school wheel delta (wheel event)
-        if ( 'deltaY' in orgEvent ) {
-            deltaY = orgEvent.deltaY * -1;
-            delta  = deltaY;
-        }
-        if ( 'deltaX' in orgEvent ) {
-            deltaX = orgEvent.deltaX;
-            if ( deltaY === 0 ) { delta  = deltaX * -1; }
-        }
-
-        // No change actually happened, no reason to go any further
-        if ( deltaY === 0 && deltaX === 0 ) { return; }
-
-        // Need to convert lines and pages to pixels if we aren't already in pixels
-        // There are three delta modes:
-        //   * deltaMode 0 is by pixels, nothing to do
-        //   * deltaMode 1 is by lines
-        //   * deltaMode 2 is by pages
-        if ( orgEvent.deltaMode === 1 ) {
-            var lineHeight = $.data(this, 'mousewheel-line-height');
-            delta  *= lineHeight;
-            deltaY *= lineHeight;
-            deltaX *= lineHeight;
-        } else if ( orgEvent.deltaMode === 2 ) {
-            var pageHeight = $.data(this, 'mousewheel-page-height');
-            delta  *= pageHeight;
-            deltaY *= pageHeight;
-            deltaX *= pageHeight;
-        }
-
-        // Store lowest absolute delta to normalize the delta values
-        absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );
-
-        if ( !lowestDelta || absDelta < lowestDelta ) {
-            lowestDelta = absDelta;
-
-            // Adjust older deltas if necessary
-            if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
-                lowestDelta /= 40;
-            }
-        }
-
-        // Adjust older deltas if necessary
-        if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
-            // Divide all the things by 40!
-            delta  /= 40;
-            deltaX /= 40;
-            deltaY /= 40;
-        }
-
-        // Get a whole, normalized value for the deltas
-        delta  = Math[ delta  >= 1 ? 'floor' : 'ceil' ](delta  / lowestDelta);
-        deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);
-        deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);
-
-        // Normalise offsetX and offsetY properties
-        if ( special.settings.normalizeOffset && this.getBoundingClientRect ) {
-            var boundingRect = this.getBoundingClientRect();
-            offsetX = event.clientX - boundingRect.left;
-            offsetY = event.clientY - boundingRect.top;
-        }
-
-        // Add information to the event object
-        event.deltaX = deltaX;
-        event.deltaY = deltaY;
-        event.deltaFactor = lowestDelta;
-        event.offsetX = offsetX;
-        event.offsetY = offsetY;
-        // Go ahead and set deltaMode to 0 since we converted to pixels
-        // Although this is a little odd since we overwrite the deltaX/Y
-        // properties with normalized deltas.
-        event.deltaMode = 0;
-
-        // Add event and delta to the front of the arguments
-        args.unshift(event, delta, deltaX, deltaY);
-
-        // Clearout lowestDelta after sometime to better
-        // handle multiple device types that give different
-        // a different lowestDelta
-        // Ex: trackpad = 3 and mouse wheel = 120
-        if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }
-        nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);
-
-        return ($.event.dispatch || $.event.handle).apply(this, args);
-    }
-
-    function nullLowestDelta() {
-        lowestDelta = null;
-    }
-
-    function shouldAdjustOldDeltas(orgEvent, absDelta) {
-        // If this is an older event and the delta is divisable by 120,
-        // then we are assuming that the browser is treating this as an
-        // older mouse wheel event and that we should divide the deltas
-        // by 40 to try and get a more usable deltaFactor.
-        // Side note, this actually impacts the reported scroll distance
-        // in older browsers and can cause scrolling to be slower than native.
-        // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false.
-        return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0;
-    }
-
-}));
-
-  // Return the AMD loader configuration so it can be used outside of this file
-  return {
-    define: S2.define,
-    require: S2.require
-  };
-}());
-
-  // Autoload the jQuery bindings
-  // We know that all of the modules exist above this, so we're safe
-  var select2 = S2.require('jquery.select2');
-
-  // Hold the AMD module references on the jQuery function that was just loaded
-  // This allows Select2 to use the internal loader outside of this file, such
-  // as in the language files.
-  jQuery.fn.select2.amd = S2;
-
-  // Return the Select2 instance for anyone who is importing it.
-  return select2;
-}));
diff --git a/app/assets/stylesheets/application.css.scss b/app/assets/stylesheets/application.css.scss
deleted file mode 100644
index 9342e9a7227e8166fe65e3e550b642cc473714df..0000000000000000000000000000000000000000
--- a/app/assets/stylesheets/application.css.scss
+++ /dev/null
@@ -1,461 +0,0 @@
-/*
- * This is a manifest file that'll be compiled into application.css, which will include all the files
- * listed below.
- *
- * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
- * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
- *
- * You're free to add application-wide styles to this file and they'll appear at the bottom of the
- * compiled file so the styles you add here take precedence over styles defined in any styles
- * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
- * file per style scope.
- *
- *= require_tree ./application
- *= require_self
- *= require_tree ./search
- */
-@import "bootstrap-sprockets";
-@import "bootstrap";
-
-
-/* Alto Contraste*/
-
-.alto-contraste{
-  background-color: black;
-  color: white;
-}
-
-.searchbar-contraste{
-  background-color: black;
-  color: white;
-  background-image: none !important;
-}
-.link-contraste{
-  color: yellow !important;
-  text-decoration: underline;
-}
-
-.footer-contraste{
-  background-color: black !important;
-  color: white;
-}
-
-.dropdown-menu-contrast{
-  background-color: black !important;
-  border: 1px solid white;
-}
-.general_highlights-contrast{
-  border: 1px solid white;
-}
-/*---------------*/
-
-.padding-left-0{
-  padding-left: 0 !important;
-}
-.padding-right-0{
-  padding-right: 0 !important;
-}
-.general_highlights{
-  padding-bottom: 20px;
-  padding-left: 0px;
-}
-.font_roboto_light{
-  font-family: 'Roboto', sans-serif;
-}
-#mec_portais{
-  background-color: #2E3192;
-  width: 100px;
-  height: 50px;
-}
-#mec_portais2{
-  background-color: #2E3192;
-  width: 100px;
-  height: 50px;
-  margin-left: 5px;
-}
-.rede_social{
-  width: 30px;
-  height: 30px;
-  border-radius: 5px;
-}
-#rede_social1{
-  background-color: #2E3192;
-}
-#rede_social2{
-  background-color: #C01A2C;
-  margin-left: 5px;
-}
-#rede_social3{
-  background-color: #00ADEF;
-  margin-left: 5px;
-}
-#rede_social4{
-  background-color: #6A5E50;
-  margin-left: 5px;
-}
-
-#barra-brasil .brasil-flag{
-  height: 50px !important;
-}
-#faq_div{
-    margin-left: 175px;
-}
-#faq_question{
-  color: orange;
-  font-weight: bold;
-}
-
-html,
-body {
-	margin:0;
-	padding:0;
-	height:100%;
-}
-#wrapper {
-	min-height:100%;
-	position:relative;
-  display: flex;
-  flex-direction: column;
-}
-#header {
-	padding:10px;
-}
-#content {
-  flex: 1;
-}
-#footer {
-	width:100%;
-	height:100px;
-	position:relative;
-	bottom:0;
-	left:0;
-  padding-top: 50px;
-	border-width: 0px;
-	color: #FFF;
-
-	.main{
-		background-color: #313131;
-		padding: 16px;
-    min-height: 256px;
-	}
-
-	.footerbar{
-		padding: 16px;
-		background-color: #080808;
-	}
-}
-
-
-
-
-$color_low: #000000;
-
-.navbar{
-	margin-bottom: 0px;
-}
-
-
-header{
-	.searchbar{
-		color: #FFF;
-		background-image: linear-gradient(to bottom, #256e46, #457f3c);
-		padding: 8px;
-		padding-bottom: 32px;
-		margin: 0px;
-		a{
-			margin: 0px;
-			color: #FFF;
-		}
-		h1{
-			font-size: 24px;
-			margin-bottom: 24px;
-		}
-		h2{
-			font-size: 20px;
-			text-align: right;
-		}
-		form{
-			margin: 0px;
-		}
-	}
-
-	border: 0;
-	border-bottom: 1px;
-	border-style: solid;
-	border-color: #cececd;
-	margin-bottom: 16px;
-}
-.sectiontitle{
-	font-size: 32px;
-	border: 0px;
-	border-top: 6px;
-	border-color: #3b7846;
-	border-style: solid;
-	background-color: $color_low;
-
-	color: #3b7846;
-	margin-bottom: 16px;
-}
-
-.itemhorz {
-	margin-top: 16px;
-	h1{
-		font-size: 24px;
-	}
-}
-
-.itemvert{
-	padding: 0px;
-	margin: 0px;
-	h1{
-		text-align: center;
-		font-size: 24px;
-		margin: 0px;
-	}
-	margin-bottom: 16px;
-}
-
-.item-img{
-	background-color: $color_low;
-}
-
-
-$carousel_size: 400px;
-
-.carousel {
-  height: $carousel_size;
-  margin-bottom: 60px;
-  h1{
-		background-color: rgba(37, 68, 32, 0.75);
-	}
-	#carrousel-new-description{
-		background-color: rgba(2, 8, 3, 0.75);
-	}
-}
-
-
-.carousel-caption {
-  z-index: 10;
-}
-
-.carousel .item {
-  height: $carousel_size;
-  background-color: #777;
-}
-.carousel-inner > .item > img {
-  position: absolute;
-  top: 0;
-  left: 0;
-  min-width: 100%;
-  height: $carousel_size;
-}
-
-a {
-  color: #529652;
-  text-decoration: none;
-}
-a:hover,
-a:focus {
-  color: #3A6C3A;
-  text-decoration: underline;
-}
-
-.btn-primary {
-  color: #fff;
-  background-color: #63A063;
-  border-color: #3A6C3A;
-}
-.btn-primary:hover,
-.btn-primary:focus,
-.btn-primary.focus,
-.btn-primary:active,
-.btn-primary.active,
-.open > .dropdown-toggle.btn-primary {
-  color: #fff;
-  background-color: #3A6C3A;
-  border-color: #003300;
-}
-
-.navbar {
-  position: relative;
-  min-height: 15px;
-  margin-bottom: 0px;
-  border: 1px solid transparent;
-}
-
-.navbar-brand {
-  float: left;
-  height: 15px;
-  padding: 15px 15px;
-  font-size: 18px;
-  line-height: 3px;
-}
-.navbar-nav > li > a {
-  padding-top: 10px;
-  padding-bottom: 10px;
-  line-height: 10px;
-}
-@media (min-width: 768px) {
-  .navbar-nav {
-    float: left;
-    margin: 0;
-  }
-  .navbar-nav > li {
-    float: left;
-  }
-  .navbar-nav > li > a {
-    padding-top: 10px;
-    padding-bottom: 10px;
-  }
-}
-.pagination > li > a,
-.pagination > li > span {
-  position: relative;
-  float: left;
-  padding: 6px 12px;
-  margin-left: -1px;
-  line-height: 1.42857143;
-  color: #529652;
-  text-decoration: none;
-  background-color: #fff;
-  border: 1px solid #ddd;
-}
-.pagination > li > a:hover,
-.pagination > li > span:hover,
-.pagination > li > a:focus,
-.pagination > li > span:focus {
-  color: #3A6C3A;
-  background-color: #eee;
-  border-color: #ddd;
-}
-a.thumbnail:hover,
-a.thumbnail:focus,
-a.thumbnail.active {
-  border-color: #3A6C3A;
-}
-.carousel-indicators li {
-  display: inline-block;
-  width: 10px;
-  height: 10px;
-  margin: 1px;
-  text-indent: -999px;
-  cursor: pointer;
-  background-color: #000 \9;
-  background-color: rgba(0, 0, 0, 0.5);
-  border: 1px solid #555;
-  border-radius: 10px;
-}
-
-
-#nestedAccordion{
-  width:100%;
-}
-#nestedAccordion h2, #nestedAccordion h3,
-#nestedAccordion div, #nestedAccordion ol,
-#nestedAccordion li{
-  /* reset styles for accordion */
-  margin:0;
-  padding:0;
-  font-size:1em;
-  font-weight:normal;
-  list-style:none;
-}
-#nestedAccordion div{
-  color:#555;/*#555 #003300*/
-  overflow:hidden;
-  display:none;
-}
-
-#nestedAccordion h2{
-  cursor:pointer;
-  color:#fff;
-  font-size:1.1em;
-  moz-border-radius: 5px 5px 0 0;
-  -webkit-border-radius: 5px 5px 0 0;
-  border-radius: 5px 5px 0 0;
-  padding:3px;
-  margin-top:5px;
-  background-color: #529652;
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#4B8CFF), to(#447FE8));
-  background-image: -webkit-linear-gradient(top, #4B8CFF, #447FE8);/*#4B8CFF, #447FE8*/
-  background-image: -moz-linear-gradient(top, #4B8CFF, #447FE8);
-  background-image: -ms-linear-gradient(top, #4B8CFF, #447FE8);
-  background-image: -o-linear-gradient(top, #4B8CFF, #447FE8);
-  background-image: linear-gradient(to bottom, #4B8CFF, #447FE8);
-  background-image: url("arrow.ico");
-    background-repeat: no-repeat;
-    background-position: right bottom;
-}
-#nestedAccordion h3{
-  cursor:pointer;
-  padding:4px;
-  color: #666;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, .5);
-  background-color: #f5f5f5;
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#ededed));
-  background-image: -webkit-linear-gradient(top, #f5f5f5, #ededed);
-  background-image: -moz-linear-gradient(top, #f5f5f5, #ededed);
-  background-image: -ms-linear-gradient(top, #f5f5f5, #ededed);
-  background-image: -o-linear-gradient(top, #f5f5f5, #ededed);
-  background-image: linear-gradient(to bottom, #f5f5f5, #ededed);
-
-}
-#nestedAccordion h3:hover{
-  color:#000;
-}
-#nestedAccordion h3 + div{
-  display:none;
-  background-color:#F5F5F5;
-  padding:5px 5px 5px 30px;
-}
-#nestedAccordion li:hover{
-  color:#000;
-  cursor:pointer;
-}
-#nestedAccordion h2 +div.aberto{
-  display:inherit;
-}
-
-
-.starRating:not(old){
-  display        : inline-block;
-  width          : 7.5em;
-  height         : 1.5em;
-  overflow       : hidden;
-  vertical-align : bottom;
-}
-
-.starRating:not(old) > input{
-  margin-right : -100%;
-  opacity      : 0;
-}
-
-.starRating:not(old) > label{
-  display         : block;
-  float           : right;
-  position        : relative;
-  background      : url('star-off.svg');
-  background-size : contain;
-}
-
-.starRating:not(old) > label:before{
-  content         : '';
-  display         : block;
-  width           : 1.5em;
-  height          : 1.5em;
-  background      : url('star-on.svg');
-  background-size : contain;
-  opacity         : 0;
-  transition      : opacity 0.2s linear;
-}
-
-.starRating:not(old) > label:hover:before,
-.starRating:not(old) > label:hover ~ label:before,
-.starRating:not(:hover) > :checked ~ label:before{
-  opacity : 1;
-}
-
-td.stars { width: 22%; }
-td.visualis { width: 22%; }
-table.tipo1 td {  width: 52%; 	height: 33px;}
-table.tipo1 p{ font-size: 15px; font-weight: bold; }
diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss
new file mode 100644
index 0000000000000000000000000000000000000000..154175ad3bc6c610531bf93a4c6e62c9a7f020cd
--- /dev/null
+++ b/app/assets/stylesheets/application.scss
@@ -0,0 +1,322 @@
+/*
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
+ * listed below.
+ *
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
+ *
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
+ * compiled file so the styles you add here take precedence over styles defined in any styles
+ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
+ * file per style scope.
+ *
+ *= require_tree ./application
+ *= require_self
+ */
+@import "bootstrap-sprockets";
+@import "bootstrap";
+@import "select2";
+@import "select2-bootstrap";
+
+//// HTML/BODY
+html,
+body {
+	margin:0;
+	padding:0;
+	height:100%;
+
+  font-size: 15px;
+  font-family: 'Roboto', "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+a, a:focus, a:hover {
+	color: #000;
+}
+
+.caret {
+	border-left: 7px solid transparent;
+	border-right: 7px solid transparent;
+	border-top: 7px solid #000000;
+}
+.caret-up {
+	transform: rotate(180deg);
+}
+.caret-align-right {
+	position: absolute;
+  left: 90%;
+  top: 45%;
+}
+
+//// HEADER
+header {
+  border: 0;
+  border-bottom: 1px;
+  border-style: solid;
+  border-color: #cececd;
+  margin-bottom: 16px;
+
+  a, a:focus, a:hover {
+    text-decoration: none;
+  }
+
+  // barra brasil
+
+	.barra-brasil {
+    background:#F1F1F1;
+    height: 32px;
+    padding:0 0 0 10px;
+    display:block;
+
+
+    #wrapper-barra-brasil {
+      max-width: 100% !important;
+    }
+  }
+	.brasil-flag{
+		height: 100% !important;
+	}
+  // bar with logo, search and user info
+	.search-bar {
+		color: #FFF;
+		background-color: #2178F5;
+		padding: 0px;
+    padding-top: 8px;
+		margin: 0px;
+
+    // logo
+		.logo-text {
+      margin-top: 10px;
+      padding: 0px;
+			font-size: 24px;
+      font-weight: bold;
+      a {
+			 color: #FFF;
+      }
+		}
+    // accessibility
+    .search-accessibility {
+      margin-top: 25px;
+      text-align: right;
+      img {
+        height: 25px;
+      }
+    }
+    // search
+    .search-input {
+      margin-top: 40px;
+      margin-bottom: 5px;
+      text-align: right;
+
+      // text input
+      .form-control {
+        border-bottom-left-radius: 7px;
+        border-top-left-radius: 7px;
+        border-color: #FFF;
+        -webkit-box-shadow: none;
+      	-moz-box-shadow: none;
+      	box-shadow: none;
+        height: 40px;
+        padding-left: 20px;
+        font-size: 24px;
+        font-weight: 300 !important;
+      }
+      // button input
+      .input-group-btn {
+        border-bottom-right-radius: 7px;
+        border-top-right-radius: 7px;
+
+        .btn, .btn:focus, .btn:hover {
+          height: 40px;
+          font-size: 20px;
+          color: #FF2602;
+          background-color: #FFF;
+          border-color: #FFF;
+        }
+      }
+
+      .search-label {
+        font-weight: 300 !important;
+        color: #FFF;
+      }
+    }
+    // user info
+		.status-text {
+      margin-top: 20px;
+			font-size: 20px;
+			text-align: right;
+
+			.circular-image {
+				width: 60px;
+				height: 60px;
+				border-radius: 50%;
+			}
+
+      .media-heading {
+        font-size: 32px;
+        a {
+          color: #FFF;
+        }
+      }
+      .register-link {
+        color: #CED1C6;
+      }
+      .quit-link {
+        color: #FF2602;
+      }
+		}
+	}
+
+  // navbar
+  .navigation {
+    background: #F1F1F1;
+
+    .nav {
+      height: 50px;
+
+      .nav-button {
+        min-width: 140px;
+        height: 100%;
+        font-size: 20px;
+        font-weight: 500 !important;
+
+				a { color: #000; }
+      }
+
+      .nav-button-first {
+        a { padding-left: 0px !important; }
+      }
+      .divider {
+        width: 2px;
+        height: 100%;
+        background-color: #FFF;
+      }
+    }
+  }
+
+  // contrast
+  .search-bar-contraste{
+    background-color: black;
+    color: white;
+    background-image: none !important;
+  }
+}
+
+
+//// FOOTER
+footer {
+	width:100%;
+	height:100px;
+	position:relative;
+	bottom:0;
+	left:0;
+  padding-top: 50px;
+	border-width: 0px;
+	color: #FFF;
+
+	.main{
+		background-color: #313131;
+		padding: 16px 0px 0px 0px;
+    min-height: 256px;
+	}
+
+	.footerbar{
+		padding: 16px;
+		background-color: #080808;
+	}
+}
+
+//// partial OBJECT
+.object-horizontal {
+	margin-bottom: 20px;
+}
+
+.starRating:not(old){
+  display        : inline-block;
+  width          : 7.5em;
+  height         : 1.5em;
+  overflow       : hidden;
+  vertical-align : bottom;
+}
+
+.starRating:not(old) > input{
+  margin-right : -100%;
+  opacity      : 0;
+}
+
+.starRating:not(old) > label{
+  display         : block;
+  float           : right;
+  position        : relative;
+  background      : url('star-off.svg');
+  background-size : contain;
+}
+
+.starRating:not(old) > label:before{
+  content         : '';
+  display         : block;
+  width           : 1.5em;
+  height          : 1.5em;
+  background      : url('star-on.svg');
+  background-size : contain;
+  opacity         : 0;
+  transition      : opacity 0.2s linear;
+}
+
+.starRating:not(old) > label:hover:before,
+.starRating:not(old) > label:hover ~ label:before,
+.starRating:not(:hover) > :checked ~ label:before{
+  opacity : 1;
+}
+
+td.stars { width: 22%; }
+td.visualis { width: 22%; }
+table.tipo1 td {  width: 52%; 	height: 33px;}
+table.tipo1 p{ font-size: 15px; font-weight: bold; }
+
+////////////////////////////////////////////////////////////////////////////////
+
+/* Alto Contraste*/
+.contraste{
+	background-color: black !important;
+	color: white !important;
+	a{
+		color: yellow;
+	}
+	.search-bar{
+		color: white !important;
+	}
+	#myCarousel{
+		a{
+			color: white !important;
+		}
+	}
+
+	#search{
+		.form-control{
+			background-color: black !important;
+			color:white;
+		}
+	}
+	#subject-highlight{
+		background-color: black !important;
+	}
+}
+.menu-bar-contrast{
+	background-color: black !important;
+	border-top: 2px solid white;
+	border-bottom: 2px solid white;
+	li{
+		a{
+			color:white !important;
+		}
+		a:hover{
+			background-color: #1E1E1E !important;
+		}
+	}
+	.divider{
+		background-color: white;
+	}
+	.dropdown-menu{
+		background-color: black;
+	}
+}
diff --git a/app/assets/stylesheets/application/learning_objects.scss b/app/assets/stylesheets/application/learning_objects.scss
new file mode 100644
index 0000000000000000000000000000000000000000..a3271c7b29c97008138c4b5a0535a114e4395c57
--- /dev/null
+++ b/app/assets/stylesheets/application/learning_objects.scss
@@ -0,0 +1,3 @@
+.learning_object-horizontal {
+  margin-bottom: 10px;
+}
\ No newline at end of file
diff --git a/app/assets/stylesheets/application/search.scss b/app/assets/stylesheets/application/search.scss
new file mode 100644
index 0000000000000000000000000000000000000000..1e0bc46ea2011f1067d4676045b61a33b8fb2652
--- /dev/null
+++ b/app/assets/stylesheets/application/search.scss
@@ -0,0 +1,107 @@
+.search-sidebar {
+  margin-top: 40px;
+
+  .dropdown-element {
+    width: 95%;
+    margin-left: 3%;
+  }
+}
+
+.select2-container {
+  width: 100% !important;
+}
+
+// #nestedAccordion{
+//   width:100%;
+// }
+// #nestedAccordion h2, #nestedAccordion h3,
+// #nestedAccordion div, #nestedAccordion ol,
+// #nestedAccordion li{
+//   /* reset styles for accordion */
+//   margin:0;
+//   padding:0;
+//   font-size:1em;
+//   font-weight:normal;
+//   list-style:none;
+// }
+// #nestedAccordion div{
+//   color:#555;/*#555 #003300*/
+//   overflow:hidden;
+//   display:none;
+// }
+//
+// #nestedAccordion h2{
+//   cursor:pointer;
+//   color:#fff;
+//   font-size:1.1em;
+//   moz-border-radius: 5px 5px 0 0;
+//   -webkit-border-radius: 5px 5px 0 0;
+//   border-radius: 5px 5px 0 0;
+//   padding:3px;
+//   margin-top:5px;
+//   background-color: #3F434F;
+//   background-image: -webkit-gradient(linear, left top, left bottom, from(#4B8CFF), to(#447FE8));
+//   background-image: -webkit-linear-gradient(top, #4B8CFF, #447FE8);/*#4B8CFF, #447FE8*/
+//   background-image: -moz-linear-gradient(top, #4B8CFF, #447FE8);
+//   background-image: -ms-linear-gradient(top, #4B8CFF, #447FE8);
+//   background-image: -o-linear-gradient(top, #4B8CFF, #447FE8);
+//   background-image: linear-gradient(to bottom, #4B8CFF, #447FE8);
+//   background-image: url("arrow.ico");
+//     background-repeat: no-repeat;
+//     background-position: right bottom;
+// }
+// #nestedAccordion h3{
+//   cursor:pointer;
+//   padding:4px;
+//   color: #666;
+//   text-shadow: 0 1px 0 rgba(255, 255, 255, .5);
+//   background-color: #f5f5f5;
+//   background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#ededed));
+//   background-image: -webkit-linear-gradient(top, #f5f5f5, #ededed);
+//   background-image: -moz-linear-gradient(top, #f5f5f5, #ededed);
+//   background-image: -ms-linear-gradient(top, #f5f5f5, #ededed);
+//   background-image: -o-linear-gradient(top, #f5f5f5, #ededed);
+//   background-image: linear-gradient(to bottom, #f5f5f5, #ededed);
+//
+// }
+// #nestedAccordion h3:hover{
+//   color:#000;
+// }
+// #nestedAccordion h3 + div{
+//   display:none;
+//   background-color:#F5F5F5;
+//   padding:5px 5px 5px 30px;
+// }
+// #nestedAccordion li:hover{
+//   color:#000;
+//   cursor:pointer;
+// }
+// #nestedAccordion h2 +div.aberto{
+//   display:inherit;
+// }
+// ///Contrast
+// .contraste{
+//   .thumbnail{
+//     background-color: black !important;
+//   }
+//   .navbar{
+//     select{
+//       color: black;
+//     }
+//   }
+//   #nestedAccordion{
+//     div{
+//       background-color: black !important;
+//       color: white !important;
+//     }
+//     h3{
+//       color: white;
+//       background-color: black !important;
+//       background-image: none !important;
+//       border-bottom: 1px solid white;
+//     }
+//     h3:hover{
+//       color: white;
+//     }
+//   }
+// }
diff --git a/app/assets/stylesheets/application/welcome.scss b/app/assets/stylesheets/application/welcome.scss
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..293aecd53359ddd05db69e7f4d3dd9978247120a 100644
--- a/app/assets/stylesheets/application/welcome.scss
+++ b/app/assets/stylesheets/application/welcome.scss
@@ -0,0 +1,110 @@
+.general-highlights {
+  padding-left: 0px;
+  padding-right: 0px;
+  padding-bottom: 20px;
+}
+
+.padding-left-0{
+  padding-left: 0 !important;
+}
+.padding-right-0{
+  padding-right: 0 !important;
+}
+
+$carousel_size: 400px;
+
+.carousel {
+  height: $carousel_size;
+  margin-bottom: 60px;
+  h1{
+		background-color: rgba(37, 68, 32, 0.75);
+	}
+	#carrousel-new-description{
+		background-color: rgba(2, 8, 3, 0.75);
+	}
+}
+
+.carousel h1 {
+  background-color: rgba(0, 0, 0, 0.75);
+}
+
+.carousel-caption {
+  z-index: 10;
+}
+
+.carousel .item {
+  height: $carousel_size;
+  background-color: #777;
+}
+.carousel-inner > .item > img {
+  position: absolute;
+  top: 0;
+  left: 0;
+  min-width: 100%;
+  height: $carousel_size;
+}
+
+.carousel-indicators li {
+  display: inline-block;
+  width: 12px;
+  height: 12px;
+  margin: 12x;
+  text-indent: -999px;
+  cursor: pointer;
+  background-color: #000 \9;
+  background-color: #AABAB8;
+  border: 1px solid #555;
+  border-radius: 10px;
+}
+
+.carousel-indicators .active {
+  margin: 0;
+  width: 12px;
+  height: 12px;
+  background-color: #FF2333;
+}
+
+//// CONTACT
+.font_roboto_light{
+  font-family: 'Roboto', sans-serif;
+}
+#mec_portais{
+  background-color: #2E3192;
+  width: 100px;
+  height: 50px;
+}
+#mec_portais2{
+  background-color: #2E3192;
+  width: 100px;
+  height: 50px;
+  margin-left: 5px;
+}
+.rede_social{
+  width: 30px;
+  height: 30px;
+  border-radius: 5px;
+}
+#rede_social1{
+  background-color: #2E3192;
+}
+#rede_social2{
+  background-color: #C01A2C;
+  margin-left: 5px;
+}
+#rede_social3{
+  background-color: #00ADEF;
+  margin-left: 5px;
+}
+#rede_social4{
+  background-color: #6A5E50;
+  margin-left: 5px;
+}
+
+//// FAQ
+#faq_div{
+    margin-left: 175px;
+}
+#faq_question{
+  color: orange;
+  font-weight: bold;
+}
diff --git a/app/assets/stylesheets/edges.scss b/app/assets/stylesheets/edges.scss
deleted file mode 100644
index 248e4c0d098e1ffcb97d204565abaa8013256443..0000000000000000000000000000000000000000
--- a/app/assets/stylesheets/edges.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-// Place all the styles related to the Edges controller here.
-// They will automatically be included in application.css.
-// You can use Sass (SCSS) here: http://sass-lang.com/
diff --git a/app/assets/stylesheets/learning_objects.scss b/app/assets/stylesheets/learning_objects.scss
deleted file mode 100644
index b9ba81d3d355ebd38241b2355d66235b122d16c5..0000000000000000000000000000000000000000
--- a/app/assets/stylesheets/learning_objects.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-// Place all the styles related to the LearningObjects controller here.
-// They will automatically be included in application.css.
-// You can use Sass (SCSS) here: http://sass-lang.com/
diff --git a/app/assets/stylesheets/registrations.scss b/app/assets/stylesheets/registrations.scss
deleted file mode 100644
index f6e17a22d8ea83e854c44006511714d6fc63a863..0000000000000000000000000000000000000000
--- a/app/assets/stylesheets/registrations.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-// Place all the styles related to the registrations controller here.
-// They will automatically be included in application.css.
-// You can use Sass (SCSS) here: http://sass-lang.com/
diff --git a/app/assets/stylesheets/scaffolds.scss b/app/assets/stylesheets/scaffolds.scss
deleted file mode 100644
index ed7a765d9acc0ccc7bb77dc1176083bc98b64eeb..0000000000000000000000000000000000000000
--- a/app/assets/stylesheets/scaffolds.scss
+++ /dev/null
@@ -1,73 +0,0 @@
-body {
-  background-color: #fff;
-  color: #333;
-  font-family: verdana, arial, helvetica, sans-serif;
-  font-size: 13px;
-  line-height: 18px;
-}
-
-p, ol, ul, td {
-  font-family: verdana, arial, helvetica, sans-serif;
-  font-size: 13px;
-  line-height: 18px;
-}
-
-pre {
-  background-color: #eee;
-  padding: 10px;
-  font-size: 11px;
-}
-
-a {
-  color: #000;
-
-  &:visited {
-    color: #666;
-  }
-
-  &:hover {
-    color: #fff;
-    background-color: #000;
-  }
-}
-
-div {
-  &.field, &.actions {
-    margin-bottom: 10px;
-  }
-}
-
-#notice {
-  color: green;
-}
-
-.field_with_errors {
-  padding: 2px;
-  background-color: red;
-  display: table;
-}
-
-#error_explanation {
-  width: 450px;
-  border: 2px solid red;
-  padding: 7px;
-  padding-bottom: 0;
-  margin-bottom: 20px;
-  background-color: #f0f0f0;
-
-  h2 {
-    text-align: left;
-    font-weight: bold;
-    padding: 5px 5px 5px 15px;
-    font-size: 12px;
-    margin: -7px;
-    margin-bottom: 0px;
-    background-color: #c00;
-    color: #fff;
-  }
-
-  ul li {
-    font-size: 12px;
-    list-style: square;
-  }
-}
diff --git a/app/assets/stylesheets/search/select2.min.css b/app/assets/stylesheets/search/select2.min.css
deleted file mode 100644
index 1c7234426a473d3e017340ecda88f880dc1e3476..0000000000000000000000000000000000000000
--- a/app/assets/stylesheets/search/select2.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle;}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none;}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px;}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none;}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap;}.select2-container .select2-search--inline{float:left;}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none;}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051;}.select2-results{display:block;}.select2-results__options{list-style:none;margin:0;padding:0;}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none;}.select2-results__option[aria-selected]{cursor:pointer;}.select2-container--open .select2-dropdown{left:0;}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0;}.select2-search--dropdown{display:block;padding:4px;}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box;}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none;}.select2-search--dropdown.select2-search--hide{display:none;}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0);}.select2-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px;}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px;}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999;}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px;}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0;}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left;}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto;}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default;}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none;}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px;}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%;}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left;}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px;}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px;}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px;}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333;}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder{float:right;}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto;}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto;}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0;}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default;}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none;}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0;}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0;}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa;}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto;}.select2-container--default .select2-results__option[role=group]{padding:0;}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999;}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd;}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em;}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0;}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em;}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em;}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em;}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em;}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em;}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white;}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px;}.select2-container--classic .select2-selection--single{background-color:#f6f6f6;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #ffffff 50%, #eeeeee 100%);background-image:-o-linear-gradient(top, #ffffff 50%, #eeeeee 100%);background-image:linear-gradient(to bottom, #ffffff 50%, #eeeeee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb;}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px;}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px;}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999;}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%);background-image:-o-linear-gradient(top, #eeeeee 50%, #cccccc 100%);background-image:linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#cccccc', GradientType=0);}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0;}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left;}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto;}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb;}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none;}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px;}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #ffffff 0%, #eeeeee 50%);background-image:-o-linear-gradient(top, #ffffff 0%, #eeeeee 50%);background-image:linear-gradient(to bottom, #ffffff 0%, #eeeeee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eeeeee 50%, #ffffff 100%);background-image:-o-linear-gradient(top, #eeeeee 50%, #ffffff 100%);background-image:linear-gradient(to bottom, #eeeeee 50%, #ffffff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0;}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb;}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px;}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none;}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px;}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px;}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555;}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto;}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto;}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb;}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0;}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0;}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;}.select2-container--classic .select2-dropdown{background-color:white;border:1px solid transparent;}.select2-container--classic .select2-dropdown--above{border-bottom:none;}.select2-container--classic .select2-dropdown--below{border-top:none;}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto;}.select2-container--classic .select2-results__option[role=group]{padding:0;}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey;}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:white;}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px;}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb;}
\ No newline at end of file
diff --git a/app/assets/stylesheets/university.scss b/app/assets/stylesheets/university.scss
deleted file mode 100644
index b37e7ce20f0e77f10ef56f66461a2226c2646e4e..0000000000000000000000000000000000000000
--- a/app/assets/stylesheets/university.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-// Place all the styles related to the university controller here.
-// They will automatically be included in application.css.
-// You can use Sass (SCSS) here: http://sass-lang.com/
diff --git a/app/assets/stylesheets/users.scss b/app/assets/stylesheets/users.scss
deleted file mode 100644
index 1efc835ccd15adaf355c0501d7237d13529771e1..0000000000000000000000000000000000000000
--- a/app/assets/stylesheets/users.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-// Place all the styles related to the users controller here.
-// They will automatically be included in application.css.
-// You can use Sass (SCSS) here: http://sass-lang.com/
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index c2a66dab49848d4295a9fb227caffac4445c89bb..374155aaae133f416c4eb513e34151f23766d8bd 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -11,7 +11,17 @@ class ApplicationController < ActionController::Base
   protected
 
   def configure_permitted_parameters
-    devise_parameter_sanitizer.for(:sign_up) << :name
+    registration_params = [:name, :email, :avatar, :password, :password_confirmation]
+
+    if params[:action] == 'update'
+      devise_parameter_sanitizer.for(:account_update) {
+          |u| u.permit(registration_params << :current_password)
+      }
+    elsif params[:action] == 'create'
+      devise_parameter_sanitizer.for(:sign_up) {
+          |u| u.permit(registration_params)
+      }
+    end
   end
 
   def dspace_service
diff --git a/app/controllers/collections_controller.rb b/app/controllers/collections_controller.rb
new file mode 100644
index 0000000000000000000000000000000000000000..0579097790de7c0b49400ad9676537504614a638
--- /dev/null
+++ b/app/controllers/collections_controller.rb
@@ -0,0 +1,71 @@
+class CollectionsController < ApplicationController
+  before_action :set_collection, only: [:show, :update, :destroy, :like]
+
+  # GET /collections
+  # GET /collections.json
+  def index
+    @collections = collection_repository.find_all
+  end
+
+  # GET /collections/1
+  # GET /collections/1.json
+  def show
+  end
+
+  # POST /collections/1/like
+  def like
+    collection_repository.like @collection
+  end
+
+  # POST /collections
+  # POST /collections.json
+  def create
+    @collection = Collection.new(collection_params)
+
+    respond_to do |format|
+      if collection_repository.save @collection
+        format.html { redirect_to @collection, notice: 'Collection was successfully created.' }
+      else
+        format.html { render :new }
+      end
+    end
+  end
+
+  # PATCH/PUT /collections/1
+  # PATCH/PUT /collections/1.json
+  def update
+    respond_to do |format|
+      if collection_repository.update(collection_params)
+        format.html { redirect_to @collection, notice: 'Collection was successfully updated.' }
+      else
+        format.html { render :edit }
+      end
+    end
+  end
+
+  # DELETE /collections/1
+  # DELETE /collections/1.json
+  def destroy
+    collection_repository.destroy @collection
+
+    respond_to do |format|
+      format.html { redirect_to collections_url, notice: 'Learning object was successfully destroyed.' }
+    end
+  end
+
+  private
+
+  def set_collection
+    @collection = collection_repository.find_by_id params[:id]
+  end
+
+  def collection_repository
+    repository.for(:collection)
+  end
+
+  # Never trust parameters from the scary internet, only allow the white list through.
+  def collection_params
+    params.require(:collection).permit(:name, :privacy, learning_objects: [])
+  end
+
+end
diff --git a/app/controllers/institutions_controller.rb b/app/controllers/institutions_controller.rb
new file mode 100644
index 0000000000000000000000000000000000000000..0eb2ca291f822c645e854198ba8bfc22330a4d07
--- /dev/null
+++ b/app/controllers/institutions_controller.rb
@@ -0,0 +1,77 @@
+class InstitutionsController < ApplicationController
+  before_action :set_institution, only: [:show, :edit, :update, :destroy, :like]
+
+  # GET /institutions
+  # GET /institutions.json
+  def index
+    @institutions = institution_repository.find_all
+  end
+
+  # GET /institutions/1
+  # GET /institutions/1.json
+  def show
+  end
+
+  # GET /institutions/new
+  def new
+    @institution = Institution.new
+  end
+
+  # GET /institutions/1/edit
+  def edit
+  end
+
+  # POST /institutions
+  # POST /institutions.json
+  def create
+    @institution = Institution.new(institution_params)
+
+    respond_to do |format|
+      if institution_repository.save @institution
+        format.html { redirect_to @institution, notice: 'Institution was successfully created.' }
+      else
+        format.html { render :new }
+      end
+    end
+  end
+
+  # PATCH/PUT /institutions/1
+  # PATCH/PUT /institutions/1.json
+  def update
+    respond_to do |format|
+      if institution_repository.update(institution_params)
+        format.html { redirect_to @learning_object, notice: 'Institution was successfully updated.' }
+      else
+        format.html { render :edit }
+      end
+    end
+  end
+
+  # DELETE /institutions/1
+  # DELETE /institutions/1.json
+  def destroy
+    institution_repository.destroy @institution
+
+    respond_to do |format|
+      format.html { redirect_to institutions_url, notice: 'Learning object was successfully destroyed.' }
+    end
+  end
+
+
+
+  private
+
+  def set_institution
+    @institution = institution_repository.find_by_id("##{params[:id]}")
+  end
+
+  def institution_repository
+    repository.for(:institution)
+  end
+
+  # Never trust parameters from the scary internet, only allow the white list through.
+  def institution_params
+    params[:institution_object]
+  end
+
+end
diff --git a/app/controllers/learning_objects_controller.rb b/app/controllers/learning_objects_controller.rb
index 466884d923bc2bdf77f75bdb8c5797ae36865598..c61bdb7186eec207c7a93fa77e28c051bf627df5 100644
--- a/app/controllers/learning_objects_controller.rb
+++ b/app/controllers/learning_objects_controller.rb
@@ -6,7 +6,7 @@ class LearningObjectsController < ApplicationController
   # GET /learning_objects
   # GET /learning_objects.json
   def index
-    @learning_objects = learning_object_repository.all
+    @learning_objects = learning_object_repository.find_all
   end
 
   # GET /learning_objects/1
@@ -61,7 +61,7 @@ class LearningObjectsController < ApplicationController
 
   # POST /learning_objects/1/like
   def like
-    learning_object_repository.like @learning_object, current_user
+    learning_object_repository.like current_user, @learning_object
     redirect_to :back
   end
 
@@ -73,7 +73,7 @@ class LearningObjectsController < ApplicationController
 
   # Use callbacks to share common setup or constraints between actions.
   def set_learning_object
-    @learning_object = learning_object_repository.get_by_dspace_id params[:id]
+    @learning_object = learning_object_repository.find_by_id params[:id]
   end
 
   # Never trust parameters from the scary internet, only allow the white list through.
@@ -82,7 +82,9 @@ class LearningObjectsController < ApplicationController
   end
 
   def increment_learning_object_views
-    learning_object_repository.increment_views @learning_object
+    if user_signed_in?
+      learning_object_repository.increment_views current_user, @learning_object
+    end
   end
 
 end
diff --git a/app/controllers/management/users_controller.rb b/app/controllers/management/users_controller.rb
index 4c6de9d93bc5e37daaf181fa63076625b43d02ae..59cb720fc36173eda9ba0768332ff15b055cc60d 100644
--- a/app/controllers/management/users_controller.rb
+++ b/app/controllers/management/users_controller.rb
@@ -3,7 +3,7 @@ class Management::UsersController < ManagementController
   before_action :set_roles, only: [:new, :edit]
 
   def index
-    @users = user_repository.all
+    @users = user_repository.find_all
   end
 
   # GET /users/1
@@ -61,7 +61,7 @@ class Management::UsersController < ManagementController
 
   # Use callbacks to share common setup or constraints between actions.
   def set_user
-    @user = user_repository.find params[:id]
+    @user = user_repository.find_by_id params[:id]
   end
 
   # Never trust parameters from the scary internet, only allow the white list through.
diff --git a/app/controllers/management/welcome_controller.rb b/app/controllers/management/welcome_controller.rb
index 7fa9356d45eb2371bbe382b9fed45d940f98ac56..20e2db6276805d5930e04d6f1340ebdd5268dd40 100644
--- a/app/controllers/management/welcome_controller.rb
+++ b/app/controllers/management/welcome_controller.rb
@@ -1,8 +1,4 @@
 class Management::WelcomeController < ManagementController
   def index
-
-  end
-  
-  def destaques
   end
 end
diff --git a/app/controllers/management_controller.rb b/app/controllers/management_controller.rb
index 069b0f6bfa6ad5c5c32103985aee9c26ce482417..6db75c2c7f0cc891b5a3da1010a0ae330923a3de 100644
--- a/app/controllers/management_controller.rb
+++ b/app/controllers/management_controller.rb
@@ -1,16 +1,3 @@
 class ManagementController < ApplicationController
   layout 'management'
-
-
-  def destaques
-  end
-
-  def denuncias
-  end
-
-  def estatisticas
-  end
-
-  def usuarios
-  end
 end
diff --git a/app/controllers/search/solr_controller.rb b/app/controllers/search/solr_controller.rb
deleted file mode 100644
index 6054b17d6d37b4bf0a9f43abcd70cd09801ffe4b..0000000000000000000000000000000000000000
--- a/app/controllers/search/solr_controller.rb
+++ /dev/null
@@ -1,127 +0,0 @@
-class Search::SolrController < ApplicationController
-
-  def search
-    queryParams = {:q => '*:*', :fq => params[:qry]}
-
-    results = solr_client.get 'select',
-                              :params => merge_search_parameters(queryParams, solr_search_default_parameters)
-
-    objectsFound1 = select_items_from_results(results)
-    #@numFound = results["response"]["numFound"]
-    @numFound =objectsFound1.length
-
-    per_page=10
-    @npagnac=10
-    if(params[:paginacao])
-      per_page=params[:paginacao].to_i
-      @npagnac=per_page
-    end
-
-    if(params[:page])
-      #params[:page] = 1
-    else
-      params[:page] = 1
-    end
-
-    current_page= params[:page].to_i
-
-    if params[:sort]
-      @ordena=params[:sort]
-    end
-    if params[:sort] == "author"
-      objectsFound1 = sort_author(objectsFound1);
-    elsif params[:sort] == "publicationasc"
-      objectsFound1 = objectsFound1.sort_by{|item| [ item['search.resourceid'] ]}
-    elsif params[:sort] == "publicationdesc"
-      objectsFound1 = objectsFound1.sort_by{|item| -item['search.resourceid'] }
-    elsif params[:sort] == "relevance"
-      items= objectsFound1.collect{ |x| Ranking::Item.new("",1,1,1, x)  } #puts each object in an item
-
-      rater = Ranking::Rater.new(
-          Ranking::Strategies::BasicRater.new(
-              #define sorting weights
-              positionWeight = 1000,
-              useWeight = 1,
-              likeWeight = 100
-          )
-      )
-
-      a = rater.sortByRate(items) # Returns sorted array of items
-      objectsFound1= a.collect{ |x|  x.info  } #get only the info fields(objects)
-
-    elsif params[:sort] == "title"
-      objectsFound1 = sort_title(objectsFound1);
-    end
-    #    current_page, per_page, total_results
-    @objectsFound = WillPaginate::Collection.create(current_page, per_page, objectsFound1.length) do |pager|
-      @start = (current_page-1)*per_page
-      pager.replace (objectsFound1.to_a[@start,per_page])
-    end
-
-    #search.resourceid
-    #for item in objectsFound
-    #   Busca no orientDb (rid,classe,rate)
-    #end
-  end
-
-  private
-
-  #Resource types:
-  # 2 = Item
-  # 3 = Collection
-  # 4 = Community
-
-  def select_items_from_results(results)
-    resultList = Set.new
-    results["response"]["docs"].select { |r|
-      r["search.resourcetype"].to_i.equal? 2
-    }.each do |i|
-      resultList.add i
-    end
-    return resultList
-  end
-
-  def solr_client
-    return RSolr.connect :url => 'http://portalmecdev.c3sl.ufpr.br:8080/solr/search/'
-  end
-
-  def merge_search_parameters(p1, p2)
-    return p1.merge(p2) { |key,oldval,newval| key = [newval,oldval].flatten }
-  end
-
-  def solr_search_default_parameters
-    return {
-        "fl"=>["
-        search.resourcetype, search.resourceid,
-        handle, author, title, dc.description
-      "],
-        "type"=>"0",
-        "start"=>"0",
-        "rows"=>"1000",
-        "facet"=>"true",
-        "facet.offset"=>"0",
-        "facet.mincount"=>"1",
-        "f.subject_tax_0_filter.facet.sort"=>"count",
-        "f.subject_tax_0_filter.facet.limit"=>"11",
-        "f.author_filter.facet.limit"=>"11",
-        "f.dateIssued.year.facet.sort"=>"index",
-        "f.dateIssued.year.facet.limit"=>"10",
-        "f.author_filter.facet.sort"=>"count",
-        "facet.field"=>["author_filter","subject_tax_0_filter","dateIssued.year"],
-        "fq"=>["NOT(withdrawn:true)","NOT(discoverable:false)","read:(g0 OR g0)"]
-    }
-  end
-
-  def sort_author(items)
-    items = items.sort_by{|item| [ item['author'].to_s.downcase ]}
-    items.each{ |item| item['author'] = sort_author(item['author']) if (item['author'].nil? ? [] : item['author']).size > 0 }
-    items
-  end
-
-
-  def sort_title(items)
-    items = items.sort_by{|item| [ item['title'].to_s.downcase ]}
-    items.each{ |item| item['title'] = sort_title(item['title']) if (item['title'].nil? ? [] : item['title']).size > 0 }
-    items
-  end
-end
\ No newline at end of file
diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb
new file mode 100644
index 0000000000000000000000000000000000000000..a59fd8163bae09371322c428f04d4e2cfc6019ab
--- /dev/null
+++ b/app/controllers/search_controller.rb
@@ -0,0 +1,74 @@
+class SearchController < ApplicationController
+
+  include SearchEngine::OrientdbLucene
+
+  def index
+
+    objectsFound = search(params[:qry])
+    @numFound = objectsFound.length
+
+    per_page=10
+    @npagnac=10
+    if(params[:paginacao])
+      per_page=params[:paginacao].to_i
+      @npagnac=per_page
+    end
+
+    if(params[:page])
+      #params[:page] = 1
+    else
+      params[:page] = 1
+    end
+
+    current_page = params[:page].to_i
+
+    if params[:sort]
+      @ordena = params[:sort]
+    end
+    if params[:sort] == "author"
+      objectsFound = sort_author(objectsFound);
+    elsif params[:sort] == "publicationasc"
+      objectsFound = objectsFound.sort_by{|item| [ item.id ]}
+    elsif params[:sort] == "publicationdesc"
+      objectsFound = objectsFound.sort_by{|item| - item.id }
+    elsif params[:sort] == "relevance"
+      items= objectsFound.collect{ |x| Ranking::Item.new(x.name,x.views,0,x.likes,x)  } #puts each object in an item
+
+      rater = Ranking::Rater.new(
+          Ranking::Strategies::BasicRater.new(
+              #define sorting weights
+              positionWeight = 1000,
+              useWeight = 1,
+              likeWeight = 100
+          )
+      )
+
+      a = rater.sortByRate(items) # Returns sorted array of items
+      objectsFound = a.collect{ |x|  x.info  } #get only the info fields(objects)
+
+    elsif params[:sort] == "title"
+      objectsFound = sort_title(objectsFound);
+    end
+    #    current_page, per_page, total_results
+    @results = WillPaginate::Collection.create(current_page, per_page, objectsFound.length) do |pager|
+      @start = (current_page-1)*per_page
+      pager.replace (objectsFound.to_a[@start,per_page])
+    end
+
+  end
+
+  private
+
+  def sort_author(items)
+    # items = items.sort_by{|item| [ item['author'].to_s.downcase ]}
+    # items.each{ |item| item['author'] = sort_author(item['author']) if (item['author'].nil? ? [] : item['author']).size > 0 }
+    items
+  end
+
+
+  def sort_title(items)
+    # items = items.sort_by{|item| [ item['title'].to_s.downcase ]}
+    # items.each{ |item| item['title'] = sort_title(item['title']) if (item['title'].nil? ? [] : item['title']).size > 0 }
+    items
+  end
+end
diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb
index 37b8bd2034c9bb99f3b7830f66553a342ea4e03c..459c4f54a1d0b7fa82b9c72c612d96a69de2af38 100644
--- a/app/controllers/welcome_controller.rb
+++ b/app/controllers/welcome_controller.rb
@@ -3,15 +3,27 @@ class WelcomeController < ApplicationController
   def index
     @Carousel = Array.new
     @General = Array.new
-    mainPage = repository.for(:mainPage).find_all
+    mainPage = repository.for(:mainPage).find_all.first
 
-    @Carousel = mainPage[0]["carousel"].collect do |id|
+    @Carousel = mainPage["carousel"].collect do |id|
       repository.for(:webLink).find_by_id(id)[0] #orientdb returns a hash inside an array, I want only the hash
     end
 
-    @General = mainPage[0]["highlights"].collect do |id|
-      repository.for(:object).find_by_id(id)[0]
+    @General = mainPage["highlights"].collect do |id|
+      repository.for(:learning_object).find_by_id(id)
     end
+
+    @Subjects = repository.for(:subject).find_all.take(8)
+    @Subjects.delete_if do |subject|
+      if subject.highlights.nil? || subject.highlights.empty?
+        true
+      end
+    end
+    @Subjects.each do |subject|
+      object = repository.for(:learning_object).find_by_id(subject.highlights.first)
+      subject['first_highlight'] = object
+    end
+
   end
 
   def faq
diff --git a/app/helpers/learning_objects_helper.rb b/app/helpers/learning_objects_helper.rb
index d7e67df64bab71928e5fee3749756cab4ca9661f..4119caef6359bfacbe5d41bebde6c959e431e071 100644
--- a/app/helpers/learning_objects_helper.rb
+++ b/app/helpers/learning_objects_helper.rb
@@ -1,7 +1,7 @@
 module LearningObjectsHelper
-  def get_object_property (object, property_name)
-    unless object.nil?
-      return object.first[property_name]
-    end
+
+  def show_categories(categories = [])
+    categories.to_s
   end
+
 end
diff --git a/app/models/collection.rb b/app/models/collection.rb
new file mode 100644
index 0000000000000000000000000000000000000000..a680bb6b6cae2df3de5d58455ff1ef71f9ad1ff1
--- /dev/null
+++ b/app/models/collection.rb
@@ -0,0 +1,24 @@
+class Collection
+  include ActiveModel::Model
+  attr_accessor :id, :created_at, :description, :name, :views, :likes,
+                :owner, :learning_objects
+  validates_presence_of :name, :created_at, :views, :likes, :owner, :learning_objects
+  validates_with Validators::CollectionOwnerValidator
+
+  def initialize(params={})
+    super(params.merge(defaults))
+  end
+
+  private
+
+  def defaults
+    {
+        views: 0,
+        likes: 0,
+        created_at: DateTime.new,
+        owner: User.new,
+        learning_objects: []
+    }
+  end
+
+end
diff --git a/app/models/institution.rb b/app/models/institution.rb
index a40438bf5ebcf1557623c6e17023753f03d70be8..64a83bf6c51a54af1677755f120a8b44b6a44150 100644
--- a/app/models/institution.rb
+++ b/app/models/institution.rb
@@ -1,18 +1,4 @@
 class Institution
+  include ActiveModel::Model
   attr_accessor :id, :title, :description
-
-  def initialize(args={})
-    @id = args[:id]
-    @title = args[:title]
-  end
-
-  def subjects
-    @subjects ||= learning_object_repository.get_subjects(self)
-  end
-
-  private
-
-  def learning_object_repository
-    Portalmec::Application.repository.for :learning_object
-  end
 end
diff --git a/app/models/learning_object.rb b/app/models/learning_object.rb
index bb1f9522555f8de51de6e3f6fad44dc6f5f9eecb..a81ad0253324282f7cf6adc5396c8763e399616c 100644
--- a/app/models/learning_object.rb
+++ b/app/models/learning_object.rb
@@ -1,10 +1,18 @@
 class LearningObject
   include ActiveModel::Model
-
-  attr_accessor :id,
-                :name, :description, :thumbnail, :date_creation, :last_modified,
-                :id_dspace, :type, :bitstreams, :metadata
-  attr_accessor :likes, :views, :subjects, :attributes
+  attr_accessor :id, :id_dspace, :rid, :name, :description,
+                :thumbnail, :date_creation, :last_modified,
+                :type, :bitstreams, :metadata, :likes, :views, 
+                :downloads, :subjects, :attributes
+
+  validates_presence_of :name, :date_creation, :type, :likes, :views, :downloads
+  validates_numericality_of :likes, greater_than_or_equal_to: 0
+  validates_numericality_of :views, greater_than_or_equal_to: 0
+  validates_numericality_of :downloads, greater_than_or_equal_to: 0
+
+  def initialize(params={})
+    super(params.merge(defaults))
+  end
 
   def subjects
     @subjects ||= learning_object_repository.get_subjects(self)
@@ -14,6 +22,10 @@ class LearningObject
     @attributes ||= learning_object_repository.get_attributes(self)
   end
 
+  def categories
+    get_metadata_value_of 'dc.subject.category'
+  end
+
   def get_metadata_value_of key
     get_metadata_values_of(key).first
   end
@@ -25,9 +37,18 @@ class LearningObject
     end
     values
   end
-
+  
   private
 
+  def defaults
+    {
+        likes: 0,
+        views: 0,
+        downloads: 0,
+        date_creation: DateTime.new
+    }
+  end
+
   def learning_object_repository
     Portalmec::Application.repository.for :learning_object
   end
diff --git a/app/models/main_page.rb b/app/models/main_page.rb
new file mode 100644
index 0000000000000000000000000000000000000000..fad55d3bbaaa81f8f04a378e60249b0619ecd4de
--- /dev/null
+++ b/app/models/main_page.rb
@@ -0,0 +1,4 @@
+class MainPage
+  include ActiveModel::Model
+  attr_accessor :id, :carousel, :highlights
+end
\ No newline at end of file
diff --git a/app/models/role.rb b/app/models/role.rb
index 33cd819aca6c2fef5200134c096b45a0249961bb..33808ec85172a0ec383b61eac2f99d4e06852f91 100644
--- a/app/models/role.rb
+++ b/app/models/role.rb
@@ -1,3 +1,6 @@
 class Role < ActiveRecord::Base
   has_and_belongs_to_many :users
+
+  validates_presence_of :name
+  validates_uniqueness_of :name
 end
diff --git a/app/models/subject.rb b/app/models/subject.rb
index fee7acbe628ce931ae1acfcfee57e87d9ca142fb..a76b5da86bb24b66ca55e7cb654bd8e0a38dacb8 100644
--- a/app/models/subject.rb
+++ b/app/models/subject.rb
@@ -1,5 +1,15 @@
 class Subject
   include ActiveModel::Model
 
-  attr_accessor :id, :date_creation, :description, :highlights, :name, :thumbnail
+  attr_accessor :id, :date_creation, :description, :highlights, :name,
+                :learning_objects
+
+  def learning_objects
+    @learning_objects ||= subject_repository.get_learning_objects(self)
+  end
+  
+  def subject_repository
+    Portalmec::Application.repository.for :subject
+  end
+
 end
\ No newline at end of file
diff --git a/app/models/user.rb b/app/models/user.rb
index 165a95fec397b24c4280eab6b758cc63e90bea7f..28100ca583e944ea07f031fab91efee58583551d 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -23,8 +23,9 @@ class User < ActiveRecord::Base
   devise :database_authenticatable, :registerable,
          :recoverable, :rememberable, :trackable, :validatable
   has_and_belongs_to_many :roles
-
   after_create SyncUserRepositoryService.new
   after_destroy SyncUserRepositoryService.new
-end
 
+  has_attached_file :avatar, styles: { medium: "300x300>", thumb: "60x60>" }, default_url: ActionController::Base.helpers.asset_path('missing.svg')
+  validates_attachment_content_type :avatar, content_type: /\Aimage\/.*\Z/
+end
diff --git a/app/models/validators/collection_owner_validator.rb b/app/models/validators/collection_owner_validator.rb
new file mode 100644
index 0000000000000000000000000000000000000000..d98460e12908c90300f426b6f205d60eb34be780
--- /dev/null
+++ b/app/models/validators/collection_owner_validator.rb
@@ -0,0 +1,9 @@
+class Validators::CollectionOwnerValidator < ActiveModel::Validator
+
+  def validate(record)
+    if !record.owner.is_a?(User)
+      record.errors.add :base, 'The owner must be an User'
+    end
+  end
+
+end
\ No newline at end of file
diff --git a/app/models/web_link.rb b/app/models/web_link.rb
new file mode 100644
index 0000000000000000000000000000000000000000..ee1edc1eb3bb5c4369e1448629534530a3af286b
--- /dev/null
+++ b/app/models/web_link.rb
@@ -0,0 +1,4 @@
+class WebLink
+  include ActiveModel::Model
+  attr_accessor :id, :dateCreation, :description, :name, :thumbnail, :url
+end
\ No newline at end of file
diff --git a/app/repositories/active_record/subject_repository.rb b/app/repositories/active_record/subject_repository.rb
new file mode 100644
index 0000000000000000000000000000000000000000..dcccbb258a48790ca63d82e9de706190b23480f3
--- /dev/null
+++ b/app/repositories/active_record/subject_repository.rb
@@ -0,0 +1,14 @@
+module ActiveRecord
+  class SubjectRepository
+
+    def find_all
+    end
+
+    def find_by_id
+    end
+
+    def insert_data(name, url)
+    end
+
+  end
+end
diff --git a/app/repositories/orient_db/base.rb b/app/repositories/orient_db/base.rb
index 470d3acb43289708d223b75d1569daafd569f615..349ff82fd3f7c1c418682e5bb6b620d7280fc57e 100644
--- a/app/repositories/orient_db/base.rb
+++ b/app/repositories/orient_db/base.rb
@@ -9,31 +9,26 @@ class OrientDb::Base
     @connection
   end
 
-  def find(id)
+  def find_by_id(id)
     result = get_by_rid(id)
     build_object result
   end
 
   # Example:
-    #   list = repository.for(:learning_objects).all
+    #   list = repository.for(:learning_objects).find_all
     #   list.each do |learning_object|
     #     learning_object.inspect <LearningObject model>
     #   end
-  def all(limit=-1)
-    objects_hash = connection.query "SELECT FROM #{odb_class}", :limit => limit
+  def find_all
+    objects_hash = connection.query "SELECT FROM #{odb_class}", :limit => -1
     objects = build_objects(objects_hash) || []
   end
 
-  def all(limit,offset)
+  def find_all_from_offset_to_limit(offset,limit)
     objects_hash = connection.query "SELECT FROM #{odb_class} SKIP #{offset}", :limit => limit
     objects = build_objects(objects_hash) || []
   end
 
-  def all_after(after_id,limit=-1)
-    objects_hash = connection.query "SELECT FROM #{odb_class} WHERE @rid > #{after_id}", :limit => limit
-    objects = build_objects(objects_hash) || []
-  end
-
   def create(object)
     hash = build_hash(object)
     result = connection.create_document(hash)
diff --git a/app/repositories/orient_db/carousel_repository.rb b/app/repositories/orient_db/carousel_repository.rb
index a8a2d8c0a0c529dba2d7a43e4d02a0adfe9f5dd5..cf39aa0748c95cf833c983d7cb2b01cc5730e4c7 100644
--- a/app/repositories/orient_db/carousel_repository.rb
+++ b/app/repositories/orient_db/carousel_repository.rb
@@ -20,5 +20,11 @@ module OrientDb
         return nil
     end
 
+    private
+
+    def odb_class
+      "Carousel"
+    end
+
   end
 end
diff --git a/app/repositories/orient_db/collection_repository.rb b/app/repositories/orient_db/collection_repository.rb
new file mode 100644
index 0000000000000000000000000000000000000000..80e6b177add29920a2b038400e8267d5baee9449
--- /dev/null
+++ b/app/repositories/orient_db/collection_repository.rb
@@ -0,0 +1,26 @@
+module OrientDb
+  class CollectionRepository < Base
+    include OrientDb::Methods::EdgeMethods
+
+    # Usage:
+    #   repository.for(:collections).destroy collection
+    #
+    def destroy(collection)
+      connection.command sprintf("DELETE VERTEX %s", collection.id)
+    end
+
+    def build_object(args={})
+      Collection.new(
+          :id => args["@rid"],
+          :name => args["name"]
+      )
+    end
+
+    private
+
+    def odb_class
+      "Collection"
+    end
+
+  end
+end
diff --git a/app/repositories/orient_db/institution_repository.rb b/app/repositories/orient_db/institution_repository.rb
index 6bc0e470f058a2ff7d0dce33ec002053c7472200..028e13b96f04e1747c3e2825ad6e2638be70bb41 100644
--- a/app/repositories/orient_db/institution_repository.rb
+++ b/app/repositories/orient_db/institution_repository.rb
@@ -2,24 +2,6 @@ module OrientDb
   class InstitutionRepository < Base
     include OrientDb::Methods::EdgeMethods
 
-    # Example:
-    #   list = repository.for(:institutions).all
-    #   list.each do |institution|
-    #     institution_object.inspect <LearningObject model>
-    #   end
-    def all
-      hash = connection.query "SELECT FROM Institution"
-      institutions = build_institutions(hash)
-    end
-
-    # Usage:
-    #   institution = repository.for(:institutions).get_by_dspace_id 123
-    #
-    def find(id)
-      result = connection.query "SELECT FROM #{id}"
-      build_institution result.first
-    end
-
     def create(name, url)
       connection.command sprintf("INSERT INTO Institution (name) VALUES ('%s')", name)
     end
@@ -31,21 +13,17 @@ module OrientDb
       connection.command sprintf("DELETE VERTEX %s", institution.id)
     end
 
-    private
-
-    def build_institution(args={})
+    def build_object(args={})
       return Institution.new(
         :id => args["@rid"],
         :title => args["title"],
       )
     end
 
-    def build_institutions(hash=[])
-      institutions = []
-      hash.each do |h|
-        institutions << build_institution(h)
-      end
-      return institutions
+    private
+
+    def odb_class
+      "Institution"
     end
 
   end
diff --git a/app/repositories/orient_db/learning_object_repository.rb b/app/repositories/orient_db/learning_object_repository.rb
index 1c777f511a2095164cf60ff1b0ccc62ba2761c4b..689a95815eeeccde16e5b7c97ae8e90b42252f14 100644
--- a/app/repositories/orient_db/learning_object_repository.rb
+++ b/app/repositories/orient_db/learning_object_repository.rb
@@ -2,17 +2,16 @@ module OrientDb
   class LearningObjectRepository < Base
     include OrientDb::Methods::EdgeMethods
 
-    def increment_views(learning_object)
-      #learning_object.views = learning_object.views + 1
-      #save learning_object
+    def increment_views(user, learning_object)
+      create_edge "Views", user.rid, learning_object.id
     end
 
     #
     # Usage:
     #   repository.for(:learning_objects).like @learning_object, current_user
     #
-    def like(learning_object, user)
-      create_edge 'Likes', learning_object.id, user.id
+    def like(user, learning_object)
+      create_edge "Likes", user.rid, learning_object.id
     end
 
     # Usage:
@@ -46,42 +45,50 @@ module OrientDb
       connection.command sprintf("DELETE VERTEX #{odb_class} where @rid = '%s'", learning_object.id)
     end
 
-    #def author_of(rid)
-    #  connection.query "SELECT expand(in) FROM (SELECT expand(out_author_of) FROM User WHERE @rid=#{rid})"
-    #end
-
-    #def has(rid)
-    #  connection.query "SELECT expand(in) FROM (SELECT expand(out_has) FROM User WHERE @rid=#{rid})"
-    #end
-
-    #def get_likes(id)
-    #  likes = connection.query "select outE('Likes') from #{id}"
-    #  likes[0]["outE"]
-    #end
-
-    #def get_downloads(id)
-    #  downloads = connection.query "select outE('Downloads') from #{id}"
-    #  downloads[0]["outE"]
-    #end
-
-    #def get_views(id)
-    #  views = connection.query "select outE('Views') from #{id}"
-    #  views[0]["outE"]
-    #end
+    ##
+    # To create "index:learningobject_search" on OrientDB, use the following command:
+    #   CREATE INDEX learningobject_search
+    #   ON LearningObject (name, description)
+    #   FULLTEXT ENGINE LUCENE
+    #   METADATA {"analyzer":"org.apache.lucene.analysis.br.BrazilianAnalyzer"}
+    def search(qry)
+      learning_objects_hash = connection.query "
+                                SELECT EXPAND(rid)
+                                FROM index:learningobject_search
+                                WHERE key LUCENE '#{qry}'
+                              ", limit: -1
+      learning_objects = build_learning_objects(learning_objects_hash) || []
+    end
 
     def build_object(args={})
       lo = nil
       unless args.nil?
         lo = LearningObject.new(:id => args["@rid"],
-                                :id_dspace => args["id_dspace"],
-                                :name => args["name"],
-                                :metadata => args["metadata"])
+                              :name => args["name"],
+                              :description => args["description"],
+                              :thumbnail => args["thumbnail"],
+                              :date_creation => args["date_creation"],
+                              :id_dspace => args["id_dspace"],
+                              :type => args["type"],
+                              :bitstreams => args["bitstreams"],
+                              :metadata => args["metadata"],
+                              :last_modified => args["last_modified"])
         lo.likes = args.has_key?("in_Likes") ? args["in_Likes"].size : 0
         lo.views = args.has_key?("in_Views") ? args["in_Views"].size : 0
       end
       lo
     end
 
+    def build_hash
+      hash = super
+      hash.delete("likes")
+      hash.delete("views")
+      hash.delete("downloads")
+      hash.delete("subjects")
+      hash.delete("attributes")
+      hash
+    end
+
     private
 
     def create_edges_from_array(edge_class, id, array, unique=false)
@@ -107,4 +114,4 @@ module OrientDb
     end
 
   end
-end
\ No newline at end of file
+end
diff --git a/app/repositories/orient_db/main_page_repository.rb b/app/repositories/orient_db/main_page_repository.rb
index 27b7e8e57eaaca569dd1bb55527780fd8ef8b9d5..3663b56d481e6f1a0af7d6460d4fb228709af896 100644
--- a/app/repositories/orient_db/main_page_repository.rb
+++ b/app/repositories/orient_db/main_page_repository.rb
@@ -22,7 +22,13 @@ module OrientDb
 
     def update(id,operation,atributte,new)
       puts "update #{id} #{operation} #{atributte} = #{new}"
-      return @connection.command "update #{id} #{operation} #{atributte} = #{new}"
+      connection.command "update #{id} #{operation} #{atributte} = #{new}"
+    end
+
+    private
+
+    def odb_class
+      "MainPage"
     end
 
   end
diff --git a/app/repositories/orient_db/subject_repository.rb b/app/repositories/orient_db/subject_repository.rb
index 01a9b1ce2cd68174fc7c84f50a3a365722640b1c..f61ce039052400071af43deae864f31520fbb861 100644
--- a/app/repositories/orient_db/subject_repository.rb
+++ b/app/repositories/orient_db/subject_repository.rb
@@ -1,11 +1,32 @@
 module OrientDb
   class SubjectRepository < Base
+    include OrientDb::Methods::EdgeMethods
 
     def find_by_name(name)
       result = select_by_property(odb_class, "name", name)
       build_object(result.first)
     end
 
+    def destroy_data(id)
+        connection.command "DELETE VERTEX Subject where @rid = '#{id}'"
+    end
+
+    def update(id,operation,atributte,new_value)
+      puts "update #{id} #{operation} #{atributte} = #{new_value}"
+      connection.command "update #{id} #{operation} #{atributte} = #{new_value}"
+    end
+
+    def get_learning_objects(subject)
+      result = get_edges_end("IsAbout","in",subject.id)
+      Portalmec::Application.repository.for(:learning_object).build_objects(result)
+    end
+
+    def build_hash
+      hash = super
+      hash.delete("learning_objects")
+      hash
+    end
+
     def build_object(args={})
       subject = nil
       unless args.nil?
@@ -27,4 +48,4 @@ module OrientDb
     end
 
   end
-end
\ No newline at end of file
+end
diff --git a/app/repositories/orient_db/user_repository.rb b/app/repositories/orient_db/user_repository.rb
index ef73202db25fc2d2aa67df52c9259451e638537f..8068a3f257520146b9ee68607ad1773452c4dca3 100644
--- a/app/repositories/orient_db/user_repository.rb
+++ b/app/repositories/orient_db/user_repository.rb
@@ -2,11 +2,32 @@ module OrientDb
   class UserRepository < Base
 
     def create_graph_node(user)
-      connection.command sprintf("INSERT INTO User (p_id) VALUES (%d)", user.id)
+      if user.persisted?
+        connection.command sprintf("create vertex User set p_id = %d", user.id)
+        return true
+      end
+
+      raise NotPersistedRecordError, 'The user wasn`t persisted yet.'
     end
 
     def destroy_graph_node(user)
-      connection.command sprintf("DELETE FROM User WHERE p_id = %d", user.id)
+      connection.command sprintf("destroy vertex User WHERE p_id = %d", user.id)
+    end
+
+    def get_graph_id(user)
+      result = connection.query sprintf("SELECT @rid FROM User WHERE p_id = %d", user.id)
+      result.first["rid"].to_s
+    end
+
+    def is_vertex?(user)
+      result = connection.query sprintf("SELECT @rid FROM User WHERE p_id = %d", user.id)
+      (result.count > 0)
+    end
+
+    private
+
+    def odb_class
+      "User"
     end
 
   end
diff --git a/app/repositories/user_repository_proxy.rb b/app/repositories/user_repository_proxy.rb
index d18a0a88d6e8f122499d7678e2caa39b9f8a4381..94e18c596c39b2349b66304edb9fae371caa0bd8 100644
--- a/app/repositories/user_repository_proxy.rb
+++ b/app/repositories/user_repository_proxy.rb
@@ -7,7 +7,17 @@ class UserRepositoryProxy
   end
 
   def create_graph_node(user)
-    orientdb_user_repository.create_graph_node user
+    if user.persisted?
+      if orientdb_user_repository.create_graph_node user
+        update_user_refs user
+      end
+    else
+      raise_not_persisted_error
+    end
+  end
+
+  def get_graph_id(user)
+    orientdb_user_repository.get_graph_id user
   end
 
   def destroy_graph_node(user)
@@ -22,8 +32,24 @@ class UserRepositoryProxy
     User.respond_to?(method_name) || super
   end
 
+
   private
 
   attr_reader :orientdb_user_repository
 
-end
\ No newline at end of file
+  def update_user_refs(user)
+    rid = get_graph_id user
+    user.rid = rid
+    user.save!
+  end
+
+  def check_references(user)
+    rid = get_graph_id user
+    (rid == user.rid)
+  end
+
+  def raise_not_persisted_error
+    raise NotPersistedRecordError, 'The user wasn`t` persisted yet.'
+  end
+
+end
diff --git a/app/views/collections/index.html.erb b/app/views/collections/index.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..68aebfd77d68d1e74c4b6af2e9ea566d8babac6a
--- /dev/null
+++ b/app/views/collections/index.html.erb
@@ -0,0 +1,229 @@
+<h1>Coleções de Recursos</h1>
+
+<div class="row recommend-collections">
+  <h2>Recomendamos para você</h2>
+
+  <!-- item -->
+  <div class="col-sm-4">
+    <div class="row">
+      <h4><b>Compreensão oral</b></h4>
+      <div class="object-vertical">
+        <div class="panel">
+          <div>
+            <img src="http://dummyimage.com/250x150/363336/fff" alt="dummy image" class="img-responsive">
+          </div>
+          <div class="panel-body">
+            <h4 class="media-heading">Los derechos del animal (1)</h4>
+            <span class="glyphicon glyphicon-eye-open">200&nbsp;</span>
+            <span class="glyphicon glyphicon-star">4,5&nbsp;</span>
+            <span>Por <a>Usuário&nbsp;</a></span>
+          </div>
+        </div>
+      </div>
+      <p>
+        <a href="#">Ver Mais</a>
+      </p>
+    </div>
+  </div>
+  <!-- /item -->
+
+
+  <div class="col-sm-4">
+    <div class="row">
+      <h4><b>Educação Básica</b></h4>
+      <div class="object-vertical">
+        <div class="panel">
+          <div>
+            <img src="http://dummyimage.com/250x150/363336/fff" alt="dummy image" class="img-responsive">
+          </div>
+          <div class="panel-body">
+            <h4 class="media-heading">Los derechos del animal (1)</h4>
+            <span class="glyphicon glyphicon-eye-open">200&nbsp;</span>
+            <span class="glyphicon glyphicon-star">4,5&nbsp;</span>
+            <span>Por <a>Usuário&nbsp;</a></span>
+          </div>
+        </div>
+      </div>
+
+      <p>
+        <a href="#">Ver Mais</a>
+      </p>
+    </div>
+  </div>
+
+
+  <div class="col-sm-4">
+    <div class="row">
+      <h4><b>Ensino Médio</b></h4>
+      <div class="object-vertical">
+        <div class="panel">
+          <div>
+            <img src="http://dummyimage.com/250x150/363336/fff" alt="dummy image" class="img-responsive">
+          </div>
+          <div class="panel-body">
+            <h4 class="media-heading">Los derechos del animal (1)</h4>
+            <span class="glyphicon glyphicon-eye-open">200&nbsp;</span>
+            <span class="glyphicon glyphicon-star">4,5&nbsp;</span>
+            <span>Por <a>Usuário&nbsp;</a></span>
+          </div>
+        </div>
+      </div>
+
+      <p>
+        <a href="#">Ver Mais</a>
+      </p>
+    </div>
+  </div>
+</div>
+
+<div class="row newest-collections">
+  <h2>Últimas coleções</h2>
+
+  <!-- item -->
+  <div class="col-sm-4">
+    <div class="row">
+      <h4><b>Compreensão oral</b></h4>
+      <div class="object-vertical">
+        <div class="panel">
+          <div>
+            <img src="http://dummyimage.com/250x150/363336/fff" alt="dummy image" class="img-responsive">
+          </div>
+          <div class="panel-body">
+            <h4 class="media-heading">Los derechos del animal (1)</h4>
+            <span class="glyphicon glyphicon-eye-open">200&nbsp;</span>
+            <span class="glyphicon glyphicon-star">4,5&nbsp;</span>
+            <span>Por <a>Usuário&nbsp;</a></span>
+          </div>
+        </div>
+      </div>
+      <p>
+        <a href="#">Ver Mais</a>
+      </p>
+    </div>
+  </div>
+  <!-- /item -->
+
+
+  <div class="col-sm-4">
+    <div class="row">
+      <h4><b>Educação Básica</b></h4>
+      <div class="object-vertical">
+        <div class="panel">
+          <div>
+            <img src="http://dummyimage.com/250x150/363336/fff" alt="dummy image" class="img-responsive">
+          </div>
+          <div class="panel-body">
+            <h4 class="media-heading">Los derechos del animal (1)</h4>
+            <span class="glyphicon glyphicon-eye-open">200&nbsp;</span>
+            <span class="glyphicon glyphicon-star">4,5&nbsp;</span>
+            <span>Por <a>Usuário&nbsp;</a></span>
+          </div>
+        </div>
+      </div>
+
+      <p>
+        <a href="#">Ver Mais</a>
+      </p>
+    </div>
+  </div>
+
+
+  <div class="col-sm-4">
+    <div class="row">
+      <h4><b>Ensino Médio</b></h4>
+      <div class="object-vertical">
+        <div class="panel">
+          <div>
+            <img src="http://dummyimage.com/250x150/363336/fff" alt="dummy image" class="img-responsive">
+          </div>
+          <div class="panel-body">
+            <h4 class="media-heading">Los derechos del animal (1)</h4>
+            <span class="glyphicon glyphicon-eye-open">200&nbsp;</span>
+            <span class="glyphicon glyphicon-star">4,5&nbsp;</span>
+            <span>Por <a>Usuário&nbsp;</a></span>
+          </div>
+        </div>
+      </div>
+
+      <p>
+        <a href="#">Ver Mais</a>
+      </p>
+    </div>
+  </div>
+</div>
+
+<div class="row newest-collections">
+  <h2>Últimas coleções</h2>
+
+  <!-- item -->
+  <div class="col-sm-4">
+    <div class="row">
+      <h4><b>Compreensão oral</b></h4>
+      <div class="object-vertical">
+        <div class="panel">
+          <div>
+            <img src="http://dummyimage.com/250x150/363336/fff" alt="dummy image" class="img-responsive">
+          </div>
+          <div class="panel-body">
+            <h4 class="media-heading">Los derechos del animal (1)</h4>
+            <span class="glyphicon glyphicon-eye-open">200&nbsp;</span>
+            <span class="glyphicon glyphicon-star">4,5&nbsp;</span>
+            <span>Por <a>Usuário&nbsp;</a></span>
+          </div>
+        </div>
+      </div>
+      <p>
+        <a href="#">Ver Mais</a>
+      </p>
+    </div>
+  </div>
+  <!-- /item -->
+
+
+  <div class="col-sm-4">
+    <div class="row">
+      <h4><b>Educação Básica</b></h4>
+      <div class="object-vertical">
+        <div class="panel">
+          <div>
+            <img src="http://dummyimage.com/250x150/363336/fff" alt="dummy image" class="img-responsive">
+          </div>
+          <div class="panel-body">
+            <h4 class="media-heading">Los derechos del animal (1)</h4>
+            <span class="glyphicon glyphicon-eye-open">200&nbsp;</span>
+            <span class="glyphicon glyphicon-star">4,5&nbsp;</span>
+            <span>Por <a>Usuário&nbsp;</a></span>
+          </div>
+        </div>
+      </div>
+
+      <p>
+        <a href="#">Ver Mais</a>
+      </p>
+    </div>
+  </div>
+
+
+  <div class="col-sm-4">
+    <div class="row">
+      <h4><b>Ensino Médio</b></h4>
+      <div class="object-vertical">
+        <div class="panel">
+          <div>
+            <img src="http://dummyimage.com/250x150/363336/fff" alt="dummy image" class="img-responsive">
+          </div>
+          <div class="panel-body">
+            <h4 class="media-heading">Los derechos del animal (1)</h4>
+            <span class="glyphicon glyphicon-eye-open">200&nbsp;</span>
+            <span class="glyphicon glyphicon-star">4,5&nbsp;</span>
+            <span>Por <a>Usuário&nbsp;</a></span>
+          </div>
+        </div>
+      </div>
+
+      <p>
+        <a href="#">Ver Mais</a>
+      </p>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/app/views/collections/index.json.jbuilder b/app/views/collections/index.json.jbuilder
new file mode 100644
index 0000000000000000000000000000000000000000..ab3f845e60ad913050aecf50f3ac3032e4ce6c7a
--- /dev/null
+++ b/app/views/collections/index.json.jbuilder
@@ -0,0 +1,4 @@
+json.array!(@collections) do |collection|
+  json.extract! collection, :id, :name
+  #json.url collection_url(collection, format: :json)
+end
diff --git a/app/views/collections/show.html.erb b/app/views/collections/show.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..c224d3447d983e5f37cb4f4649b8aeb531ff483a
--- /dev/null
+++ b/app/views/collections/show.html.erb
@@ -0,0 +1 @@
+<h1><%= @collection.name %></h1>
diff --git a/app/views/collections/show.json.jbuilder b/app/views/collections/show.json.jbuilder
new file mode 100644
index 0000000000000000000000000000000000000000..64c29dac93b6771a3fe28d4cb989186a5f058fc8
--- /dev/null
+++ b/app/views/collections/show.json.jbuilder
@@ -0,0 +1 @@
+json.extract! @collection, :id, :name
diff --git a/app/views/devise/registrations/edit.html.erb b/app/views/devise/registrations/edit.html.erb
index 51ee35d468d244240877322f4c038e7af2f87448..9a894469bc0691b04f35cfa7aa4d622dc030f0fa 100644
--- a/app/views/devise/registrations/edit.html.erb
+++ b/app/views/devise/registrations/edit.html.erb
@@ -1,6 +1,6 @@
 <h2>Edit <%= resource_name.to_s.humanize %></h2>
 
-<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: {method: :put}) do |f| %>
+<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: {method: :put, multipart: true}) do |f| %>
     <%= devise_error_messages! %>
 
     <div class="field">
@@ -13,6 +13,11 @@
       <%= f.email_field :email, autofocus: true %>
     </div>
 
+    <div class="field">
+      <%= f.label :avatar %><br/>
+      <%= f.file_field :avatar %>
+    </div>
+
     <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
         <div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div>
     <% end %>
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
index 91214e8314b348751ea78190b9f95cb2e248eb5c..5974f076c8ed56f498f2588ac3fa2c65fd02e7b7 100644
--- a/app/views/layouts/application.html.erb
+++ b/app/views/layouts/application.html.erb
@@ -2,34 +2,35 @@
 <html>
 <head>
  <title>PortalMEC</title>
- <%= stylesheet_link_tag    'application', media: 'all' %>
- <%= javascript_include_tag 'application' %>
- <%= javascript_include_tag "http://www.google.com/jsapi", "chartkick" %>
- <%= stylesheet_link_tag 'http://yandex.st/bootstrap/3.1.1/css/bootstrap.min.css' %>
- <%= javascript_include_tag 'http://yandex.st/bootstrap/3.1.1/js/bootstrap.min.js' %>
- <%= csrf_meta_tags %>
-
   <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
-
+  <link href='https://fonts.googleapis.com/css?family=Roboto:400,300,700,500' rel='stylesheet' type='text/css'>
   <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
   <%= csrf_meta_tags %>
   <meta property="creator.productor" content="http://estruturaorganizacional.dados.gov.br/id/unidade-organizacional/1">
 </head>
-<body style="font-size: 15px">
-<div id="wrapper">
+<body>
   <%= render 'shared/application/header' %>
 
-  <% if notice %>
-      <%= notice %>
-  <% end %>
+  <div class="container">
+    <% if notice %>
+      <div class="alert alert-info" role="alert">
+        <button type="button" class="close" data-dismiss="alert" aria-label="Fechar"><span aria-hidden="true">&times;</span></button>
+        <%= notice %>
+      </div>
+    <% end %>
+
+    <% if alert %>
+      <div class="alert alert-danger alert-dismissible" role="alert">
+        <button type="button" class="close" data-dismiss="alert" aria-label="Fechar"><span aria-hidden="true">&times;</span></button>
+        <%= alert %>
+      </div>
+    <% end %>
 
-  <div id="content">
     <%= yield %>
   </div>
-  <div id="footer">
-    <%= render 'shared/application/footer' %>
-  </div>
-</div>
-<script defer="defer" src="//barra.brasil.gov.br/barra.js" type="text/javascript"></script>
+
+  <%= render 'shared/application/footer' %>
+
+  <script defer="defer" src="//barra.brasil.gov.br/barra.js" type="text/javascript"></script>
 </body>
 </html>
diff --git a/app/views/learning_objects/_learning_object.erb b/app/views/learning_objects/_learning_object.erb
new file mode 100644
index 0000000000000000000000000000000000000000..d1ed26f2a6ed15e5564ff8d056e5029913029f75
--- /dev/null
+++ b/app/views/learning_objects/_learning_object.erb
@@ -0,0 +1,27 @@
+<div class="learning_object-horizontal">
+  <div class="media">
+    <div class="media-left media-middle">
+      <a href="#">
+        <img src="http://dummyimage.com/250x150/363336/fff" alt='dummy image'>
+      </a>
+    </div>
+    <div class="media-body">
+      <a href="<%= learning_object_path(id: learning_object.id) %>">
+        <% if learning_object.name.nil? %>
+            <h4 class="media-heading">Sem Título</h4>
+        <% else %>
+            <h4 class="media-heading"><%= learning_object.name %></h4>
+        <% end %>
+      </a>
+      <span>Por <a>Usuário&nbsp;</a></span><br/>
+      <span class="glyphicon glyphicon-eye-open"><%= learning_object.views %>&nbsp;</span>
+      <span class="glyphicon glyphicon-star"><%= learning_object.likes %>&nbsp;</span><br>
+      <% unless learning_object.description.nil? %>
+          <%= learning_object.description %>
+          <br/>
+      <% end %>
+      <br/>
+      Em<b> <%= show_categories learning_object.categories %></b>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/app/views/learning_objects/show.html.erb b/app/views/learning_objects/show.html.erb
index dad01c260d0c569cedb5efcb9a0c6567f6ce8780..1c485edad72b11ac3778fb4538becfa23f8340c5 100644
--- a/app/views/learning_objects/show.html.erb
+++ b/app/views/learning_objects/show.html.erb
@@ -1,24 +1,24 @@
-<h1><%= @learning_object.title %></h1>
+<h1><%= @learning_object.name %></h1>
 
 <ul>
-  <li><b>Autor: </b><%= @learning_object.metadata["dc_contributor_author"] %></li>
-  <li><b>Tipo: </b><%= @learning_object.metadata["dc_type"] %></li>
-  <li><b>Data: </b><%= @learning_object.metadata["dc_date_available"] %></li>
-  <li><b>Linguagem: </b><%= @learning_object.metadata["dc_language"] %></li>
-  <li><b>Categorias: </b></li>
+  <li><b>Autor: </b><%= @learning_object.get_metadata_value_of("dc.contributor.author") %></li>
+  <li><b>Tipo: </b><%= @learning_object.get_metadata_value_of("dc.type") %></li>
+  <li><b>Data: </b><%= @learning_object.get_metadata_value_of("dc.date.available") %></li>
+  <li><b>Linguagem: </b><%= @learning_object.get_metadata_value_of("dc.language") %></li>
+  <li><b>Metadados: </b></li>
   <ul>
-    <% @learning_object.metadata["dc_subject_category"].each do |category| %>
-      <li><%= category %></li>
-    <% end %>
+    <% @learning_object.metadata.each do |m| %>
+      <li><%= "#{m["key"]}: #{m["value"]}" %></li>
+      <% end %>
   </ul>
 </ul>
 
-<%= button_to(
-    "Curtir",
-    { action: "create_like", controller: "edges" },
-    method: :post,
-    params: { from_id: "#14:0", to_id: @learning_object.id }
-)%>
 <br>
-<p>Total Curtir: <%= get_object_property(@like_counts,"COUNT") %></p>
-<p>Total Visualizações: <%= get_object_property(@view_counts,"COUNT") %></p>
+<p>Total Curtir: <%= @learning_object.likes %></p>
+<p>Total Visualizações: <%= @learning_object.views %></p>
+<br>
+<% if user_signed_in? %>
+  <%= link_to "Curtir",
+              like_learning_object_path(@learning_object.id_dspace),
+              method: :post, remote: true %>
+<% end %>
diff --git a/app/views/search/index.html.erb b/app/views/search/index.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..1fb3a77ae086e54ea955a51505fbc4be4ced1e29
--- /dev/null
+++ b/app/views/search/index.html.erb
@@ -0,0 +1,373 @@
+<script type="text/javascript">
+    $(document).ready(function () {
+        $(".select-tag-container").select2();
+
+        var runDropdown = function (element) {
+            if ($(element).next().is(':hidden')) {
+                $('> .caret', element).addClass('caret-up');
+                $(element).next().slideDown();
+            }
+            else {
+                $('> .caret', element).removeClass('caret-up');
+                $(element).next().slideUp();
+            }
+        };
+
+        runDropdown($('#nestedAccordion .dropdown'));
+
+        $('#nestedAccordion .dropdown').click(function () {
+            runDropdown(this);
+        });
+    });
+</script>
+
+<div class="row">
+  <div class="col-sm-4 search-sidebar">
+    <!-- <h2>Busca Avançada</h2> -->
+    <!-- <div class="media">
+      <div class="media-left">
+        <span class="glyphicon glyphicon-list" style="font-size: 40px" aria-hidden="true" />
+      </div>
+      <div class="media-body">
+        <h4 class="media-heading">Filtros</h4>
+        Nenhum selecionado
+      </div>
+    </div> -->
+
+    <div id="nestedAccordion">
+      <h3 class="dropdown open">Matérias<span class="caret caret-align-right"/></h3>
+
+      <div class="dropdown-element">
+        <h4 class="dropdown">Matemática<span class="caret caret-align-right"/></h4>
+
+        <div>
+          <select class="select-tag-container" multiple="multiple">
+            <option value="">Todos</option>
+            <optgroup label="Básico">
+              <option value="">Conjuntos</option>
+              <option value="">Soma</option>
+            </optgroup>
+            <optgroup label="Avançada">
+              <option value="AL">Álgebra</option>
+              <option value="">...</option>
+            </optgroup>
+          </select>
+        </div>
+        <h4 class="dropdown">Biologia<span class="caret caret-align-right"/></h4>
+
+        <div>
+          <select class="select-tag-container" multiple="multiple">
+            <option value="">Todos</option>
+            <optgroup label="Básico">
+              <option value="">Plantas</option>
+              <option value="">...</option>
+            </optgroup>
+            <optgroup label="Avançada">
+              <option value="">...</option>
+            </optgroup>
+          </select>
+        </div>
+        <h4 class="dropdown">História<span class="caret caret-align-right"/></h4>
+
+        <div>
+          <select class="select-tag-container" multiple="multiple">
+            <option value="">Todos</option>
+            <optgroup label="Básico">
+              <option value="">História do Brasil</option>
+              <option value="">...</option>
+            </optgroup>
+            <optgroup label="Avançada">
+              <option value="">...</option>
+            </optgroup>
+          </select>
+        </div>
+        <h4 class="dropdown">Língua Portuguesa<span class="caret caret-align-right"/></h4>
+
+        <div>
+          <select class="select-tag-container" multiple="multiple">
+            <option value="">Todos</option>
+            <optgroup label="Básico">
+              <option value="">...</option>
+              <option value="">...</option>
+            </optgroup>
+            <optgroup label="Avançada">
+              <option value="">...</option>
+            </optgroup>
+          </select>
+        </div>
+        <h4 class="dropdown">Geografia<span class="caret caret-align-right"/></h4>
+
+        <div>
+          <select class="select-tag-container" multiple="multiple">
+            <option value="">Todos</option>
+            <optgroup label="Básico">
+              <option value="">...</option>
+              <option value="">...</option>
+            </optgroup>
+            <optgroup label="Avançada">
+              <option value="">...</option>
+            </optgroup>
+          </select>
+        </div>
+        <h4 class="dropdown">Ciências<span class="caret caret-align-right"/></h4>
+
+        <div>
+          <select class="select-tag-container" multiple="multiple">
+            <option value="">Todos</option>
+            <optgroup label="Básico">
+              <option value="">...</option>
+              <option value="">...</option>
+            </optgroup>
+            <optgroup label="Avançada">
+              <option value="">...</option>
+            </optgroup>
+          </select>
+        </div>
+        <h4 class="dropdown">Educação Física<span class="caret caret-align-right"/></h4>
+
+        <div>
+          <select class="select-tag-container" multiple="multiple">
+            <option value="">Todos</option>
+            <optgroup label="Básico">
+              <option value="">...</option>
+              <option value="">...</option>
+            </optgroup>
+            <optgroup label="Avançada">
+              <option value="">...</option>
+            </optgroup>
+          </select>
+        </div>
+        <h4 class="dropdown">Inglês<span class="caret caret-align-right"/></h4>
+
+        <div>
+          <select class="select-tag-container" multiple="multiple">
+            <option value="">Todos</option>
+            <optgroup label="Básico">
+              <option value="">...</option>
+              <option value="">...</option>
+            </optgroup>
+            <optgroup label="Avançada">
+              <option value="">...</option>
+            </optgroup>
+          </select>
+        </div>
+      </div>
+      <!--fim materias -->
+      <h3 class="dropdown open">Conteúdo<span class="caret caret-align-right"/></h3><!--Tipo 1-->
+      <div class="dropdown-element">
+        <table class="tipo1" style="width:100%">
+          <tr>
+            <td><p>Mídia</p></td>
+            <td></td>
+          </tr>
+          <tr>
+            <td><input type="checkbox"> Fotos</td>
+            <td><input type="checkbox"> Imagens</td>
+          </tr>
+          <tr>
+            <td><input type="checkbox"> Áudio</td>
+            <td><input type="checkbox"> Vídeos</td>
+          </tr>
+          <tr>
+            <td><input type="checkbox"> Apresentações Multimídia</td>
+            <td><input type="checkbox"> Apps</td>
+          </tr>
+          <tr>
+            <td></td>
+            <td></td>
+          </tr>
+          <tr>
+            <td><p>Textos</p></td>
+            <td></td>
+          </tr>
+          <tr>
+            <td><input type="checkbox"> Anais</td>
+            <td><input type="checkbox"> Artigos Web</td>
+          </tr>
+          <tr>
+            <td><input type="checkbox"> Capítulos de Livros</td>
+            <td><input type="checkbox"> Dissertações</td>
+          </tr>
+          <tr>
+            <td><input type="checkbox"> Livros</td>
+            <td><input type="checkbox"> Monografias</td>
+          </tr>
+          <tr>
+            <td><input type="checkbox"> Periódicos</td>
+            <td><input type="checkbox"> Revistas</td>
+          </tr>
+          <tr>
+            <td><input type="checkbox"> Teses</td>
+          </tr>
+          <tr>
+            <td></td>
+            <td></td>
+          </tr>
+          <tr>
+            <td><p>Outros</p></td>
+            <td></td>
+          </tr>
+          <tr>
+            <td><input type="checkbox"> Planos de Aula</td>
+          </tr>
+        </table>
+      </div>
+      <!--  <h3>Conteúdo - Tipo 2</h3>
+        <div>
+          <h4>Mídia</h4>
+            <div>
+              <table>
+              <tr>
+                <td><input type="checkbox">Fotos</td>
+                <td><input type="checkbox">Imagens</td>
+              </tr>
+              <tr>
+                <td><input type="checkbox">Vídeos</td>
+                <td><input type="checkbox">Áudio</td>
+            </tr>
+            <tr>
+                <td><input type="checkbox">Apresentações Multimídia</td>
+                <td><input type="checkbox">Apps</td>
+              </tr>
+            </table>
+            </div>
+            <h4>Textos</h4>
+            <div>
+              <table>
+              <tr>
+                 <td><input type="checkbox">Anais</td>
+                <td><input type="checkbox">Artigos Web</td>
+              </tr>
+              <tr>
+                <td><input type="checkbox">Capítulos de Livros</td>
+                <td><input type="checkbox">Dissertações</td>
+            </tr>
+            <tr>
+                <td><input type="checkbox">Livros</td>
+                <td><input type="checkbox">Monografias</td>
+              </tr>
+              <tr>
+                <td><input type="checkbox">Periódicos</td>
+                <td><input type="checkbox">Revistas</td>
+              </tr>
+              <tr>
+                <td><input type="checkbox">Teses</td>
+                <td></td>
+              </tr>
+            </table>
+            </div>
+            <h4>Outros</h4>
+            <div>
+              <input type="checkbox">Planos de Aula
+            </div>
+        </div> -->
+      <h3 class="dropdown">Ano escolar<span class="caret caret-align-right"/></h3>
+
+      <div class="dropdown-element">
+        <table style="width:100%">
+          <tr>
+            <td><input type="checkbox">1º</td>
+            <td><input type="checkbox">5º</td>
+          </tr>
+          <tr>
+            <td><input type="checkbox">2º</td>
+            <td><input type="checkbox">6º</td>
+          </tr>
+          <tr>
+            <td><input type="checkbox">3º</td>
+            <td><input type="checkbox">7º</td>
+          </tr>
+          <tr>
+            <td><input type="checkbox">4º</td>
+            <td><input type="checkbox">8º</td>
+          </tr>
+        </table>
+      </div>
+      <h3 class="dropdown">Ano de Publicação<span class="caret caret-align-right"/></h3>
+
+      <div class="dropdown-element">
+        <input type="radio" name="ano" value="single" checked>Ano:<br/>
+        <input type="text" name="ano1" size="8">
+        <br/>
+        <input type="radio" name="ano" value="range">Intervalo:<br/>
+        <input type="text" name="ano2" size="8"> - <input type="text" name="ano2" size="8">
+      </div>
+    </div>
+    <!-- fim div id="nestedAccordion"-->
+
+    <div id="nestedAccordion">
+      <h3 class="dropdown">Pesquisa Avançada<span class="caret caret-align-right"/></h3>
+
+      <form method="get">
+        <div class="dropdown-element">
+          <table style="width:100%">
+            <tr>
+              <td>Todas estas palavras:</td>
+              <td><input type="text" name=""></td>
+            </tr>
+            <tr>
+              <td>A frase exata:</td>
+              <td><input type="text" name=""></td>
+            </tr>
+            <tr>
+              <td>Qualquer uma destas palavras:</td>
+              <td><input type="text" name=""></td>
+            </tr>
+            <tr>
+              <td>Nenhuma destas palavras:</td>
+              <td><input type="text" name=""></td>
+            </tr>
+            <tr>
+              <td></td>
+              <td align="right"><br>
+                <button type="submit" class="btn btn-default">Pesquisar</button>
+              </td>
+            </tr>
+          </table>
+        </div>
+      </form>
+    </div>
+  </div>
+  <!--/span col sm-4-->
+
+  <!-- search results -->
+  <div class="col-sm-8">
+    <% unless @results.empty? %>
+        <div>
+          Mostrando resultados <%= @start+1 %>-<%= if (@start+@npagnac) > @numFound then
+                                                     @numFound
+                                                   else
+                                                     (@npagnac+@start)
+                                                   end %> de <%= @numFound %>
+          <form method="get">
+            <input type="hidden" name="qry" value="<%= params["qry"] %>">
+
+            <select name="paginacao" onchange='this.form.submit()'>
+              <option value="<%= @npagnac %>">Resultados por Página</option>
+              <option value="10">10</option>
+              <option value="25">25</option>
+              <option value="50">50</option>
+            </select>
+
+            <select name="sort" onchange='this.form.submit()'>
+              <option value=<%= @ordena %>>Ordenar por</option>
+              <option value="author">Autores</option>
+              <option value="publicationasc">Mais novos</option>
+              <option value="publicationdesc">Mais velhos</option>
+              <option value="relevance">Relevância</option>
+              <option value="type">Tipo</option>
+              <option value="title">Título</option>
+            </select>
+          </form>
+          <br/>
+        </div>
+        <br/>
+
+        <div class="container-fluid">
+          <%= render @results %>
+          <%= will_paginate @results %>
+        </div>
+    <% end %>
+  </div>
+  <!-- col-sm-8 -->
+</div><!-- /container -->
\ No newline at end of file
diff --git a/app/views/search/solr/search.html.erb b/app/views/search/solr/search.html.erb
deleted file mode 100644
index a86ff749c43ce3ecb9aad1c2dc7ec55a769a3651..0000000000000000000000000000000000000000
--- a/app/views/search/solr/search.html.erb
+++ /dev/null
@@ -1,354 +0,0 @@
-<script type="text/javascript">
-    $(document).ready(function() {
-        var parentDivs = $('#nestedAccordion div'),
-                childDivs = $('#nestedAccordion h3').siblings('div');
-
-        $('#nestedAccordion h2').click(function(){
-            //		parentDivs.slideUp();
-            if($(this).next().is(':hidden')){
-                $(this).next().slideDown();
-            }else{
-                $(this).next().slideUp();
-            }
-        });
-        $('#nestedAccordion h3').click(function(){
-            //		childDivs.slideUp();
-            if($(this).next().is(':hidden')){
-                $(this).next().slideDown();
-            }else{
-                $(this).next().slideUp();
-            }
-        });
-    });
-</script>
-
-<div class="container-fluid">
-  <div class="col-sm-4">
-    <div class="well sidebar-nav">
-      <h2> Busca Avançada</h2>
-
-      <div id="nestedAccordion">
-        <h2>Seleção Atual</h2>
-        <div>
-          <input type="checkbox">
-        </div>
-        <h2>Matérias</h2>
-        <div class='aberto'>
-          <h3>Matemática</h3>
-          <div>
-            <select class="js-example-basic-multiple" multiple="multiple">
-              <option value="">Todos</option>
-              <optgroup label="Básico">
-                <option value="">Conjuntos</option>
-                <option value="">Soma</option>
-              </optgroup>
-              <optgroup label="Avançada">
-                <option value="AL">Álgebra</option>
-                <option value="">...</option>
-              </optgroup>
-            </select>
-          </div>
-          <h3>Biologia</h3>
-          <div>
-            <select class="js-example-basic-multiple" multiple="multiple">
-              <option value="">Todos</option>
-              <optgroup label="Básico">
-                <option value="">Plantas</option>
-                <option value="">...</option>
-              </optgroup>
-              <optgroup label="Avançada">
-                <option value="">...</option>
-              </optgroup>
-            </select>
-          </div>
-          <h3>História</h3>
-          <div>
-            <select class="js-example-basic-multiple" multiple="multiple">
-              <option value="">Todos</option>
-              <optgroup label="Básico">
-                <option value="">História do Brasil</option>
-                <option value="">...</option>
-              </optgroup>
-              <optgroup label="Avançada">
-                <option value="">...</option>
-              </optgroup>
-            </select>
-          </div>
-          <h3>Língua Portuguesa</h3>
-          <div>
-            <select class="js-example-basic-multiple" multiple="multiple">
-              <option value="">Todos</option>
-              <optgroup label="Básico">
-                <option value="">...</option>
-                <option value="">...</option>
-              </optgroup>
-              <optgroup label="Avançada">
-                <option value="">...</option>
-              </optgroup>
-            </select>
-          </div>
-          <h3>Geografia</h3>
-          <div>
-            <select class="js-example-basic-multiple" multiple="multiple">
-              <option value="">Todos</option>
-              <optgroup label="Básico">
-                <option value="">...</option>
-                <option value="">...</option>
-              </optgroup>
-              <optgroup label="Avançada">
-                <option value="">...</option>
-              </optgroup>
-            </select>
-          </div>
-          <h3>Ciências</h3>
-          <div>
-            <select class="js-example-basic-multiple" multiple="multiple">
-              <option value="">Todos</option>
-              <optgroup label="Básico">
-                <option value="">...</option>
-                <option value="">...</option>
-              </optgroup>
-              <optgroup label="Avançada">
-                <option value="">...</option>
-              </optgroup>
-            </select>
-          </div>
-          <h3>Educação Física</h3>
-          <div>
-            <select class="js-example-basic-multiple" multiple="multiple">
-              <option value="">Todos</option>
-              <optgroup label="Básico">
-                <option value="">...</option>
-                <option value="">...</option>
-              </optgroup>
-              <optgroup label="Avançada">
-                <option value="">...</option>
-              </optgroup>
-            </select>
-          </div>
-          <h3>Inglês</h3>
-          <div>
-            <select class="js-example-basic-multiple" multiple="multiple">
-              <option value="">Todos</option>
-              <optgroup label="Básico">
-                <option value="">...</option>
-                <option value="">...</option>
-              </optgroup>
-              <optgroup label="Avançada">
-                <option value="">...</option>
-              </optgroup>
-            </select>
-          </div>
-        </div><!--fim materias -->
-        <h2>Conteúdo</h2><!--Tipo 1-->
-        <div class='aberto'>
-          <table class="tipo1" style="width:100%">
-            <tr>
-              <td><p>Mídia</p> </td>
-              <td></td>
-            </tr>
-            <tr>
-              <td><input type="checkbox"> Fotos</td>
-              <td><input type="checkbox"> Imagens</td>
-            </tr>
-            <tr>
-              <td><input type="checkbox"> Áudio</td>
-              <td><input type="checkbox"> Vídeos</td>
-            </tr>
-            <tr>
-              <td><input type="checkbox"> Apresentações Multimídia</td>
-              <td><input type="checkbox"> Apps</td>
-            </tr>
-            <tr>
-              <td></td>
-              <td></td>
-            </tr>
-            <tr>
-              <td><p>Textos</p></td>
-              <td></td>
-            </tr>
-            <tr>
-              <td><input type="checkbox"> Anais</td>
-              <td><input type="checkbox"> Artigos Web</td>
-            </tr>
-            <tr>
-              <td><input type="checkbox"> Capítulos de Livros</td>
-              <td><input type="checkbox"> Dissertações</td>
-            </tr>
-            <tr>
-              <td><input type="checkbox"> Livros</td>
-              <td><input type="checkbox"> Monografias</td>
-            </tr>
-            <tr>
-              <td><input type="checkbox"> Periódicos</td>
-              <td><input type="checkbox"> Revistas</td>
-            </tr>
-            <tr>
-              <td><input type="checkbox"> Teses</td>
-            </tr>
-            <tr>
-              <td></td>
-              <td></td>
-            </tr>
-            <tr>
-              <td><p>Outros</p></td>
-              <td></td>
-            </tr>
-            <tr>
-              <td><input type="checkbox"> Planos de Aula</td>
-            </tr>
-          </table>
-        </div>
-        <!--  <h2>Conteúdo - Tipo 2</h2>
-          <div>
-            <h3>Mídia</h3>
-              <div>
-                <table>
-                <tr>
-                  <td><input type="checkbox">Fotos</td>
-                  <td><input type="checkbox">Imagens</td>
-                </tr>
-                <tr>
-                  <td><input type="checkbox">Vídeos</td>
-                  <td><input type="checkbox">Áudio</td>
-              </tr>
-              <tr>
-                  <td><input type="checkbox">Apresentações Multimídia</td>
-                  <td><input type="checkbox">Apps</td>
-                </tr>
-              </table>
-              </div>
-              <h3>Textos</h3>
-              <div>
-                <table>
-                <tr>
-                   <td><input type="checkbox">Anais</td>
-                  <td><input type="checkbox">Artigos Web</td>
-                </tr>
-                <tr>
-                  <td><input type="checkbox">Capítulos de Livros</td>
-                  <td><input type="checkbox">Dissertações</td>
-              </tr>
-              <tr>
-                  <td><input type="checkbox">Livros</td>
-                  <td><input type="checkbox">Monografias</td>
-                </tr>
-                <tr>
-                  <td><input type="checkbox">Periódicos</td>
-                  <td><input type="checkbox">Revistas</td>
-                </tr>
-                <tr>
-                  <td><input type="checkbox">Teses</td>
-                  <td></td>
-                </tr>
-              </table>
-              </div>
-              <h3>Outros</h3>
-              <div>
-                <input type="checkbox">Planos de Aula
-              </div>
-          </div> -->
-        <h2>Ano escolar</h2>
-        <div>
-          <table style="width:100%">
-            <tr>
-              <td><input type="checkbox">1º</td>
-              <td><input type="checkbox">5º</td>
-            </tr>
-            <tr>
-              <td><input type="checkbox">2º</td>
-              <td><input type="checkbox">6º</td>
-            </tr>
-            <tr>
-              <td><input type="checkbox">3º</td>
-              <td><input type="checkbox">7º</td>
-            </tr>
-            <tr>
-              <td><input type="checkbox">4º</td>
-              <td><input type="checkbox">8º</td>
-            </tr>
-          </table>
-        </div>
-        <h2>Ano de Publicação</h2>
-        <div>
-          <input type="radio" name="ano" value="single" checked>Ano:<br/>
-          <input type="text" name="ano1" size="8">
-          <br/>
-          <input type="radio" name="ano" value="range">Intervalo:<br/>
-          <input type="text" name="ano2" size="8"> - <input type="text" name="ano2" size="8">
-        </div>
-      </div><!-- fim div id="nestedAccordion"-->
-
-      <div id="nestedAccordion">
-        <h2>Pesquisa Avançada</h2>
-        <form method="get">
-          <div>
-            <table style="width:100%">
-              <tr>
-                <td>Todas estas palavras:</td>
-                <td><input type="text" name=""></td>
-              </tr>
-              <tr>
-                <td>A frase exata:</td>
-                <td><input type="text" name=""></td>
-              </tr>
-              <tr>
-                <td>Qualquer uma destas palavras:</td>
-                <td><input type="text" name=""></td>
-              </tr>
-              <tr>
-                <td>Nenhuma destas palavras:</td>
-                <td><input type="text" name=""></td>
-              </tr>
-              <tr>
-                <td></td>
-                <td align="right"><br><button type="submit" class="btn btn-default">Pesquisar</button></td>
-              </tr>
-            </table>
-          </div>
-        </form>
-      </div>
-
-    </div><!--/.well -->
-  </div><!--/span col sm-4-->
-  <div class="col-sm-8">
-
-    <% unless @objectsFound.empty? %>
-        <h3>Objetos encontrados: <%= @numFound %></h3>
-        <nav class="navbar navbar-default">
-          <div class="container-fluid" >
-            Mostrando resultados <%= @start+1 %>-<%= if (@start+@npagnac) > @numFound then @numFound else (@npagnac+@start) end %> de <%= @numFound %>
-            <form method="get">
-              <input type="hidden" name="qry" value="<%=params["qry"]%>">
-
-              <select name="paginacao" onchange='this.form.submit()'>
-                <option value="<%=@npagnac%>">Resultados por Página</option>
-                <option value="10">10</option>
-                <option value="25">25</option>
-                <option value="50">50</option>
-              </select>
-
-              <select name="sort" onchange='this.form.submit()'>
-                <option value=<%=@ordena%>>Ordenar por</option>
-                <option value="author">Autores</option>
-                <option value="publicationasc">Mais novos</option>
-                <option value="publicationdesc">Mais velhos</option>
-                <option value="relevance">Relevância</option>
-                <option value="type">Tipo</option>
-                <option value="title">Título</option>
-              </select>
-            </form>
-          </div>
-        </nav>
-        <br />
-        <div class="container-fluid">
-          <%= will_paginate @objectsFound %><!--%=@objectsFound%-->
-          <% @objectsFound.each do |o| %>
-              <%= render partial: "shared/application/object_tag1", locals: {obj: o} %>
-          <% end %>
-          <%= will_paginate @objectsFound %>
-        </div>
-    <% end %>
-
-  </div><!-- col-sm-8 -->
-</div><!-- /container -->
\ No newline at end of file
diff --git a/app/views/shared/application/_footer.html.erb b/app/views/shared/application/_footer.html.erb
index d2d8dca54b82afcc988bfa28cba00b67d0d80d48..501da61e0045b32ecdb55e00b6479a41309452be 100644
--- a/app/views/shared/application/_footer.html.erb
+++ b/app/views/shared/application/_footer.html.erb
@@ -1,4 +1,4 @@
-<footer id="footer">
+<footer>
   <div class="main">
     <div class="container">
       <div class="col-md-3">
@@ -32,40 +32,3 @@
     </div>
   </div>
 </footer>
-
-<script>
-    var substringMatcher = function (strs) {
-        return function findMatches(q, cb) {
-            var matches, substringRegex;
-            matches = [];
-            substrRegex = new RegExp(q, 'i');
-            $.each(strs, function (i, str) {
-                if (substrRegex.test(str)) {
-                    matches.push(str);
-                }
-            });
-            cb(matches);
-        };
-    };
-
-    var states = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California',
-        'Colorado', 'Connecticut', 'Delaware', 'Florida', 'Georgia', 'Hawaii',
-        'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana',
-        'Maine', 'Maryland', 'Massachusetts', 'Michigan', 'Minnesota',
-        'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire',
-        'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota',
-        'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode Island',
-        'South Carolina', 'South Dakota', 'Tennessee', 'Texas', 'Utah', 'Vermont',
-        'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 'Wyoming'
-    ];
-
-    $('#typeahead #input').typeahead({
-        hint: true,
-        highlight: true,
-        minLength: 1
-    }, {
-        name: 'states',
-        source: substringMatcher(states),
-        templates: {}
-    });
-</script>
\ No newline at end of file
diff --git a/app/views/shared/application/_header.html.erb b/app/views/shared/application/_header.html.erb
index e1389a9f3d4f9619bbc9990efbdc653a18e2ae81..81a44137b95d79115859210d4afa93c880e1f3f3 100644
--- a/app/views/shared/application/_header.html.erb
+++ b/app/views/shared/application/_header.html.erb
@@ -1,96 +1,112 @@
 <header>
-  <div id="barra-brasil" style="background:#7F7F7F; height: 20px; padding:0 0 0 10px;display:block;">
-    <ul id="menu-barra-temp" style="list-style:none;">
-      <li style="display:inline; float:left;padding-right:10px; margin-right:10px; border-right:1px solid #EDEDED">
-        <a href="http://brasil.gov.br" style="font-family:sans,sans-serif; text-decoration:none; color:white;">Portal do
-          Governo Brasileiro</a></li>
-      <li>
-        <a style="font-family:sans,sans-serif; text-decoration:none; color:white;" href="http://epwg.governoeletronico.gov.br/barra/atualize.html">Atualize
-          sua Barra de Governo</a></li>
-    </ul>
+  <div class="barra-brasil">
+    <div class="container">
+      <div id="barra-brasil">
+      	<ul id="menu-barra-temp" style="list-style:none;">
+      		<li style="display:inline; float:left;padding-right:10px; margin-right:10px; border-right:1px solid #EDEDED"><a href="http://brasil.gov.br" style="font-family:sans,sans-serif; text-decoration:none; color:white;">Portal do Governo Brasileiro</a></li>
+      		<li><a style="font-family:sans,sans-serif; text-decoration:none; color:white;" href="http://epwg.governoeletronico.gov.br/barra/atualize.html">Atualize sua Barra de Governo</a></li>
+      	</ul>
+      </div>
+    </div>
   </div>
-  <div class="searchbar">
+
+  <div class="search-bar">
     <div class="container">
       <div class="row">
-        <h1 class="col-xs-3">
+        <div class="col-md-3 logo-text">
           <%= link_to root_path do %>
-              Conteúdo<br>Educacional
+              CONTEÚDO<br>EDUCACIONAL
           <% end %>
-        </h1>
+        </div>
 
-        <h2 class="col-xs-4 col-xs-offset-5">
-          <%= image_tag 'fonte_mais.png', onclick: 'resizeText(1)', height: '30px' %>
-          <%= image_tag 'fonte_inicial.png', onclick: 'resizeText(0)', height: '30px' %>
-          <%= image_tag 'fonte_menos.png', onclick: 'resizeText(-1)', height: '30px' %>
-          <%= image_tag 'contraste.png', onclick: 'changeContrast()', height: '30px' %>
+        <div class="col-md-6">
+          <div class="search-accessibility">
+            <%= image_tag 'fonte_mais.png', onclick: 'resizeText(1)' %>&nbsp;&nbsp;
+            <%= image_tag 'fonte_inicial.png', onclick: 'resizeText(0)' %>&nbsp;&nbsp;
+            <%= image_tag 'fonte_menos.png', onclick: 'resizeText(-1)' %>&nbsp;&nbsp;
+            <%= image_tag 'contraste.png', onclick: 'changeContrast()' %>
+          </div>
+          <div class="search-input">
+            <form action="/search" method="get">
+              <div class="input-group" id="search">
+                <input type="text" placeholder="buscar" class="form-control" name="qry">
+                <div class="input-group-btn">
+                  <button class="btn btn-default" type="submit"><i class="glyphicon glyphicon-search"></i></button>
+                </div>
+              </div>
+            </form>
+            <%= link_to 'busca avançada', search_path, class: 'search-label' %>
+          </div>
+        </div>
 
+        <div class="col-md-3 status-text">
           <% if user_signed_in? %>
-              <%= link_to current_user.name, edit_user_registration_path %>
-               |
-              <%= link_to 'Sair', destroy_user_session_path, :method=>'delete' %>
+            <div class="media">
+              <div class="media-body">
+                <h4 class="media-heading"><%= link_to current_user.name.split(" ").first, edit_user_registration_path %></h4>
+                <%= link_to 'sair', destroy_user_session_path, method: 'delete', class: "quit-link" %>
+              </div>
+              <div class="media-right">
+                <a href="#">
+                  <img class="circular-image" src="<%= current_user.avatar.url(:thumb) %>" alt="Foto do usuário"/>
+                </a>
+              </div>
+            </div>
           <% else %>
-              <%= link_to 'Entrar', new_user_session_path %>
-               |
-              <%= link_to 'Cadastro', new_user_registration_path %>
-          <% end %>
-        </h2>
-      </div>
-      <div class="row">
-        <div class="col-md-8 col-md-offset-2">
-
-          <form action="/search" method="get">
-            <div class="input-group">
-              <input type="text" class="form-control" name="qry">
-              <div class="input-group-btn">
-                <button class="btn btn-default" type="submit"><i class="glyphicon glyphicon-search"></i></button>
+            <div class="media">
+              <div class="media-body">
+                <h4 class="media-heading"><%= link_to 'entre', new_user_session_path %></h4>
+                ou <%= link_to 'cadastre-se', new_user_registration_path, class: "register-link" %>
               </div>
             </div>
-          </form>
-          <%= link_to 'Busca avançada', '#', class: 'pull-right' %>
+          <% end %>
         </div>
       </div>
     </div>
   </div>
 
-
-<div class="container">
-  <div class="row">
-    <ul class="nav navbar-nav">
-      <li><%= link_to 'Principal' %></li>
-      <li><%= link_to 'Assunto' %></li>
-      <li class="dropdown">
-        <a class="dropdown-toggle" data-toggle="dropdown" href="javascript:void(0);">Níveis<span class="caret"></span></a>
-        <ul class="dropdown-menu">
-          <li>
-            <div class="row" style="width: 400px;">
-              <ul class="list-unstyled col-md-5 col-md-offset-1">
-                <li><b>Ensino Básico</b></li>
-                <li role="separator" class="divider"></li>
-                <li><a href="">1º Ano</a></li>
-                <li><a href="">2º Ano</a></li>
-                <li><a href="">3º Ano</a></li>
-                <li><a href="">4º Ano</a></li>
-                <li><a href="">5º Ano</a></li>
-                <li><a href="">6º Ano</a></li>
-                <li><a href="">7º Ano</a></li>
-                <li><a href="">8º Ano</a></li>
-                <li><a href="">9º Ano</a></li>
-              </ul>
-              <ul class="list-unstyled col-md-5">
-                <li><b>Ensino Médio</b></li>
-                <li role="separator" class="divider"></li>
-                <li><a href="">1º Ano</a></li>
-                <li><a href="">2º Ano</a></li>
-                <li><a href="">3º Ano</a></li>
-              </ul>
-            </div>
+  <nav class="navigation" id="menu-bar">
+    <div class="container">
+      <div class="row">
+        <ul class="nav navbar-nav">
+          <li class="nav-button nav-button-first"><%= link_to 'Assuntos' %></li>
+          <li role="separator" class="divider"></li>
+          <li class="dropdown nav-button">
+            <a class="dropdown-toggle" data-toggle="dropdown" href="javascript:void(0);">Níveis de Ensino&nbsp;<span class="caret" /></a>
+            <ul class="dropdown-menu">
+              <li>
+                <div class="row" style="width: 400px;">
+                  <ul class="list-unstyled col-md-6 col-md-offset-1">
+                    <li><b>Ensino Fundamental</b></li>
+                    <li role="separator" class="divider"></li>
+                    <li><a href="">1º Ano</a></li>
+                    <li><a href="">2º Ano</a></li>
+                    <li><a href="">3º Ano</a></li>
+                    <li><a href="">4º Ano</a></li>
+                    <li><a href="">5º Ano</a></li>
+                    <li><a href="">6º Ano</a></li>
+                    <li><a href="">7º Ano</a></li>
+                    <li><a href="">8º Ano</a></li>
+                    <li><a href="">9º Ano</a></li>
+                  </ul>
+                  <ul class="list-unstyled col-md-5">
+                    <li><b>Ensino Médio</b></li>
+                    <li role="separator" class="divider"></li>
+                    <li><a href="">1º Ano</a></li>
+                    <li><a href="">2º Ano</a></li>
+                    <li><a href="">3º Ano</a></li>
+                  </ul>
+                </div>
+              </li>
+            </ul>
           </li>
+          <li role="separator" class="divider"></li>
+          <li class="nav-button"><%= link_to 'FAQ', faq_path %></li>
+          <li role="separator" class="divider"></li>
+          <li class="nav-button"><%= link_to 'Contato', contact_path %></li>
+          <li role="separator" class="divider"></li>
         </ul>
-      </li>
-      <li><%= link_to 'Formato' %></li>
-      <li><%= link_to 'FAQ', faq_path %></li>
-      <li><%= link_to 'Contato', contact_path %></li>
-    </ul>
-  </div>
-</div>
+      </div>
+    </div>
+  </nav>
 </header>
diff --git a/app/views/shared/application/_object_tag1.html.erb b/app/views/shared/application/_object_single.html.erb
similarity index 92%
rename from app/views/shared/application/_object_tag1.html.erb
rename to app/views/shared/application/_object_single.html.erb
index b4682be790666c94381f7a4b85b49b88330bcc7b..27de179726caf4aa86256bd361cadf7f76e49fc9 100644
--- a/app/views/shared/application/_object_tag1.html.erb
+++ b/app/views/shared/application/_object_single.html.erb
@@ -18,7 +18,7 @@
             <% end %>
           </div>
           <div class="col-sm-12">
-            <div align="right"><a href="objeto.php" class="btn btn-primary">Ver mais...</a></div>
+            <div align="right"><%= link_to "Ver mais...", learning_object_path(obj["search.resourceid"]), :class => "btn btn-primary" %></div>
           <br/>
           <table class="table ">
             <tr>
diff --git a/app/views/shared/application/_object_tag.html.erb b/app/views/shared/application/_object_tag.html.erb
index 21783cf9ad5c5ba839cef297ea25995b660233ee..c117569976df7ec75f87225f39877e2f6252d65c 100644
--- a/app/views/shared/application/_object_tag.html.erb
+++ b/app/views/shared/application/_object_tag.html.erb
@@ -1,23 +1,44 @@
-<div class="col-md-12">
-  <div class="itemhorz">
-  	<div class="col-md-5">
-      <%= link_to image_tag("logo.png", :class => "img-responsive"), :class => "thumbnail" %>
+<!--<%=debug obj%>-->
+
+<div class="row">
+      <div class="col-sm-3">
+        <a href="app/assets/images/logo.png" class="thumbnail">
+          <p><%= obj.name %></p>
+        <!--  <%= link_to image_tag("logo.png", :class => "img-responsive"), :class => "thumbnail" %><img src="app/assets/images/logo.png" alt="" width="284" height="213">-->
+        <%= image_tag("logo.png") %>
+        </a>
+      </div>
+      <div class="col-sm-9">
+          <div class="col-sm-12">
+            <%= obj.description %>
+          </div>
+          <div class="col-sm-12">
+            <div align="right"><%= link_to "Ver mais...", learning_object_path(obj.id_dspace), :class => "btn btn-primary" %></div>
+          <br/>
+          <table class="table ">
+            <tr>
+              <td class="stars">Avaliações:</td><td>Postado por:</td><td class="visualis">Visualizações:</td>
+            </tr>
+            <tr>
+              <td>
+              <span class="starRating">
+                <input id="rating5" type="radio" name="rating" value="5" disabled>
+                <label for="rating5">5</label>
+                <input id="rating4" type="radio" name="rating" value="4" checked disabled>
+                <label for="rating4">4</label>
+                <input id="rating3" type="radio" name="rating" value="3" disabled>
+                <label for="rating3">3</label>
+                <input id="rating2" type="radio" name="rating" value="2" disabled>
+                <label for="rating2">2</label>
+                <input id="rating1" type="radio" name="rating" value="1" disabled>
+                <label for="rating1">1</label>
+              </span>
+              ()
+            </td>
+            <td><%= link_to "<<Autor>>" %> Há ... anos</td>
+            <td><%= obj.views %></td>
+          </tr>
+        </table>
+      </div>
+      </div>
     </div>
-  	<div class="col-md-7">
-  		<h1><%= link_to obj["title"][0], learning_object_path(obj["search.resourceid"]) %></h1>
-      <%= image_tag object_thumbnail(obj["handle"]), :class => "img-circle", :width => "32" %> por <%= link_to obj["author"][0] %>
-<%
-=begin
-%>
-      <p class="pull-right"><span class="glyphicon glyphicon-search" aria-hidden="true"></span>4,5
-  			<span class="glyphicon glyphicon-star" aria-hidden="true"></span>200
-  		</p>
-<%
-=end
-%>
-      <% unless obj["dc.description"].nil? %>
-        <p><%= obj["dc.description"][0] %></p>
-      <% end %>
-  	</div>
-  </div>
-</div>
diff --git a/app/views/shared/application/_object_vertical.html.erb b/app/views/shared/application/_object_vertical.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..8a4b66c025827a3d651e3e28869f32d58b3341b7
--- /dev/null
+++ b/app/views/shared/application/_object_vertical.html.erb
@@ -0,0 +1,17 @@
+<div class="object-vertical">
+  <div class="panel">
+    <div>
+      <img src="http://dummyimage.com/250x150/363336/fff" alt='dummy image' class="img-responsive">
+    </div>
+    <div class="panel-body">
+      <% if object.name.nil? %>
+        <h4 class="media-heading">Sem Título</h4>
+      <% else %>
+        <h4 class="media-heading"><%= object.name %></h4>
+      <% end %>
+      <span class="glyphicon glyphicon-eye-open">200&nbsp;</span>
+      <span class="glyphicon glyphicon-star">4,5&nbsp;</span>
+      <span>Por <a>Usuário&nbsp;</a></span>
+    </div>
+  </div>
+</div>
diff --git a/app/views/welcome/complaint.html.erb b/app/views/welcome/complaint.html.erb
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/app/views/welcome/index.html.erb b/app/views/welcome/index.html.erb
index 287dfa9f657ce4ff0541cc4add6ce32fd3fa0bc2..7275f6c893bc8910c135648718c276c2d379aeef 100644
--- a/app/views/welcome/index.html.erb
+++ b/app/views/welcome/index.html.erb
@@ -1,109 +1,83 @@
-<div class="main container-fluid">
-  <div class="row">
-    <div class="col-sm-offset-1 col-md-7">
-      <div class="row">
-        <% if @Carousel.present? %>
-          <div id="myCarousel" class="carousel slide" data-ride="carousel">
-            <!-- Indicators -->
-            <ol class="carousel-indicators">
-              <% i = 0 %>
-              <% @Carousel.each do |highlight| %>
-                <% if highlight == @Carousel.first %>
-                  <li data-target="#myCarousel" data-slide-to="<%= i %>" class="active"></li>
-                <% else %>
-                  <li data-target="#myCarousel" data-slide-to="<%= i %>"></li>
-                <% end %>
-                <% i+= 1 %>
+<div class="row">
+  <div class="col-md-7">
+    <div class="row">
+      <% if @Carousel.present? %>
+        <div id="myCarousel" class="carousel slide" data-ride="carousel">
+          <!-- Indicators -->
+          <ol class="carousel-indicators">
+            <% i = 0 %>
+            <% @Carousel.each do |highlight| %>
+              <% if highlight == @Carousel.first %>
+                <li data-target="#myCarousel" data-slide-to="<%= i %>" class="active"></li>
+              <% else %>
+                <li data-target="#myCarousel" data-slide-to="<%= i %>"></li>
               <% end %>
-            </ol>
-            <div class="carousel-inner" role="listbox">
-              <% @Carousel.each do |highlight|%>
-                <% if highlight == @Carousel.first %>
-                  <% highlight_class="item active" %>
-                <% else %>
-                  <% highlight_class="item" %>
-                <% end %>
-              <div class="<%= highlight_class %>">
-                <%= image_tag 'mecshow_logo.jpg'%>
-                <div class="container">
-                  <div class="carousel-caption">
-                    <h1><%= highlight['title'] %></h1>
-                    <p id="carrousel-new-description"><%= highlight['description'] %> </p>
-                    <p><a class="btn btn-lg btn-primary" href=<%= highlight['URL'] %> role="button">Mais informações</a></p>
-                  </div>
-                </div>
-              </div>
+              <% i+= 1 %>
+            <% end %>
+          </ol>
+          <div class="carousel-inner" role="listbox">
+            <% @Carousel.each do |highlight|%>
+              <% if highlight == @Carousel.first %>
+                <% highlight_class="item active" %>
+              <% else %>
+                <% highlight_class="item" %>
               <% end %>
-              <a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev">
-                <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
-                <span class="sr-only">Previous</span>
-              </a>
-              <a class="right carousel-control" href="#myCarousel" role="button" data-slide="next">
-                <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
-                <span class="sr-only">Next</span>
-              </a>
-            </div>
-          </div>
-        <% end %>
-      </div>
-      <div class="row">
-        <% if @General.present? %>
-        <ul class="list-unstyled">
-          <h2>Destaques</h2>
-            <% @General.each do |highlight| %>
-            <li class="col-sm-12 general_highlights">
-              <div class="media">
-                <div class="media-left media-middle">
-                  <a href="#">
-                    <img src="http://dummyimage.com/250x150/363336/fff" alt='dummy image'>
-                  </a>
-                </div>
-                <div class="media-body">
-                  <h4 class="media-heading"><%= highlight['name'] %></h4>
-                  <span>Por <a>Usuário&nbsp</a></span>
-                  <span class="glyphicon glyphicon-eye-open"><%= highlight['views'] %>&nbsp </span>
-                  <span class="glyphicon glyphicon-star"><%= highlight['likes'] %>&nbsp</span><br>
-                  <b>Descrição:</b> Descrição do objeto em destaque.Descrição do objeto em destaque.Descrição do objeto em destaque.Descrição do objeto em destaque.Descrição do objeto em destaque.<br>
-                  Em<b> Biologia</b>, <b>Biologia Marinha</b>
+            <div class="<%= highlight_class %>">
+              <%= image_tag 'mecshow_logo.jpg'%>
+              <div class="container">
+                <div class="carousel-caption">
+                  <h1><%= highlight['title'] %></h1>
+                  <p id="carrousel-new-description"><%= highlight['description'] %> </p>
+                  <p><a class="btn btn-lg btn-primary" href=<%= highlight['URL'] %> role="button">Mais informações</a></p>
                 </div>
               </div>
-            </li>
+            </div>
             <% end %>
-          <% end %>
-        </ul>
-      </div>
+            <a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev">
+              <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
+              <span class="sr-only">Previous</span>
+            </a>
+            <a class="right carousel-control" href="#myCarousel" role="button" data-slide="next">
+              <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
+              <span class="sr-only">Next</span>
+            </a>
+          </div>
+        </div>
+      <% end %>
     </div>
-    <div class="col-md-3 hidden-xs hidden-sm">
-      <img src="http://dummyimage.com/350x500/363336/fff" alt='dummy image'>
+    <div class="row">
+      <% if @General.present? %>
+      <ul class="list-unstyled">
+        <h2>Destaques</h2>
+          <% @General.each do |object| %>
+            <%= render 'shared/application/object_horizontal', object: object  %>
+          <% end %>
+        <% end %>
+      </ul>
     </div>
   </div>
+  <div class="col-md-3 col-md-offset-1 hidden-xs hidden-sm">
+    <img src="http://dummyimage.com/350x500/363336/fff" style="margin-top: 30px;" alt='dummy image'>
+  </div>
+</div>
 
-  <div class="row">
-    <div class="col-md-11 col-sm-offset-1 padding-left-0">
-      <h2>Em Destaque</h2>
-        <ul class="list-unstyled">
-          <% 8.times do %>
-          <li class="col-sm-3 padding-left-0">
-            <div class="media">
-              <h4>Matemática</h4>
-              <div>
-                <a href="#">
-                  <img src="http://dummyimage.com/250x150/363336/fff" alt='dummy image' class="img-responsive">
-                </a>
-              </div>
-              <div class="media-body">
-                <h4 class="media-heading">Nome</h4>
-                <span>Por <a>Usuário&nbsp</a></span>
-                <span class="glyphicon glyphicon-eye-open">200&nbsp </span>
-                <span class="glyphicon glyphicon-star">4,5&nbsp</span>
-                <p align='center'>
-                  <a>Ver Mais</a>
-                </p>
-              </div>
-            </div>
-          </li>
-          <% end %>
-        </ul>
-    </div>
+<div class="row">
+  <div class="col-md-12">
+    <% unless @Subjects.nil? || @Subjects.empty?%>
+      <div class="row">
+        <h2>Em Destaque</h2>
+        <% @Subjects.each do |subject|%>
+          <div class="col-sm-4">
+          <div class="row">
+            <h4><b><%= subject["name"] %></b></h4>
+            <%= render 'shared/application/object_vertical', object: subject["first_highlight"]  %>
+            <p>
+              <a href="#">Ver Mais</a>
+            </p>
+          </div>
+          </div>
+        <% end %>
+      </div>
+    <% end %>
   </div>
 </div>
diff --git a/config/env_vars.sh b/config/env_vars.sh
new file mode 100644
index 0000000000000000000000000000000000000000..c1e77805c3138977de2e866cfca05bb7e6c45294
--- /dev/null
+++ b/config/env_vars.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+export SECRET_TOKEN=$(rake secret)
+export SECRET_KEY_BASE=$(rake secret)
+
+### Postgres/Active Record credentials
+export PORTALMEC_DB_NAME=portalmec
+export PORTALMEC_DB_USERNAME=
+export PORTALMEC_DB_PASSWORD=
+
+### OrientDB credentials
+export PORTALMEC_ORIENTDB_HOST=localhost
+export PORTALMEC_ORIENTDB_DATABASE=portalmec
+export PORTALMEC_ORIENTDB_USERNAME=
+export PORTALMEC_ORIENTDB_PASSWD=
+export PORTALMEC_ORIENTDB_PORT=2480
+
+### Dspace credentials
+export PORTALMEC_DSPACE_SOLR=
+export PORTALMEC_DSPACE_REST=
+export PORTALMEC_DSPACE_PORT=
+export PORTALMEC_DSPACE_HOST=
+
+### Rails environment
+export RAILS_SERVE_STATIC_FILES=FALSE
+export RAILS_ENV=production
diff --git a/config/environments/development.rb b/config/environments/development.rb
index 5fafdd184b3f3b5e96ff55a3a0fabc29f87942b3..eb3772c3a0867beabd00a672cf5c425b64731fa7 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -1,6 +1,18 @@
 Rails.application.configure do
   # Settings specified here will take precedence over those in config/application.rb.
 
+  ## Bullet gem config
+  config.after_initialize do
+    Bullet.enable = true
+    Bullet.alert = true
+    Bullet.bullet_logger = true
+    Bullet.console = true
+    Bullet.rails_logger = true
+    Bullet.add_footer = true
+    #Bullet.stacktrace_includes = [ 'your_gem', 'your_middleware' ]
+    #Bullet.slack = { webhook_url: 'http://some.slack.url', foo: 'bar' }
+  end
+
   # In the development environment your application's code is reloaded on
   # every request. This slows down response time but is perfect for development
   # since you don't have to restart the web server when you make code changes.
diff --git a/config/initializers/repositories/repositories.rb b/config/initializers/repositories/repositories.rb
index 9687a7da02c96402528cdf8e9ab3a75c550d1eda..bc014e7c0215152ef0799b463f60a7531a847f6c 100644
--- a/config/initializers/repositories/repositories.rb
+++ b/config/initializers/repositories/repositories.rb
@@ -24,28 +24,29 @@ Repository::Environments.create :development do |repository|
   repository.register :mainPage, OrientDb::MainPageRepository.new(OrientDb::Client.instance)
   repository.register :webLink, OrientDb::WeblinkRepository.new(OrientDb::Client.instance)
   repository.register :user, UserRepositoryProxy.new(OrientDb::UserRepository.new(OrientDb::Client.instance))
-  repository.register :carousel, OrientDb::CarouselRepository.new(OrientDb::Client.instance)
+  repository.register :subject, OrientDb::SubjectRepository.new(OrientDb::Client.instance)
   repository.register :institution, OrientDb::InstitutionRepository.new(OrientDb::Client.instance)
   repository.register :subject, OrientDb::SubjectRepository.new(OrientDb::Client.instance)
   repository.register :attribute, OrientDb::AttributeRepository.new(OrientDb::Client.instance)
+  repository.register :collection, OrientDb::CollectionRepository.new(OrientDb::Client.instance)
 end
 
 Repository::Environments.create :test do |repository|
   repository.register :learning_object, OrientDb::LearningObjectRepository.new(OrientDb::Client.instance)
   repository.register :mainPage, OrientDb::MainPageRepository.new(OrientDb::Client.instance)
   repository.register :webLink, OrientDb::WeblinkRepository.new(OrientDb::Client.instance)
-  repository.register :carousel, OrientDb::CarouselRepository.new(OrientDb::Client.instance)
   repository.register :user, UserRepositoryProxy.new(OrientDb::UserRepository.new(OrientDb::Client.instance))
   repository.register :subject, OrientDb::SubjectRepository.new(OrientDb::Client.instance)
   repository.register :attribute, OrientDb::AttributeRepository.new(OrientDb::Client.instance)
+  repository.register :collection, OrientDb::CollectionRepository.new(OrientDb::Client.instance)
 end
 
 Repository::Environments.create :production do |repository|
   repository.register :learning_object, OrientDb::LearningObjectRepository.new(OrientDb::Client.instance)
   repository.register :mainPage, OrientDb::MainPageRepository.new(OrientDb::Client.instance)
   repository.register :webLink, OrientDb::WeblinkRepository.new(OrientDb::Client.instance)
-  repository.register :carousel, OrientDb::CarouselRepository.new(OrientDb::Client.instance)
   repository.register :user, UserRepositoryProxy.new(OrientDb::UserRepository.new(OrientDb::Client.instance))
   repository.register :subject, OrientDb::SubjectRepository.new(OrientDb::Client.instance)
   repository.register :attribute, OrientDb::AttributeRepository.new(OrientDb::Client.instance)
+  repository.register :collection, OrientDb::CollectionRepository.new(OrientDb::Client.instance)
 end
diff --git a/config/initializers/task_scheduler.rb b/config/initializers/task_scheduler.rb
deleted file mode 100644
index 58dab127e0d016d74fb860b6d1c1709a27df9766..0000000000000000000000000000000000000000
--- a/config/initializers/task_scheduler.rb
+++ /dev/null
@@ -1,4 +0,0 @@
-scheduler = Rufus::Scheduler.new
-scheduler.every '10m' do
-    system('rake mainPage:highlights')
- end
diff --git a/config/orientdb.yml b/config/orientdb.yml
index b87506bb88309668349e5f619dea1863652c67b6..07945002eacbdb755ce3058bf6ff217959fc76e8 100644
--- a/config/orientdb.yml
+++ b/config/orientdb.yml
@@ -6,8 +6,8 @@ development: &development
   port: 2480
 
 test:
-  host: mecdb2.c3sl.ufpr.br
-  database: dev-mauricio
+  host: mecdb1.c3sl.ufpr.br
+  database: PortalMEC
   username: admin
   password: admin
   port: 2480
diff --git a/config/routes.rb b/config/routes.rb
index c7805c77c64fd952cf8694e3700238569c9b0de4..a2c3ef04c74df29172b3fd5b7b4f8b879227b3c9 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -22,13 +22,14 @@ Rails.application.routes.draw do
   root 'welcome#index'
 
   resources :learning_objects
+  post '/learning_objects/:id/like' => 'learning_objects#like', as: 'like_learning_object'
 
   resources :institutions
-
+  resources :collections
 
 
   get '/faq' => 'welcome#faq'
   get '/contact' => 'welcome#contact', as: 'contact'
   get '/complaint' => 'welcome#complaint', as: 'complaint'
-  get '/search' => 'search/solr#search', as: 'search'
+  get '/search' => 'search#index', as: 'search'
 end
diff --git a/config/schedule.rb b/config/schedule.rb
new file mode 100644
index 0000000000000000000000000000000000000000..a56f2cde9352830e293753c922ada6b3766b290f
--- /dev/null
+++ b/config/schedule.rb
@@ -0,0 +1,24 @@
+# Use this file to easily define all of your cron jobs.
+#
+# It's helpful, but not entirely necessary to understand cron before proceeding.
+# http://en.wikipedia.org/wiki/Cron
+
+# Example:
+#
+# set :output, "/path/to/my/cron_log.log"
+#
+# every 2.hours do
+#   command "/usr/bin/some_great_command"
+#   runner "MyModel.some_method"
+#   rake "some:great:rake:task"
+# end
+#
+# every 4.days do
+#   runner "AnotherModel.prune_old_records"
+# end
+
+# Learn more: http://github.com/javan/whenever
+
+every 5.minutes do
+  rake 'mainPage:highlights'
+end
diff --git a/db/migrate/20150918134417_add_rid_column_to_users.rb b/db/migrate/20150918134417_add_rid_column_to_users.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b31a51e799c6f0a54fe2aaa7e8680606f670e7d4
--- /dev/null
+++ b/db/migrate/20150918134417_add_rid_column_to_users.rb
@@ -0,0 +1,5 @@
+class AddRidColumnToUsers < ActiveRecord::Migration
+  def change
+    add_column :users, :rid, :string
+  end
+end
diff --git a/db/migrate/20150921132848_add_attachment_avatar_to_users.rb b/db/migrate/20150921132848_add_attachment_avatar_to_users.rb
new file mode 100644
index 0000000000000000000000000000000000000000..1d87ba81ad4a303b20ad6e6fdc95c910aa43edb7
--- /dev/null
+++ b/db/migrate/20150921132848_add_attachment_avatar_to_users.rb
@@ -0,0 +1,11 @@
+class AddAttachmentAvatarToUsers < ActiveRecord::Migration
+  def self.up
+    change_table :users do |t|
+      t.attachment :avatar
+    end
+  end
+
+  def self.down
+    remove_attachment :users, :avatar
+  end
+end
diff --git a/lib/orient_db/methods/edge_methods.rb b/lib/orient_db/methods/edge_methods.rb
index 60c5c416efb45b55957a3e21f5b82a0ce0399222..0e5c8c448fe1059c3b09917ae569dd2c3d340731 100644
--- a/lib/orient_db/methods/edge_methods.rb
+++ b/lib/orient_db/methods/edge_methods.rb
@@ -2,16 +2,19 @@ module OrientDb
   module Methods
     module EdgeMethods
 
+      ##
+      # Count the number of edges existent
       def get_in_edges_count(edge_class, id)
-        connection.query sprintf("SELECT COUNT(@rid) FROM %s WHERE in = %d", edge_class, id)
+        result = connection.query "SELECT in('#{edge_class}').size() AS COUNT FROM #{id}"
+        result.first["COUNT"].to_i
       end
 
       def create_edge(edge_class, from_id, to_id)
-        connection.command sprintf("CREATE EDGE %s FROM %s TO %s", edge_class, from_id, to_id)
+        connection.command "CREATE EDGE #{edge_class} FROM #{from_id} TO #{to_id}"
       end
 
       def get_edges_end(edge_class, type, vertex_id)
-        connection.query sprintf("SELECT expand(%s('%s')) FROM ", type, edge_class, vertex_id)
+        connection.query sprintf("SELECT expand(%s('%s')) FROM %s", type, edge_class, vertex_id)
       end
 
       def edge_exists?(edge_class, from_id, to_id)
@@ -21,4 +24,4 @@ module OrientDb
 
     end
   end
-end
\ No newline at end of file
+end
diff --git a/lib/repository/not_persisted_record_error.rb b/lib/repository/not_persisted_record_error.rb
new file mode 100644
index 0000000000000000000000000000000000000000..c06010f8e60869a0922a6240df1aa2f13ec8c213
--- /dev/null
+++ b/lib/repository/not_persisted_record_error.rb
@@ -0,0 +1,2 @@
+class NotPersistedRecordError < StandardError
+end
\ No newline at end of file
diff --git a/lib/search_engine/dspace_solr.rb b/lib/search_engine/dspace_solr.rb
new file mode 100644
index 0000000000000000000000000000000000000000..4ddc03ced7b015e260e28a8c581415017df37bab
--- /dev/null
+++ b/lib/search_engine/dspace_solr.rb
@@ -0,0 +1,64 @@
+module SearchEngine
+  module DspaceSolr
+
+    def search(qry)
+
+      queryParams = merge_search_parameters(
+                      {:q => '*:*', :fq => qry},
+                      solr_search_default_parameters
+                    )
+      results = solr_client.get 'select', :params => queryParams
+      objectsFound = select_items_from_results(results)
+
+      return objectsFound
+    end
+
+    private
+
+    #Resource types:
+    # 2 = Item
+    # 3 = Collection
+    # 4 = Community
+    def select_items_from_results(results)
+      resultList = Set.new
+      results["response"]["docs"].select { |r|
+        r["search.resourcetype"].to_i.equal? 2
+      }.each do |i|
+        resultList.add i
+      end
+      return resultList
+    end
+
+    def solr_client
+      return RSolr.connect :url => 'http://portalmecdev.c3sl.ufpr.br:8080/solr/search/'
+    end
+
+    def merge_search_parameters(p1, p2)
+      return p1.merge(p2) { |key,oldval,newval| key = [newval,oldval].flatten }
+    end
+
+    def solr_search_default_parameters
+      return {
+          "fl"=>["
+          search.resourcetype, search.resourceid,
+          handle, author, title, dc.description
+        "],
+          "type"=>"0",
+          "start"=>"0",
+          "rows"=>"1000",
+          "facet"=>"true",
+          "facet.offset"=>"0",
+          "facet.mincount"=>"1",
+          "f.subject_tax_0_filter.facet.sort"=>"count",
+          "f.subject_tax_0_filter.facet.limit"=>"11",
+          "f.author_filter.facet.limit"=>"11",
+          "f.dateIssued.year.facet.sort"=>"index",
+          "f.dateIssued.year.facet.limit"=>"10",
+          "f.author_filter.facet.sort"=>"count",
+          "facet.field"=>["author_filter","subject_tax_0_filter","dateIssued.year"],
+          "fq"=>["NOT(withdrawn:true)","NOT(discoverable:false)","read:(g0 OR g0)"]
+      }
+    end
+
+  end
+end
diff --git a/lib/search_engine/orientdb_lucene.rb b/lib/search_engine/orientdb_lucene.rb
new file mode 100644
index 0000000000000000000000000000000000000000..565a04963787ea9c8628e0aed87a490dd1256f42
--- /dev/null
+++ b/lib/search_engine/orientdb_lucene.rb
@@ -0,0 +1,15 @@
+module SearchEngine
+  module OrientdbLucene
+
+    def search(qry)
+      learning_object_repository.search(qry)
+    end
+
+    private
+
+    def learning_object_repository
+      repository.for(:learning_object)
+    end
+
+  end
+end
diff --git a/lib/tasks/mainPage.rake b/lib/tasks/mainPage.rake
index c4b7bab948e06fc012bb577d140f5fdf8f59bb50..69f84cb36e8a8dace047d8321cbfec20366bcf3b 100644
--- a/lib/tasks/mainPage.rake
+++ b/lib/tasks/mainPage.rake
@@ -2,26 +2,35 @@ namespace :mainPage do
   desc "Generate the MainPage"
   task :highlights => :environment do
     repository = Portalmec::Application.repository
+    puts 'Generate the main page subject highlights'
+    general_highlights = Array.new
+    subjects = repository.for(:subject).find_all
+    subjects.each do |subject|
+      # select all the learning objects about that subject
+      objects = subject.learning_objects
+      # transform the objects to RankingItem
+      objects = objects.collect do |object|
+        Ranking::Item.new(object.id,object.views,object.downloads,object.likes)
+      end
+      # rank them
+      rater = Ranking::Rater.new(Ranking::Strategies::BasicRater.new(0,1,100))
+      objects = rater.sortByRate(objects)
+      # select the five first objects to the general highlight
+      (general_highlights << objects.take(5)).flatten!
 
-    puts 'Generating the main page highlights'
-    objects = repository.for(:learningObjet).find_all
-    objects = objects.collect do |object|
-      likes = repository.for(:learningObjet).get_likes(object['@rid']).size()
-      views = repository.for(:learningObjet).get_views(object['@rid']).size()
-      downloads = repository.for(:learningObjet).get_downloads(object['@rid']).size()
-      Ranking::Item.new(object['@rid'],views,downloads,likes)
+      # add the object to the subject highlight
+      puts subject.name
+      repository.for(:subject).update(subject.id,'set','highlights','[]')
+      objects.each do |object|
+        repository.for(:subject).update(subject.id,'add','highlights',object.name)
+      end
     end
-    rater = Ranking::Rater.new(Ranking::Strategies::BasicRater.new(1000,1,100))
-    objects = rater.sortByRate(objects).take(5)
-
-    mainPage = repository.for(:mainPage).find_all[0]
+    puts 'Generating the main page highlights'
+    mainPage = repository.for(:mainPage).find_all.first
     rid = mainPage['@rid']
     repository.for(:mainPage).update(rid,'set','highlights','[]')
-    objects.each do |object|
-      repository.for(:mainPage).update(rid,'add','highlights',object.name)
+    general_highlights.each do |general_highlight|
+      repository.for(:mainPage).update(rid,'add','highlights',general_highlight.name)
     end
-
-    puts 'Generate the main page subject highlights'
-    # TODO: generate
   end
 end
diff --git a/lib/tasks/orientdb.rake b/lib/tasks/orientdb.rake
index bebd52ddaf94d9de577cb6f5aa0d845451130c28..3568b65a4c4833f8a5555ec49943557811480bc1 100644
--- a/lib/tasks/orientdb.rake
+++ b/lib/tasks/orientdb.rake
@@ -25,7 +25,7 @@ namespace :orientdb do
 
       begin
         # Get LearningObjects from OrientDB (from offset to offset+limit)
-        learning_objects = lo_repo.all(limit,offset)
+        learning_objects = lo_repo.find_all_from_offset_to_limit(offset,limit)
       rescue
         # Sleeps for a while to wait database's recovery
         sleep(30.seconds)
diff --git a/test/models/learning_object_test.rb b/test/models/learning_object_test.rb
index c37c3d8078e4090bc576e56276b62549e38caa4e..10d349407170226579f52f7a5395e55c37b82958 100644
--- a/test/models/learning_object_test.rb
+++ b/test/models/learning_object_test.rb
@@ -1,7 +1,14 @@
 require 'test_helper'
 
 class LearningObjectTest < ActiveSupport::TestCase
-  # test "the truth" do
-  #   assert true
-  # end
+  should validate_presence_of(:name)
+  should validate_presence_of(:date_creation)
+  should validate_presence_of(:type)
+  should validate_presence_of(:likes)
+  should validate_presence_of(:views)
+  should validate_presence_of(:downloads)
+
+  should validate_numericality_of(:likes).is_greater_than_or_equal_to(0)
+  should validate_numericality_of(:views).is_greater_than_or_equal_to(0)
+  should validate_numericality_of(:downloads).is_greater_than_or_equal_to(0)
 end
diff --git a/test/models/role_test.rb b/test/models/role_test.rb
index 400bdfd312509486ade76489b3d4cb3b550234b0..3dcc8c74c46dbbd5306673f1d4890613bf13de41 100644
--- a/test/models/role_test.rb
+++ b/test/models/role_test.rb
@@ -2,4 +2,6 @@ require 'test_helper'
 
 class RoleTest < ActiveSupport::TestCase
   should have_and_belong_to_many(:users)
+  should validate_uniqueness_of(:name)
+  should validate_presence_of(:name)
 end
diff --git a/test/models/user_test.rb b/test/models/user_test.rb
index 3badf9c73309065222b240f94fcf03f2d6d8f660..9785f4725b0f5d55719efb3f8a309180b72ea17f 100644
--- a/test/models/user_test.rb
+++ b/test/models/user_test.rb
@@ -2,4 +2,5 @@ require 'test_helper'
 
 class UserTest < ActiveSupport::TestCase
   should have_and_belong_to_many(:roles)
+  should validate_uniqueness_of(:email)
 end
diff --git a/test/repositories/orient_db/user_repository_test.rb b/test/repositories/orient_db/user_repository_test.rb
new file mode 100644
index 0000000000000000000000000000000000000000..407a377680a9274b006746bab9eb2bea9fad7835
--- /dev/null
+++ b/test/repositories/orient_db/user_repository_test.rb
@@ -0,0 +1,4 @@
+require 'test_helper'
+
+class OrientDb::UserRepositoryTest < ActiveSupport::TestCase
+end
\ No newline at end of file
diff --git a/test/repositories/user_repository_proxy_test.rb b/test/repositories/user_repository_proxy_test.rb
new file mode 100644
index 0000000000000000000000000000000000000000..0e5ff57c50121f583a9754c87d4bfec2596c8510
--- /dev/null
+++ b/test/repositories/user_repository_proxy_test.rb
@@ -0,0 +1,17 @@
+require 'test_helper'
+
+class UserRepositoryProxyTest < ActiveSupport::TestCase
+
+  test 'raise an exception when create graph node with not persisted user' do
+    user = User.new
+    odb_user_repository = mock
+    repository = UserRepositoryProxy.new odb_user_repository
+
+    assert_raise ::NotPersistedRecordError do
+      repository.create_graph_node user
+    end
+
+    assert odb_user_repository.verify
+  end
+
+end
\ No newline at end of file
diff --git a/test/test_helper.rb b/test/test_helper.rb
index d6714a96688d5b3a27a8bfc586d8c3772bd5f42d..5fc65a3cd70441ae3c44dd358d63f31b4f323821 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -2,6 +2,8 @@ ENV['RAILS_ENV'] ||= 'test'
 require File.expand_path('../../config/environment', __FILE__)
 require 'rails/test_help'
 require 'shoulda-callback-matchers'
+require 'minitest/mock'
+require 'repository/not_persisted_record_error'
 
 class ActiveSupport::TestCase
   # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
@@ -13,4 +15,8 @@ class ActiveSupport::TestCase
     assert_equal expected.to_i, actual.count
   end
 
+  def mock
+    MiniTest::Mock.new
+  end
+
 end